首页 未命名正文

linux编程_Python迭代器,可迭代工具,生成器

云返利网 未命名 2020-05-26 09:06:52 14 0

迭代器

迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计职员无需体贴容器物件的内存分配的实现细节。

摘自维基百科

也就是说迭代器类似于一个游标,卡到那里就是那里,可以通过这个来访问某个可迭代工具的元素;同时,也不是只有Python有这个特征。好比C++的STL中也有这个,如vector<int>::iterator it。下面主要说一下Python中的可迭代工具和迭代器吧。

Python可迭代工具(Iterable)

Python中经常使用for来对某个工具举行遍历,此时被遍历的这个工具就是可迭代工具,像常见的list,tuple都是。若是给一个准确的界说的话,就是只要它界说了可以返回一个迭代器的__iter__方式,或者界说了可以支持下标索引的__getitem__方式(这些双下划线方式会在其他章节中周全注释),那么它就是一个可迭代工具。

Python迭代器(iterator)

迭代器是通过next()来实现的,每挪用一次他就会返回下一个元素,当没有下一个元素的时刻返回一个StopIteration异常,以是实际上界说了这个方式的都算是迭代器。可以用通过下面例子来体验一下迭代器:

In [38]: s = 'ab'

In [39]: it = iter(s)

In [40]: it
Out[40]: <iterator at 0x1068e6d50>

In [41]: print it
<iterator object at 0x1068e6d50>

In [42]: it.next()
Out[42]: 'a'

In [43]: it.next()
Out[43]: 'b'

In [44]: it.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-44-54f0920595b2> in <module>()
----> 1 it.next()

StopIteration:

自己实现一个迭代器,如下(参见官网文档):

class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def next(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]

rev = Reverse('spam')
for char in rev:
    print char

[output]
m
a
p
s

生成器(Generators)

生成器是组织迭代器的最简朴有力的工具,与通俗函数差别的只有在返回一个值的时刻使用yield来替换return,然后yield会自动构建好next()iter()。是不是很省事。例如:

def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]

>>> for char in reverse('golf'):
...     print char
...
f
l
o
g

生成器最佳应用场景是:你不想同一时间将所有计算出来的大量效果集分配到内存当中,特别是效果集里还包罗循环。比方说,循环打印1000000个数,我们一样平常会使用xrange()而不是range(),由于前者返回的是生成器,后者返回的是列表(列表消耗大量空间)。

Help on built-in function range in module __builtin__:

range(...)
    range(stop) -> list of integers
    range(start, stop[, step]) -> list of integers

    Return a list containing an arithmetic progression of integers.
    range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
    When step is given, it specifies the increment (or decrement).
    For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
    These are exactly the valid indices for a list of 4 elements.

class xrange(object)
 |  xrange(stop) -> xrange object
 |  xrange(start, stop[, step]) -> xrange object
 |
 |  Like range(), but instead of returning a list, returns an object that
 |  generates the numbers in the range on demand.  For looping, this is
 |  slightly faster than range() and more memory efficient.

iter()

将可迭代工具转化为迭代器。

In [113]: s = 'abc'

In [114]: s.next()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-114-5e5e6532ea26> in <module>()
----> 1 s.next()

AttributeError: 'str' object has no attribute 'next'

In [115]: it = iter(s)

In [116]: it.next()
Out[116]: 'a'

生成器表达式

和列表推导式唯一的区别就是中括号换成了小括号,如下:

In [119]: num = (i for i in range(10))

In [120]: sum(num)
Out[120]: 45

参考

  1. Python官方文档

零基础若何入门Python http://www.linuxidc.com/Linux/2016-10/136485.htm

Ubuntu 14.04安装Python 3.3.5  http://www.linuxidc.com/Linux/2014-05/101481.htm

CentOS上源码安装Python3.4  http://www.linuxidc.com/Linux/2015-01/111870.htm

《Python焦点编程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python开发手艺详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码] http://www.linuxidc.com/Linux/2013-11/92693.htm

在CentOS 6.5上安装Python2.7  http://www.linuxidc.com/Linux/2016-10/136206.htm

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)