生成器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(详解)
发布评论