1.生成器本质上就是一个迭代器
2.定义方式
-
2.1 生成器表达式:类似于列表推导式
列表推导式
for i in range(3):
print(i*10)
li = [i*10 for i in range(3)]
print(li)#0 10 20
- 把列表推导式的[]改成()
li2 = (i*10 for i in range(3)) # 生成器表达式
print(li2) # at 0x000002105DD1B548>
print(next(li2))#0
print(next(li2))#10
print(next(li2))#20
print(next(li2))报错,i的范围只取到2
- 2.2 生成器函数:python中, 使用了yield的函数被称为生成器(generator)
- 1.普通函数,返回值用return; 生成器函数使用yield语句
- 2.yield语句一次返回一个结果,在每个结果中间,挂起函数,以便下次从它离开的地方继续执行
- 3.yield效果使函数中断,并保存中断的状态
def funa(val):
li = []
li.append(val)
print('这是列表:', li)
funa('a')#这是列表: ['a']
funa('b')#这是列表: ['b']
funa('c')#这是列表: ['c']
二、生成器函数
def funb():
print('---开始了----')
yield 2 # 返回一个2,并暂停函数
yield 3
yield 4
fb = funb() # 调用生成器函数,返回的是一个生成器对象
print(fb)#
print(next(fb))
print(next(fb))
print(next(fb))
print(next(fb))#报错,因为上面yield只有2,3,4
for i in fb:
print(i)# 2 3 4
举例一:
根据n的值来决定列表的长度 n = len(res)
def test(n):
res = [] # 空列表
for i in range(n):
res.append(i)
print('列表:', res)#列表: [0, 1, 2, 3]
test(4) # n = 4
def test(n):
res = [] # 空列表
a = 0
while a < n:
res.append(a)
a += 1
print('列表:', res)#列表: [0, 1, 2, 3]
test(4)
生成器函数
def test2(n):
a = 0
while a < n:
yield a
a += 1
for i in test2(10):# n=10
print(i)# 0 1 2 3 4 5 6 7 8 9
举例二:
处理文件, 用户指定要查找的文件和内容
将文件中要查的内容的每一行都打印出来
- 1.写一个函数, 参数是文件和内容
- 2.文件 *** 作 – open()函数
- 3.查找内容 – 判断内容是否在那一行
- 4.找到后输出
def check(fname, content): # fname代表文件名, content代表内容
with open(fname, encoding='utf-8') as file:
for i in file:
# print(i, end='')
if content in i:
# print(i)
yield i
ch = check('we.txt', '小猫')
print(next(ch))#小猫1
print(next(ch))#小猫2
print(next(ch))#报错:StopIteration,因为we.txt文件中含有小猫关键字的只有小猫1,小猫2,所以输出第3次会报错
with open('we.txt', encoding='utf-8') as f:
for i in f:
print(i)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)