摘要
yield和return有什么区别?什么事生成器?什么又是迭代器?他们都有什么作用?简单理解的话yield=return,返回函数体处理结果的!yield本身是一个生成器,所以使用return返回的是我们常见的一些object(eg:list、dict、等),使用yield返回的是一个迭代器对象!
yield和return
之前一篇文章 【开启Scrapy爬虫之路】中,处理item时,定义函数返回值用的yield,有人问yield是干嘛的,什么意思?
相同点: 都是定义函数过程中返回值
不同点:
yield是暂停函数,return是结束函数; 即yield返回值后继续执行函数体内代码,return返回值后不再执行函数体内代码
yield返回的是一个迭代器(yield本身是生成器-生成器是用来生成迭代器的);return返回的是正常可迭代对象(list,set,dict等具有实际内存地址的存储对象)
# debug测试 def f1 ( ) : print ( "第1次暂停" ) yield '第1次访问返回的结果' # yield 暂停函数的调用,返回一个结果 print ( "第2次暂停" ) yield '第2次访问返回的结果' return 100 # reutrun结束函数的调用 print ( 'return直接结束,此句不执行' )
生成器
如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
>> > L = [ x * x for x in range ( 10 ) ] >> > L [ 0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81 ] >> > g = ( x * x for x in range ( 10 ) ) >> > g < generator object < genexpr > at 0x1022ef630 >
yield 返回的是一个生成器(看成迭代器更好理解)
迭代器
可以直接作用于for循环的对象统称为可迭代对象:Iterable
一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:创建迭代器iter() 和 访问迭代器next()。