文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【25】Python生成器generat

2023-01-31 06:45

关注

列表生成式
一个小题目:将里列表[0,1,2,3]里面的数值都加1.
方法1:

a=[0,1,2,3]
b=[]
for i in range(len(a)):
    b.append(i+1)
a=b
print(a)

方法2:

a = [1,3,4,6,7,7,8]
for index,i in enumerate(a):
    a[index] +=1
print(a)

方法3:

a=[0,1,2,3,4]
a=map(lambda x:x+1,a)
print(a)
for i in a:
    print(i)

方法4:(列表生成式)

a=[i+1 for i in range(10)]
print(a)

看出了什么没有?没错,同样的功能,实现的代码越来越精简。

进入正题:生成器
通过列表生成式,我们可以直接创建一个列表。但是,受内存限制,列表的容量肯定有限。如果创建大量数据,结果只用到几条,那也是相当占用空间的。
所以列表元素按照某种算法推算出来,那我们是否可以在循环的过程中不断的推算出后续的元素呢?这样可以节约大量空间。在python中,这种一边循环一边计算的机制,成为生存器:generator。
创建生成器有很多种方法,最简单的方法就是把一个列表[]改成(),就创建了一个generator:

g=(i+1 for i in range(10))
print(g)

运行的结果就是根据算法生成的,只有在循环调用的时候,才会显示。

l=[x+1 for x in range(10)]
print(l)

列表会显示所有数据。而生成器generator需要通过循环或者next()函数调用才能算出来。
直到计算到最后一个元素,没有更多的元素时,会抛出异常StopIteration的错误。

下面可以用函数实现:比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...

def fib(max):
    n ,a,b =0,0,1
    while n <max:
        print(b)
        a,b=b,a+b
        n=n+1
    return "done"
print(fib(10))

而实现生成器的转换,只需要修改一步。将print(b),改成yield b即可

def fib(max):
    n,a,b=0,0,1
    while n<max:
        # print(b)
        yield b  ##有yield存在时就不叫函数了,而叫生成器
        a,b=b,a+b
        n=n+1
    return "done"
print(fib(10))
f=fib(10)
g=fib(6)
while True:
    try:
        x=next(g)
        print("g",x)
    except StopIteration as e:  #异常起个名字叫 e
        print("Generator return value:",e.value)
        break
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())

生成器并行运行

import time
def consumer(name):
    print("%s eat!"%name)
    while True:
        baozi=yield #yield没有返回值空的
        print("包子%s来了,被%s吃了"%(baozi,name))

# c=consumer("alex")
# c.__next__()
# b1="韭菜馅"
# b2="肉馅"
# c.send(b1) ##调用b1,同时给传值
# c.__next__()

#携程(nginx异步处理)
def producer(name):
    c1=consumer("A")
    c2=consumer("B")
    c1.__next__()
    c2.__next__()
    print("准备包子!!!")
    for i in range(10):
        time.sleep(2)
        print("做一个,两人分着吃!")
        c1.send(i)
        c2.send(i)
producer("alex")
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯