列表表达式回顾
# -*-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>
#里面没有值!!!!生成器只是一个对象
生成器执行的两种方法
#就比如说列表和元组等都是菜,想吃就直接吃,生成器只是一个厨师,他会做菜,但是你要吃哪道菜,他才会去加载那一道菜
#第一种方法:使用内置方法
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())
大家对内容有任何问题,欢迎留言,定在第一时间解答,谢谢大家!
原文:http://blog.51cto.com/10777193/2092999