yield生成器,最简单的理解方式就是return,但是它又不是一个简单的return,它是会中断循环并保留上一次循环的状态,可以用next、send方法给循环里的变量赋值,你写下面两个Demo就能大概理解了。
例子1:
def foo():
print("starting...")
while True:
res = yield 4
print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))
输出结果为:
starting...
4
********************
res: None
4
例子2:
def foo():
print("starting...")
while True:
res = yield 4
print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(g.send(7))
输出结果为:
starting...
4
********************
res: 7
4
还有在一种用法是在python2里替代for .. in range(),减少内存占用,正常情况下大部分人可能会这样用:
for n in range(1000):
a=n
还有一种办法就是yield:
def foo(num):
print("starting...")
while num<1000:
num=num+1
yield num
for n in foo(0):
print(n)
其实这种用法在python2里有一个xrang不需要这么麻烦
你写的应该是scrapy,所以用yield结尾跳转到下一步的函数,因为这样才能保存你上一个函数的执行状态以传值,类似于过程式编程,这也是scrapy比较值得推荐的地方。如果自己写虫子,一般都是for几个嵌套来读取列表页最后到详情页,但是用scrapy这种做法就算以后自己看起来代码也会很容易理解 |