zoukankan      html  css  js  c++  java
  • python进阶之路4.1---生成器与迭代器

    python3生成器与迭代器

    1 迭代器

    定义:迭代器是访问集合元素的一种方式。迭代器从集合的第一个元素开始访问,直到所有的元素访问结束。迭代器只能往前不能后退。

    特点:1)访问者不需要关心迭代器的内部结构,仅需要通过next()方法不断去获取下一个内容。

    2)不能随机访问集合中的某个值,只能从头到尾依次访问,便于循环比较大的数据集合,节省内存。

    下面使用斐波那契数列为例,说明为何使用迭代器: 示例代码1

    def fab(max):
    n,a,b,=0,0,1
    while n<max:
        print(b)
        a,b = b,a+b
        n= n+1
    fab(2)
    

    直接在函数fab(max)中用print打印会导致函数的可复用性变差,因为fab返回None。其他函数无法获得fab函数返回的数列。 示例代码2:

    def fab(max):
        li = []
        n,a,b=0,0,1
        while n < max:
            li.append(b)
            a,b=b,a+b
            n=n+1
        return li
    fab(2)
    

    代码2满足了可复用性的需求,但是占用了内存空间,最好不要。 示例代码3

    li = [x * x for x in range(10)]
    print(li)
    l = (x * x for x in range(10))
    print(type(l))
    print(l.__next__())
    print(l.__next__())
    print(l.__next__())
    

    ## 生成器generator ## 定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器。 def abc(tmp): while tmp>0: tmp -= 1 yield 1 print("wo")

    aa = abc(10)
    print(aa.__next__())
    print(aa.__next__())
    print(aa.__next__())
    print(aa.__next__())
    

    作用:这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。另外,还可通过yield实现在单线程的情况下实现并发运算的效果。

    import time
    def consumer(name):
        print("%s 准备尺包子!" %name)
        while True:
            baozi = yield
            print("包子[%s]来了,呗[%s]吃了!" %(baozi,name))
    def producer(name):
        aa = input("put your name")
        bb = input("your name")
        c = consumer(aa)
        c2 = consumer(bb)
        c.__next__()
        if 1 ==1:
            c2.__next__()
        else:
            print('b')
        c2.__next__()
        print("make baozi")
        for i in range(10):
            time.sleep(2)
            print("做了2个包子")
            c.send(i) #返回给生成器consumer函数
            c2.send(i)
    producer('lixingli')
    

    总结: generator是用来产生一系列值得

    yield则像是generator函数的返回结果
    yeild唯一所做的另一件事就是保存一个generator函数的状态
    generator就是一个特殊类型的迭代器(iterator)
    和迭代器类似,我们可以通过使用next()来从generator中获取下一个值
    通过隐式地调用next()来忽略一些值
    

    更多内容请访问 李兴利博客

  • 相关阅读:
    实战-百度云[大文件/文件夹]下载限制破解
    IOCP之客户端及消息传递
    IOCP简单实现
    Charles V4系列更新 | 绿色特别版 | 视频教程
    Charles 3.11.5 绿色特别版
    VC运行库合集2005/2008/2010/2012/2013/2015
    手游测试之《弱网测试》
    后端性能测试不可不知的二三事
    linux性能指标及分析工具
    Shell笔记-04
  • 原文地址:https://www.cnblogs.com/lixingli/p/5165949.html
Copyright © 2011-2022 走看看