列表表达式回顾ide
# -*-coding:utf-8 -*- __date__ = '2018/3/5' __author__ = 'xiaojiaxin' __file_name__ = '生成器' #a1=[x*2 for x in range(10000000000)] #所有加载至内存,列表表达式
生成器建立的两种方法函数
a=(x*2 for x in range(5)) print(a) # <generator object <genexpr> at 0x000000E29B512990> #里面没有值!!!!生成器只是一个对象
生成器执行的两种方法code
#就好比说列表和元组等都是菜,想吃就直接吃,生成器只是一个厨师,他会作菜,可是你要吃哪道菜,他才会去加载那一道菜 #第一种方法:使用内置方法 print(a.__next__()) #0 print(a.__next__()) #2 print(a.__next__()) #4 #第二种方法:使用next()方法 print(next(a)) #等价于Python2.x a.next() #6 print(next(a)) #8 # print(next(a)) #报警:中止迭代 # #StopIteration # print(next(a)) #生成器就是一个可迭代对象(iteration迭代)
#for内部对b作了next()调用,以前的数据做为垃圾回收了 #for循环检测是否还有数据,及时结束next()调用 b=(x for x in range(10)) for i in b: #for内部对b作了next()调用,以前的数据做为垃圾回收了 print(i) #for循环检测是否还有数据,及时结束next()调用
#生成器一共两种建立方式 #第一种:(x for x in range(5)) #第二种:yield
生成器函数与普通函数的区别对象
def foo(): print("haha") return 1 foo() #haha print(foo()) #执行函数,并返回返回值 #haha #1 print(foo) # <function foo at 0x000000A30D962E18>
def fou(): print("123") yield 2 #只要有yield就是生成器对象 print("456") yield 4 fou() # #空表示没有执行fou()函数 print(fou()) #不执行函数,不返回函数返回值 # <generator object fou at 0x00000092754D2A40> print(fou) # <function fou at 0x000000A823DBD158> #fou()是一个生成器对象 #有一个yield就只有一道菜,有多个yield就有多道菜 next(fou()) #执行fou()生成器对象 #123 next(fou())
你们对内容有任何问题,欢迎留言,定在第一时间解答,谢谢你们!内存