Day04 Python中的生成器

一、生成器

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)    #<generator object <genexpr> 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)#<generator object funb at 0x000001F322C26F68>
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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值