你好,游客 登录 注册 搜索
背景:
阅读新闻

Python迭代器和生成器

[日期:2016-08-21] 来源:Linux社区  作者:pyer [字体: ]

迭代器是一个实现迭代器协议的容器对象。它基于next()__iter__()两个方法。

class IterDemo(object):
 
    def __init__(self, stop):
        self.start = 0
        self.stop = stop
 
    def next(self):
        if self.start == self.stop:
            raise StopIteration
        self.start += 1
        return self.start
 
    def __iter__(self):
        return self

>>> from iter_demo import IterDemo
>>> type(IterDemo(10))
<class 'iter_demo.IterDemo'>
>>> print [val for val in IterDemo(10)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成器是一个返回生成迭代器的方法。generator iterator
A function which returns a generator iterator. It looks like a normal function except that it contains yield expressions for producing a series of values usable in a for-loop or that can be retrieved one at a time with the next() function.
一个返回生成迭代器的方法。它看起来像一个正常的方法,但是它包含一个yield表达式使得它能够在for循环中实时生产出一个可以用的值,并且也可以通过next()方法在此次迭代中接收值。
Usually refers to a generator function, but may refer to a generator iterator in some contexts. In cases where the intended meaning isn’t clear, using the full terms avoids ambiguity.
通常是提及的生成器方法,很多情况下就是提及的生成迭代器。在上下文不是很明显的情况下使用完成的表述能避免歧义。

>>> def fibonacci():
...     a, b = 0, 1
...     while True:
...         yield b
...         a, b = b, a + b
... 
>>> fibonacci()
<generator object fibonacci at 0xb7352d74>

生成器中的方法:

  • next():返回容器的下一个项目
  • send():可以将一个值传入容器中并返回下一个项目
  • throw():允许客户端传入要抛出的类型异常
  • close():抛出一个GeneratorExit异常

协同程序是可以挂起、恢复,并且有多个进入点的函数。

列表推导

>>> [val for val in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

生成器表达式 genexp

>>> (val for val in range(10))
<generator object <genexpr> at 0xb7352d74>
>>> [x for x in (val for val in range(10))]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

itertools模块
islice:窗口迭代器

>>> import itertools
>>> input_val = 'a,b,c,d,e,f,g,h,i,j,k'
>>> def starting_return(num):
...     for x in itertools.islice(input_val.split(','), num, None):
...         yield x
...
>>> starting_return(2)
<generator object starting_return at 0xb71e9054>
>>> [val for val in starting_return(2)]
['c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
>>> [val for val in starting_return(5)]
['f', 'g', 'h', 'i', 'j', 'k']
>>> [val for val in starting_return(0)]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']

tee:往返式迭代器

......

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-08/134453.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款