点击上方“Python3X”,选择“置顶或者星标”
第一时间收到精彩推送!
Python Every Day, 第 18 天
在理解yield之前,你必须先知道iterable(迭代器)和generator(生成器)。
迭代器:
我们平时使用的列表,就是一个迭代器。可以通过for循环的方式去读取列表中的每一个元素。arr = [1, 2, 3, 4]for i in arr: print(i)for i in 'Python3X': print(i)2, 3, 4]
for i in arr:
print(i)
for i in 'Python3X':
print(i)
生成器(generator):
# 把创建列表的[] 改成 () 就创建了一个生成器genergener = (i ** 2 for i in range(10))for i in gener: print(i) # 一次打印0、1、4、9、16 ... i的平方
gener = (i ** 2 for i in range(10))
for i in gener:
print(i) # 一次打印0、1、4、9、16 ... i的平方
yield
def m(): print('m() starting') while True: result = yield 1 print('result = ', result)g = m() print(next(g))print('*' * 10)print(next(g))print('&' * 10)print(next(g))
print('m() starting')
while True:
result = yield 1
print('result = ', result)
g = m()
print(next(g))
print('*' * 10)
print(next(g))
print('&' * 10)
print(next(g))
m() starting # 刚进入函数m() 执行的打印信息1 # 执行next(g) 返回1,而不会再去执行result=xxx********** # '*' * 10 标记用result = None # 再次执行next(g)的时候,首先打印了result = None,1 # 然后才返回1 &&&&&&&&&& # 标记用result = None # 继续执行next(g), 仍然返回result=None1 # 然后才返回1
1 # 执行next(g) 返回1,而不会再去执行result=xxx
********** # '*' * 10 标记用
result = None # 再次执行next(g)的时候,首先打印了result = None,
1 # 然后才返回1
&&&&&&&&&& # 标记用
result = None # 继续执行next(g), 仍然返回result=None
1 # 然后才返回1
往期Python Every Day
[每日一题]3、Python实现删除list中重复元素的几种方式
[每日一题]2、Python中的类的定义和装饰器@classmethod与@staticmethod
感谢您的阅读