码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器和生成器181030

时间:2018-10-30 21:58:12      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:判断   bre   collect   直接   next   斐波那契   ret   time   iterator   

一、列表生产式

[ i*2 for i in range(10) ]

二、生成器(generator)

生成器和列表的区别是生成器数据在调用时生成,不支持像列表一样可以切片等处理

  • 只有在调用时才会生成相应的数据
  • 只记录当前位置
  • 只有一个"next"方法

    1、生成器1

>>> (  i*2 for i in range(10)  )
>>> for i in b:
...     print(i)

2、生成器的next方法

>>> c = (  i*2 for i in range(10)  )
>>> c.__next__()
0
>>> c.__next__()
2
>>> c.__next__()
4

3、斐波那契数列

# Author:Li Dongfei
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return "done"
fib(100)

4、将斐波那契改为生成器

# Author:Li Dongfei
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return "done"
f = fib(100)
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())

5、捕获异常

# Author:Li Dongfei
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return "done"
f = fib(10)
while True:
    try:
        x = next(f)
        print('f:', x)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break

6、生成器的并行(生产者消费者模型)

# Author:Li Dongfei
import time
def consumer(name):  #消费者
    while True:
        baozi = yield
        print("包子[%s]来了,被[%s]吃了!" % (baozi, name))
def producer(name):  #生产者
    c = consumer(name)
    c.__next__()
    for i in range(10):
        time.sleep(1)
        print("做了1个包子!")
        c.send(i)  #将i send到consumer会被yield接受到并且赋值给baozi
producer("dongfei")

三、迭代器(Iterator)

  • 可以直接作用于for循环的对象统称为可迭代对象:Iterable
  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

    1、判断是否是可迭代对象

>>> from collections import Iterable
>>> isinstance([],Iterable)
True
>>> isinstance((),Iterable)
True
>>> isinstance('abc',Iterable)
True

2、判断是否是可迭代器对象

>>> from collections import Iterator
>>> isinstance(  ( x for x in range(5) ), Iterator  )
True

生成器一定是迭代器,但是迭代器不一定是生成器

3、使用iter()函数将list,dict,str等Iterable变成Iterator

>>> a = [1, 2, 3]
>>> b = iter(a)
>>> b.__next__()
1
>>> b.__next__()
2
>>> b.__next__()
3

迭代器和生成器181030

标签:判断   bre   collect   直接   next   斐波那契   ret   time   iterator   

原文地址:https://www.cnblogs.com/L-dongf/p/9879712.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!