结论
yield是暂停当前函数的执行,并返回一个生成器。
return直接返回当前函数的运行结果
样例
return的样例
return使用的还是比较多的,当一个函数执行到return的时候,程序会在当前位置直接返回一个结果。
def get_num_yield():
for i in range(10):
yield i
num = i
print(i)
def get_num_return():
for i in range(10):
return i
num = i
print(i)
if __name__ == '__main__':
b_return = get_num_return()
print(b_return)
b_yield = get_num_yield()
print(b_yield)
这个例子里面有两个方法,大家先看第一个方法即可,
yield的样例
同上,这次看yield 的样例就好了
论证
还是这个代码:
def get_num_yield():
for i in range(10):
yield i
num = i
print(i)
def get_num_return():
for i in range(10):
return i
num = i
print(i)
if __name__ == '__main__':
b_return = get_num_return()
print(b_return)
b_yield = get_num_yield()
print(b_yield)
数据结果如下:
这样貌似看不出来什么,带我给它变个样子。
def get_num_yield():
for i in range(10):
yield i
num = i
print('get_num_yield方法中数据的b_yield--',i)
def get_num_return():
for i in range(10):
return i
num = i
print('get_num_return方法中数据的b_yield--',i)
if __name__ == '__main__':
b_return = get_num_return()
print('main方法中数据的b_return--',b_return)
b_yield = get_num_yield()
print('main方法中数据的b_yield--',b_yield)
输出结果如下:
目前为止哈,我们可以看到,两个只有返回值的不同,一个是返回了一个值,另一个返回的是一个生成器对象,这生成器对象是干啥的呢?当我们将使用next调用这个生成器对象的时候,会发生一个很神奇的事:
def get_num_yield():
for i in range(10):
yield i
num = i
print('get_num_yield方法中数据的b_yield--', num)
def get_num_return():
for i in range(10):
return i
num = i
print('get_num_return方法中数据的b_yield--', i)
if __name__ == '__main__':
b_return = get_num_return()
print('main方法中数据的b_return--', b_return)
b_yield = get_num_yield()
print('main方法中数据的b_yield--', b_yield)
print('main方法中数据的b_yield调用next--', next(b_yield))
print('main方法中数据的b_yield调用next--', next(b_yield))
运行结果如下:
这样就很明显了,当程序遇到yield时,会将一个生成器(generator)对象返回给调用它的函数,但是并不是结果,而是暂停在了这里,当我们调用next这个生成器对象时,会继续运行之前的函数,也就是将我们的之前的0返回给了next调用的地方,当我们想继续往下走的时候,需要再次使用next调用,此时执行get_num_yield的赋值语句并且for循环继续执行,此时又碰到了yield,所有又暂停了,以此往复,直到报错信息stop iteration出现为止。
在运行到yield处时,函数暂停运行,使用下一个next后再次开始正常运行,直到遇到下一个yield