首页 > 其他 > 详细

迭代器生成器

时间:2021-01-31 17:26:23      阅读:24      评论:0      收藏:0      [点我收藏+]

 1、列表生成式  【】 与()

def fun(x):

    ‘‘‘
列表生成式所用函数
:param x:
:return:
‘‘‘
return x
a=[ fun(i) for i in range(2,10)] # 变量i迭代输出迭代对象(range(2,10))的值用于fun(i)做计算,返回函数值给a
print(a)

当我们尝试把【】-->()会怎样呢,a1=( fun(i) for i in range(2,10)):
这时print(a1) --> <generator object <genexpr> at 0x000001560BD2D8C8> 注意generator 这返回的就是生成器对象
要输出a1的值,可以 print(a1.__next__) or print(next(a1))
每次print一个就输出一个,这样太麻烦了,我们可以把它放到for循环里,一次性输出结果
for i in a1: # i.next=a1.__next__ a1生成器对象已通过for内部的__next__方法迭代输出了,我们直接输出i即可
  print(i)
生成器对象有2个常用的方法,__next__ \  send()  第一个用于输出迭代输出生成器的数据,第二个输出的同时还可以输出参数。

可迭代对象、迭代器、生成器:
  列表、元组、字符串都是可迭代对象,可通过print(dir())查看是否有__iter__
  可迭代对象可通过  iter(__iter__)转换 迭代器,通过print(dir())查看是否有__next__,
  迭代器、生成器可以通过__next__方法迭代输出的,而我们常用的for循环方法,内部就是引用__next__方法来循环的,直接现用方便
  生成器:用一个,next一个,没有next的数值未被变量引用,会定时被python机制回收掉,不暂用内存。

  (垃圾回收机制:当一个数据未被变量引用时,会被回收掉)

2、通过裴波数列来理解生成器:
写一个普通函数
def fun1(va):
‘‘‘输出0 1 1 2 3 5
  x1,x2 = 0,1
  while va:
    print(x1)
    x1,x2 = x2,x1+x2
    va-=1
print(fun1(8)) # 我们执行函数输出前8项数值


下面我们把fun1函数的print(x1)换成 yield x1 ,变成生成器函数
def fun1(va):
‘‘‘输出0 1 1 2 3 5
  x1,x2 = 0,1
  while va:
    yield x1
    x1,x2 = x2,x1+x2
    va-=1
#print(fun1(8)) # 执行后,<generator object fun4 at 0x000001D1853BD7C8> 并没有输出想要的结果,而是给了一个generator对象
yield :就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始
比如:
g = fun1(8)
print(next(g)) # 把g这个生成器通过next方法输出一个数值0







    




迭代器生成器

原文:https://www.cnblogs.com/yhmdj/p/14352837.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!