理解生成器,最好的方法就是给他取个突出其本质的别名:生成数据的机器代码。
生成器是一种用时间换空间的做法。比如,利用list列表储存全体正整数,无穷个正整数再大的内存也无法装得下,这个时候就可以使用生成器,实现用一段代码来储存全部正整数的作用。如下面代码,每隔0.5秒自动递增生成一个正整数。
import time #生成器实际上就是一个函数,但是这个函数必须使用yield关键字,然后函数返回一个生成器对象generator def inf_N(): num = 1 while True: yield num num += 1 if __name__ == '__main__': #使用变量名inf_N_gennerate绑定这个生成器 inf_N_gennerate = inf_N() while True: time.sleep(0.5) #使用next()方法取生成器里面的数据 print(next(inf_N_gennerate))
目录
一,生成器的官方定义
二,创建生成器的两种方式
1,生成器表达式
2,生成器函数
三,__next__()&next()和send()方法
1,__next__()&next()的区别
2,next()和send()用以唤醒生成器
3,send()方法的作用
一,生成器的官方定义
在Python中,一边循环一边计算的机制,称为生成器:generator。
二,创建生成器的两种方式
1,生成器表达式
生成器表达式返回一个生成器对象即generator object,需要用一个变量名来接收并绑定。
2,生成器函数
import time
def inf_N():
num = 1
while num <= 100:
temp = yield num
# 执行顺序是:①yield num将num返回出去;②将"yield num"这个个表达式的值交给变量temp,但是num已经被yield返回出去了,所以交给temp的只能是None了
# yield与return一样会将num返回出去,但不是像return一样结束函数。而是会卡在这里不执行,直到下一次使用next()方法唤醒
num += 1
print(temp)
print("数据已经生成并拿走完毕!")
return None
if __name__ == '__main__':
inf_N_gennerate = inf_N()
while True:
# time.sleep(0.5)
print(next(inf_N_gennerate))
三,__next__()&next()和send()方法
1,__next__()&next()的区别
__next__()是生成器对象的实例方法,next()是python的内置方法。他们实现的功能是一样的,只能对可迭代的对象使用。
2,next()和send()用以唤醒生成器
当生成器函数中执行yield时,程序会卡在yield的地方不执行,next()和send()的作用就是唤醒卡住的程序,让他继续执行。
3,send()方法的作用
send()作为生成器对象的实例方法,可以向生成器发送数据并唤醒生成器函数。一般send()方法要写在next()方法后面,当next()和send()写在一块时,相当于唤醒两次生成器。
import time
def inf_N():
num = 1
while num <= 100:
temp = yield num
# 执行顺序是:①yield num将num返回出去;②将"yield num"这个个表达式的值交给变量temp,但是num已经被yield返回出去了,所以交给temp的只能是None了
# yield与return一样会将num返回出去,但不是像return一样结束函数。而是会卡在这里不执行,直到下一次使用next()方法唤醒
num += 1
print(temp)
print("数据已经生成并拿走完毕!")
return None
if __name__ == '__main__':
inf_N_gennerate = inf_N()
while True:
time.sleep(0.5)
value = next(inf_N_gennerate)
print(value)
inf_N_gennerate.send(100)
# 会打印1 3 5 7 9是因为next和send都会唤醒生成器
更多推荐
python生成器
发布评论