'''
使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,
返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
'''
'''方法1'''
import sys
# 这种方式占据内存空间,返回的是一个数列
nums01 = [x * 2 for x in range(10000000) if x < 10000]
print(nums01) # 这种方式占据内存空间,返回的是一个数列
print sys.getsizeof(nums01) # 此处输出的内存大小为 87624
for i in nums01:
print(i)
print ('-' * 50)
# 生成器不占据内存空间,返回的是一个对象
nums02 = (x * 2 for x in xrange(10000000) if x < 10000)
print(nums02) # 生成器不占据内存空间,返回的是一个对象
print sys.getsizeof(nums02) # 此处输出的内存大小为 72
for i in nums02:
print(i)
print ('-' * 50)
'''方法2'''
def create_num(all_num):
print('---1---')
a,b = 0,1
current_num = 0
# 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,
# 返回 yield 的值到for循环中, 并在下一次执行 next() 方法时从当前位置继续运行。
while current_num < all_num:
print('---2---')
yield a
print('---3---')
a,b = b,a+b
current_num += 1
print('---4---')
# 如果在调用create_num的时候,发现这个函数中有yield那么此时,不是调用函数,
# 而是创建一个生成器对象
obj = create_num(10)
for num in obj:
print(num)
print('-'*50)
'''函数例子'''
def create_num(all_num):
a,b = 0,1
current_num = 0
while current_num < all_num:
yield a
a,b = b, a+b
current_num += 1
return 'OK'
obj02 = create_num(50)
while True:
try:
result = next(obj02)
print(result)
except Exception as result:
print(result) # 获取return 的值
break
print('-'*50)
'''send能传递参数入生成器 改变yield的值'''
def create_num01(all_num):
a,b = 0,1
current_num = 0
while current_num < all_num:
result = yield a
print('>>> result <<<',result)
# 可以根据传入的值做处理
if result == 'hahaha':
print(True)
a,b = b, a+b
current_num += 1
return 'OK'
obj03 = create_num01(20)
result03 = next(obj03)
print('result03:',result03)
result04 = obj03.send('hahaha')
print('result04:',result04)
# 如果第一次就要执行send就使用如下方式
result05 = obj03.send(None)
print('result05:',result05)