zoukankan      html  css  js  c++  java
  • python学习之- 生成器/迭代器

    列表生成式写法:
      [ i*2 for i in range(10) ]
    也可以带函数
      [ fun(i) for i in range(10) ]

    生成器:一边循环一边计算的机制称为生成器。在常用函数中,使用yield语句来返回结果,一次只返回一个结果。(可以节省内存,只有在调用的时候才会生成相应的数据 )
    特点:只记录当前的位置,只有一个__next__()方法。
    和列表的区别:生成器只有在调用的时候才会生成。
    生成器表达式:同列表解析语法,只不过是把列表解析的[]换成()
    比如:
    l = [ x*x for x in range(10)]
    g = ( x*x for x in range(10))
    这里:l就是一个列表,g是一个生成器
    生成器的打印方法:1:使用__next__()函数(python3),2:使用for循环
    赋值语句:a,b = b,a+b 相当于 t=(b,a+b) 为a=t[0],b=t[1]
    实例:斐波纳契数列:除第一个和第二个数外,任意一个数都可由前2个数相加得到。
    def fib(max):
    n,a,b = 0,0,1
    while n < max:
    #print(b)
    yield b
    a,b = b,a+b
    n += 1
    #return 'done'
    f = fib(100)
    print('sfsfsd')
    f.__next__() 使用生成器后,不会出现停顿,实现程序外部随时调用函数的值

    yield 通过在单线程下实现并发运算的效果
    send方法:唤醒并同时给yield 传值
    next方法:只唤醒yield
    生成器特点:

    生成器唯一注意的事项:生成器只能遍历一次。

    迭代对象:可以直接作用于for循环的对象统称为可迭代对象。(iterable) 如:列表,字典,集合等,还有生成器
    迭代器:可以被next()函数调用要么返回下一个值,要么引起StopIteration异常的对象称为迭代器:iterator
    内置方法:isinstance()方法可以判断一个对象是否是可迭代对象。
    可迭代对象都可以通过:iter()函数变为迭代器iterator
    a = [1,2,3]
    b = iter(a)
    print(b.__next__())
    print(b.__next__())
    迭代器的计算属于惰性计算,就是在需要返回下一个值时才会计算。
    迭代器可以表示一个无限大的数据流。(如全体自然数)列表是则是不可以。
    举例:
    #首先获得迭代器(iterator)对象
    it = iter([1,2,3,4,5])
    while True:
    try:
    #获得下一个值
    x = next(it)
    export StopIteration:
    # 遇到StopIteration就退出循环
    break

    举例:用生成器实现吃包子(基本的生产者/消费者模型)
     1 def consumer(name):  # 消费者
     2     print(' %s 准备吃包子' % (name))
     3     while True:
     4         baozi = yield
     5         print('%s 包子来了, %s 吃包子' % (baozi,name))
     6 
     7 def producer(name):  # 生产者
     8     c1 = consumer('jack')
     9     c2 = consumer('Anne')
    10     c1.__next__()
    11     c2.__next__()
    12     print('%s 开始做包子........' % name)
    13     for i in range(10):
    14         time.sleep(1)
    15         print('%s 做完2个包子' % name)
    16         c1.send(i)
    17         c2.send(i)
    18 
    19 # 执行生产者
    20 producer('vivi')
    View Code

    举例:使用生成器生成进度条

    def show_process(total):
        """使用生成器打印进度条"""
        curr = 0
        percent = 0
        print('开始打印进度条')
        while curr <= total:
            if int((curr / total) * 100) > percent:
                sys.stdout.write('#'*curr + '%s%%' % curr + '
    ')
                sys.stdout.flush()
                percent = int((curr / total) * 100)
            new_size = yield
            curr += new_size
    
    
    x = show_process(100)
    x.__next__()
    for i in range(1,101):
        x.send(1)
    

      

  • 相关阅读:
    PAT 1005. 继续(3n+1)猜想 (25)
    PAT 1004. 成绩排名 (20)
    android小游戏 飞机躲子弹
    PAT 1004. 成绩排名 (20) JAVA
    PAT 1003. 我要通过!(20) JAVA
    PAT 1003. 我要通过!(20)
    PAT 1002. 写出这个数 (20)
    NEERC, Northern Subregional Contest 2012 B 乱搞or搜索
    SGU 167 未解 dp
    Bucharest, Romania 2013 A Russian Dolls 贪心
  • 原文地址:https://www.cnblogs.com/zy6103/p/6825364.html
Copyright © 2011-2022 走看看