生成器的两种方式

生成器 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="")
————————————

原文地址:https://www.cnblogs.com/qxh-beijing2016/p/10734113.html