python笔记 生成器

python笔记 生成器

好记性不如烂笔头,学习从摘抄开始!

1.通过列表生成式(列表推导式),我们可以直接创建一个 列表。但是,受到内存限制,列表容量肯定是有限的。
2.创建一个包含100万个元素的列表,不仅占用很大的存储空间,
3.如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费。
4.如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
5.这样就不必创建完整的list,从而节省大量的空间。
6.在Python中, 这种边循环一边j计算的机制,称为生成器: generator.

生成器格式1:借助列表推导式

格式:与列表推导式类似,将[]换成了()

<name> = (<表达式> for <变量> in <旧列表>)
<name> = (<表达式> for <变量> in <旧列表> if <条件>)
<name> = (<表达式1> if <条件> else <表达式2> for <变量> in <旧列表>)

注意:当生成的元素超出预设个数时,会抛出异常

例子:name.next() 一次生成一个元素

g = (i * 3 for i in range(30))
print(type(g))

ans = g.__next__()
print(ans)

ans = g.__next__()
print(ans)

ans = g.__next__()
print(ans)

结果:

<class 'generator'>
0
3
6

生成器格式2:借助函数完成

只要函数中出现关键字yield,说明函数变成了生成器
步骤:

1.定义一个函数,函数中使用关键字yield
2.调用函数,接收调用的结果
3.得到的结果就是生成器
4.借助 next(<生成器name>) <生成器name>.next()得到元素

例子1:g.next() 和 next() 一次生成一个元素

def func():
    n = 0
    while True:
        n = n + 1
        yield n  # yield 相当于return+暂停
        print('第{}测试:'.format(n), n)

g = func()
print(type(g))

ans = g.__next__()
print('接收到的返回值:', ans)

ans = g.__next__()
print('接收到的返回值:', ans)


ans = next(g)
print('接收到的返回值:', ans)

ans = next(g)
print('接收到的返回值:', ans)

结果:

<class 'generator'>
接收到的返回值: 11测试: 1
接收到的返回值: 22测试: 2
接收到的返回值: 33测试: 3
接收到的返回值: 4

例子2:name.send() 一次生成一个元素的同时并传入生成器一个参数
第一次调用.send(),必须传入None,

def func():
    n = 0
    while True:
        n = n + 1
        temp = yield n  # yield 相当于return+暂停 将 n 返回,并接受到的参数赋值给temp
        print('第{}测试:'.format(n), temp)


g = func()
print(type(g))

# 第一次调用<name>.send(),必须传入None
ans = g.send(None)
print('接收到的返回值', ans)

# 第二次调用 可以传入其他参数,先执行yield后面的语句,在循环执行到yield
ans = g.send("hello")
print('接收到的返回值', ans)

# 第三次调用 可以传入其他参数,先执行yield后面的语句,在循环执行到yield
ans = g.send("world")
print('接收到的返回值', ans)

结果:

<class 'generator'>
接收到的返回值 11测试: hello
接收到的返回值 22测试: world
接收到的返回值 3

生成器 控制 两个任务交替进行

例子:通过生成器控制两个任务交替进行

def task1():
    n=0
    while True:
        n=n+1
        print('任务1第{}次执行'.format(n))
        yield None

def task2():
    n = 0
    while True:
        n = n + 1
        print('任务2第{}次执行'.format(n))
        yield None

g1 = task1()
g2 = task2()

g1.__next__()
g2.__next__()

g1.__next__()
g2.__next__()

g1.__next__()
g2.__next__()

结果:

任务11次执行
任务21次执行

任务12次执行
任务22次执行

任务13次执行
任务23次执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值