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()来忽略一些值
    

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

  • 相关阅读:
    Chapter 03Using SingleRow Functions to Customize Output(03)
    Chapter 03Using SingleRow Functions to Customize Output(01)
    Chapter 04Using Conversion Functions and Conditional ExpressionsNesting Functions
    Chapter 04Using Conversion Functions and Conditional ExpressionsGeneral Functions
    Chapter 11Creating Other Schema Objects Index
    传奇程序员John Carmack 访谈实录 (zz.is2120)
    保持简单纪念丹尼斯里奇(Dennis Ritchie) (zz.is2120.BG57IV3)
    王江民:传奇一生 (zz.is2120)
    2011台湾游日月潭
    2011台湾游星云大师的佛光寺
  • 原文地址:https://www.cnblogs.com/lixingli/p/5165949.html
Copyright © 2011-2022 走看看