生成器的两种方式
生成器 Generator(python2.5及之后)
什么是生成器
——生成器能够动态提供数据对象,生成器对象也是可迭代对象
生成器有两种:
生成器函数
生成器表达式
------------------------------------------------------------------------------------------------------------------------------------------------------------------
生成器函数的定义:
含有yield 语句的函数是生成器函数,此函数被调用时返回一个生成器对象
yield 翻译为产生(或生产)
————
yield 语句
语法:
yield 表达式
说明:
——yield 用于def函数中,目的是将此函数作为生成器函数使用;
——yield 用来生成数据,供迭代器的next(it)函数使用。
————————
生成器函数示例:
def myyield():
# print("yield函数被调用")
yield 2
yield 3
return "生成器出现错误!"
yield 5
yield 7
# 调用myyield()函数讲返回一个可迭代对象(生成器对象)
gen=myyield()#gen绑定生成器对象
it=iter(gen)#it绑定用于访问gen生成器的迭代器
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
>>>>>
2
3
Traceback (most recent call last):
File "ketang.py", line 50, in <module>
print(next(it))
StopIteration: 生成器出现错误!
——————————
def myinteger(begin,end):
n=begin
while n<end:
print("即将生成:",n)
yield n
n+=1
for x in myinteger(10,15):
print(x)
>>>>>
即将生成: 10
10
即将生成: 11
11
即将生成: 12
12
即将生成: 13
13
即将生成: 14
14
————————
生成器函数说明:
——生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象
——生成器函数调用return语句会触发一个StopIterator 异常
------------------------------------------------------------------------------------------------------------------------------------------------------------------
生成器表达式
语法:
(表达式 for 变量 in 可迭代对象 [if 真值表达式 ] )
注:if 子句可以省略
作用:
用推导式形式生成一个新的生成器
示例:
gen=(x**2 for x in range(1,5))
it=iter(gen)
next(it) #1
next(it) #4
next(it)#9
next(it)#16
next(it)#StopIterator
——————————
def isodd(a):
if a%2==1:
return True
return False
# 这是用一个生成器表达式生成100以内奇数的立方(是不会生成全部数据,只有用的时候调取一个数)#
for x in (x**3 for x in range(100) if isodd(x)):
print(x , end="")
# 先一次性生成100以内奇数的立方存于列表中然后在循环打印
for x in [x**3 for x in range(100) if isodd(x)]:
print(x , end="")
————————————