协程函数

Posted 森森2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了协程函数相关的知识,希望对你有一定的参考价值。

# yield把函数变成迭代器
# return的返回值只返回一次,yield返回多次
# 函数在暂停以及继续下一次运行时的状态是有yield保存
# 协程函数

# def eater(name):
# print(‘%s start to eat food‘ %name)
# while True:
# food=yield
# print(‘%s get %s, to start eat‘ %(name,food))
#
# print("done")
#
# e=eater(‘钢蛋‘)
# # print(e)
#
# next(e)
# e.send("包子")
# e.send("饭")

# print(next(e))

# 用列表
# def eater(name):
# print(‘%s start to eat food‘ %name)
# food_list=[]
# while True:
# food=yield food_list
# print(‘%s get %s, to start eat‘ %(name,food))
# food_list.append(food)
#
# print("done")
#
# e=eater(‘钢蛋‘)
# print(next(e))
# print(e.send("包子"))
# print(e.send("饭"))

# 课迭代的:对象下有__iter__方法的都是可迭代的对象
# 迭代器:对象.__iter__()得到的结果就是迭代器
# 迭代器的特性:
# 迭代器.__next__()取下一个值
# 优点:
# 1、提供了一种统一的迭代对象的方式,不依赖于索引
# 2、惰性计算

# 缺点:
# 1、无法获取迭代器的长度
# 2、一次性的,只能往后取值,不能往前退,不能像索引那样取某个位置的值

# 生成器:函数内带有yield,那么这个函数的执行结果就是生成器
# 生成器本质就是迭代器
# def func():
# n=0
# while n<5:
# yield n
# n+=1
# g=func()
# print(next(g))
# print(next(g))
#
# for i in g:
# print(i)

# 总结yield的功能:
# 1、相当于把__iter__和__next__方法封装到函数内部
# 2、与return比,return只能返回一次,而yield能返回多次
# 3、函数暂停已经继续运行的状态是通过yield保存的

# yield的表达式形式:
# food=yield


# def eater(name):
# print(‘%s start to eat‘ %name)
# food_list=[]
# while True:
# food=yield food_list
# print(‘%s eat %s‘ %(name,food))
# food_list.append(food)
#
# def aa
# e=eater(‘zhejiangF4‘)
# print(next(e))
# e.send("大便")

# e.send与next(e)的区别
# 1、如果函数内yield是表达式形式,那么必须先next(e)
# 2、二者的共同之处可以让函数在上次暂停的位置,继续运行,不一样的地方在于send在触发
# 下一次代码的执行时,会顺便给yield传一个值

# 我想不用加next,就能传参数
# def init(func):
# def wrapper(*args,**kwargs):
# res=func(*args,**kwargs)
# next(res)
# return res # 返回 next(res),就是执行(return food_list)的下一步
# return wrapper
#
# @init #eater=init(eater)
# def eater(name):
# print(‘%s start to eat‘ %name)
# food_list=[]
# while True:
# food=yield food_list # 从return res取值 food=yield food_list意思是return food_list(只执行一次)+food=yield
# print(‘%s eat %s‘ %(name,food))
# food_list.append(food)
#
#
# e=eater(‘zhejiangF4‘) #wrapper(‘zhejiangF4‘)
# # print(next(e))
# e.send("大便")
# e.send("小便")

# 爬网页,不断地打开不同的URL
# from urllib.request import urlopen
# def get():
# while True:
# url=yield
# res=urlopen(url).read()
# print(res)
#
# g=get()
# next(g) # 让光标停到url=yield
# g.send(‘http://www/python.org‘) # 为了传值到URL

# 协程函数
#

# 把etc目录下,到root的文件的路径都打印出来,
# 在虚拟机输入
# grep -rl ‘root‘ /etc
# 就可以得到结果,但是用PYTHON,需要下面的做法

# 先写流程:
# def search():
# ‘找到文件的绝对路径‘
# pass
#
# def opener():
# ‘打开文件,获取文件句柄‘
# pass
#
# def cat():
# ‘读取文件内容‘
# pass
#
# def grep():
# ‘过滤一行中有无python‘
# pass
#
# def printer():
# ‘打印包含python的路径‘
# pass
#
# 在电脑运行中,输入import os
# os.walk(‘c:\\egon‘‘)
# 或
# os.walk(r‘c:\egon‘‘) # r代表右边的都是普通字符,没有转译符
# g=os.walk(r‘c:\egon‘‘)
# next(g)
# next(g)
# 我们发现第一个值与第3个值拼接就得到文件的绝对路径

# import os
#
# def search():
# while True:
# dir_name=yield
# g=os.walk(dir_name)
# for i in g:
# # print(i)
# for j in i[-1]:
# file_path=‘%s\\%s‘ %(i[0],j)
# print(file_path)
#
# e=search()
# next(e)
# e.send(‘c:\\egon‘)

# 我想把print(file_path)的结果存起来
import os

def init(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
next(res)
return res
return wrapper

@init
def search(target):
while True:
dir_name=yield
g=os.walk(dir_name)
for i in g:
# print(i)
for j in i[-1]:
file_path=‘%s\\%s‘ %(i[0],j)
target.send(file_path) # 把file_path值传到target中

@init
def opener(target):
‘打开文件,获取文件内容‘
while True:
file_path=yield
with open(file_path) as f:
target.send(f)

@init
def cat():
while True:
f=yield
for line in f:

以上是关于协程函数的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程取消 ② ( CPU 密集型协程任务取消 | 使用 isActive 判定协程状态 | 使用 ensureActive 函数取消协程 | 使用 yield 函数取消协程 )

Kotlin 协程协程取消 ② ( CPU 密集型协程任务取消 | 使用 isActive 判定协程状态 | 使用 ensureActive 函数取消协程 | 使用 yield 函数取消协程 )

Kotlin 协程协程启动 ② ( 多协程控制 | launch 协程执行顺序控制 | Job#join() 函数 | async 协程执行顺序控制 | Deferred#await() 函数 )

Kotlin 协程协程启动 ② ( 多协程控制 | launch 协程执行顺序控制 | Job#join() 函数 | async 协程执行顺序控制 | Deferred#await() 函数 )

Kotlin 协程协程异常处理 ② ( SupervisorJob 协程 | supervisorScope 协程作用域构建器函数 )

Kotlin 协程协程异常处理 ② ( SupervisorJob 协程 | supervisorScope 协程作用域构建器函数 )