python-列表生成器

0.0>:需求:列表中每位数加一:
a = list(range(10))
print(a)
# for i in a:
#     i = i+1
#     print(i)
# a = [i+1  for i in a]
# print(a)

a = [i if i < 5 else i+1 for i in a]
print(a)

>:特性:1、想要啥它就会立即产生,取一次,创建一次 2、它只能往前走不能往后退 3、走到最后,没有了,就会报错 它的作用:可以从python2中的rang()和python3中的range()中看出。就像一个公式 ,节省了时间。 python 2 ->range = list xrange = 生成器 python 3 ->range = 生成器 xrange 没有
函数也可以编写生成器: 先加个小插曲:赋值方法:然后写一个斐波那契数列:

$$>:在Python中,一边循环一边计算的机制,称为生成器:generator。

让这个数列变成生成器:


上图中。加了yield,函数名加括号,内部代码不执行,只是生成一个生成器对象。

生成器的创建方式:

1、列表 生成 式()#ta最复杂也就是三元式

第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

创建Lg的区别仅在于最外层的[]()L是一个list,而g是一个generator。

2、函数yield

>:yeild作用:就是生成器生成一部分,然后暂停去做别的事,最后在继续

>>:next执行出来用next(i)还可以用  i.--next--()来表示

函数有了yield之后:

    1.函数名加()就变成了一个生成器

     2.return 在生成器里,代表 生成器的终止,直接报错


如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

还可通过yield实现在单线程的情况下实现并发运算的效果  

#_*_coding:utf-8_*_
__author__ = 'Alex Li'

import time
def consumer(name):
    print("%s 准备吃包子啦!" %name)
    while True:
       baozi = yield

       print("包子[%s]来了,被[%s]吃了!" %(baozi,name))


def producer(name):
    c = consumer('A')
    c2 = consumer('B')
    c.__next__()
    c2.__next__()
    print("老子开始准备做包子啦!")
    for i in range(10):
        time.sleep(1)
        print("做了2个包子!")
        c.send(i)
        c2.send(i)

producer("alex")

通过生成器实现协程并行运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值