python之生成器Generator(详解)

编程入门 行业动态 更新时间:2024-10-23 05:48:40

python之<a href=https://www.elefans.com/category/jswz/34/1764786.html style=生成器Generator(详解)"/>

python之生成器Generator(详解)

  • 生成器 Generator

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

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


def myyield():print("即将生成2")yield 2print("即将生成3")# return '在生成3之前用return返回'  将会发生异常yield 3print("即将生成4")yield 4print("即将生成5")yield 5print("生成器生成结束")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 = 0while i < n:yield ii += 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 *= xyield sl = 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))  #会触发StopIterationyield texcept StopIteration:breaknumbers = [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 == "":breakelse:l.append(s)return ldef print_lines(L):for n in enumerate(L,1):print('第%d行:%s'%n)L = get_line()
print(L)
print_lines(L)

 

更多推荐

python之生成器Generator(详解)

本文发布于:2024-02-06 10:36:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1748418.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:生成器   详解   python   Generator

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!