经常看别人的代码里有yield 子句,不知道是什么意思,今天花功夫了解了下,总结起来就是:yield就是可以用多次的return。
- 为什么会有yield?
yield是为了能够返回多个数据,可能有人会问,我返回多个数据用数组不就可以了吗? 是的,但是假如我要返回的数据有上1亿个,上百亿个呢?要知道数组是放在内存里的,在内存里放百亿个数据,内存不马上就被占满了?所以这时就有了yield。yield的功能就是把所有要返回的数据依次返回。这样就不会占多的内存了。
先看代码:
def foo():
yield 7
yield 3
g = foo()
print(next(g))
print(next(g))
输出结果:
7
3
但是假如我用return呢?
def foo():
return 7
return 3
g = foo()
print(g)
print(g)
输出结果:
7
7
因为return只能有一次,遇到第一个return程序就已经结束了,所以3的值始终不会返回。
next()方法是从函数里取回yield的值,上面也说了yield可以一次返回一个值 ,那么在外部调用时就也需要一种方法一次取一个值,这个方法就是next()。
实际上,用了yield后,函数返回值就不是具体的数据了,而是一个生成器对象 :
def foo():
yield 7
g = foo()
print(type(g))
输出:
<class 'generator'>
目前只需要知道gengrator对象一个重要特性:可迭代
def foo():
yield 7
yield 8
yield 2
yield 5
g = foo()
for i in g:
print(i)
输出结果:
7
8
2
5
什么时候需要用yield呢?
当你需要编写一个函数,返回很多数据的时候,并且这些数据是按规律生成的。
比如返回斐波那契数列,返回所有的素数,返回数据库中的所有数据,返回一个特定的规律的字符串组合(如所有ip地址,所有电话号码,所有可能的N位密码组合)……这些只是能想到的用法,其实还应该有很多别的用法。
看完以上内容,yield应该是可以理解了,至于更细节的东西,大家可以自行研究。