python之生成器Generator(详解)

  • 生成器 Generator

    什么是生成器
        生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(示例)
    生成器有两种:
        生成器函数
        生成器表达式

    生成器函数的定义:  
        含有yield语句的函数是生成器函数,此函数被调用将会返回一个生成器对象
        yield翻译为产生(或生成)
    yield语句
        语法:
            yield 表达式
        说明:
            yield 用于def函数中,目的是将此函数用生成器函数使用
            yield 用来生成数据,供迭代器和next(it)函数使用
        示例:
           


def myyield():
    print("即将生成2")
    yield 2
    print("即将生成3")
    # return '在生成3之前用return返回'  将会发生异常
    yield 3
    print("即将生成4")
    yield 4
    print("即将生成5")
    yield 5
    print("生成器生成结束")
    yield 
#for x in  myyield():
#    print(x) 
# 调用生成器函数来创建一个生成器,此生成器能生成 2,3,4,5
gen = myyield()

it = iter(gen)  #用生成器拿到对应的迭代器
print(next(it)) #此时生成器函数才开始执行,并遇到yield停止 2
print(next(it)) #访问迭代器 3
print(next(it)) #4   
print(next(it)) #5
print(next(it)) #生成器生成结束

练习:
         写一个生成器函数myevev(start,stop)用来生成start开始到stop结束(不包含stop)的偶数

def myinterger(n):
    i = 0
    while i < n:
        yield i
        i += 1
for x in myinterger(3):
    print(x)  # 0 1 2 
l = [x for x in myinterger(100) if x % 2 == 1]
print('l = ',l)

写一个生成器函数myfactorial(n)用来表示数的阶称

def myfactorial(n):
    s = 1#用来保存阶乘
    for x in range(1,n+1):
        s *= x
        yield s

l = list(myfactorial(5))
print(l)
  •     生成器表达式:

        语法:
            (表达式 for 变量 in 可迭代对下哪个 [if 真值表达式])
        作用:
            用推导式形式创建一个新的生成器
        说明:
            if子句可以省略
        示例:

gen = (x**2 for x in range(1,5))
it = iter(gen)
print(next(it))   #1
print(next(it))   
print(next(it))   #9
print(next(it))   #16
print(next(it))   #StopInteration

生成器表达式和列表推导式的区别:
        示例:   

#列表推导式
l = [2,3,5,7]
l2 = [x ** 2 + 1 for x in l]
it = iter(l2)
print(next(it))   # 5
l[1] = 30
print(next(it))   # 10


#生成器表达式
l = [2,3,5,7]
gen = (x ** 2 + 1 for x in l)
it = iter(gen)
print(next(it))   #5
l[1] = 30
print(next(it))   #901


        生成器表达式是现用现生成,列表推导式是一次生成静态数据

迭代工具函数:
        作用是生成一个个性化的可迭代对象

        函数:
            zip(iter1[,iter[....]])返回一个zip对象,此对像用于生成元组,此元组的每个数据来源于参数中的可迭代对象,当最小的可迭代对象不再提供数据时迭代结束

            enumerate(iterable[,start])
            生成带索引的枚举对象,返回的迭代类型为索引-键值对(index-value)对,默认索引从0开始,也可以用start指定

zip示例:

numbers = [10086,10000,10010,95588]
names = ['中国移动','中国电信','中国联通','工商银行']
for t in zip(numbers,names):
    print(t)
for No,number,name in zip(range(1,100),numbers,names):
    print('序列',No,'的客服电话:',number)

myzip示例:

def myzip(iter1,iter2):
    it1 = iter(iter1) #拿到两个对象的迭代器
    it2 = iter(iter2)
    while True:
        try:
            t = (next(it1),next(it2))  #会触发StopIteration
            yield t
        except StopIteration:
            break


numbers = [10086,10000,10010,95588]
names = ['中国移动','中国电信','中国联通','工商银行']
for t in myzip(numbers,names):
    print(t)

        练习:
            写一个程序,读入任意行文字,当输入空行是结束输入
            打印带有行号的输入结果
            如:
                请输入:abcde<回车>
                请输入:hello<回车>
                请输入:bye<回车>
                请输入:<回车>

            输出如下:
                第一行:abcde
                第二行:hello
                第三行:bye

def get_line():
    l = []
    while True:
        s = input("请输入:")
        if s == "":
            break
        else:
            l.append(s)
    return l


def print_lines(L):
    for n in enumerate(L,1):
        print('第%d行:%s'%n)


L = get_line()
print(L)
print_lines(L)

猜你喜欢

转载自blog.csdn.net/zhangshuaijun123/article/details/81904388
今日推荐