最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python迭代和迭代器詳解

 更新時間:2016年11月10日 08:45:05   作者:wswang  
本篇文章主要介紹Python的迭代和迭代器,可迭代對象的相關(guān)概念,有需要的小伙伴可以參考下

迭代器

迭代器(iterator)有時又稱游標(biāo)(cursor)是程式設(shè)計的軟件設(shè)計模式,可在容器物件(container,例如鏈表或陣列)上遍訪的界面,設(shè)計人員無需關(guān)心容器物件的內(nèi)存分配的實現(xiàn)細節(jié)。

摘自維基百科

也就是說迭代器類似于一個游標(biāo),卡到哪里就是哪里,可以通過這個來訪問某個可迭代對象的元素;同時,也不是只有Python有這個特性。比如C++的STL中也有這個,如 vector<int>::iterator it 。下面主要說一下Python中的可迭代對象和迭代器吧。

Python可迭代對象(Iterable)

Python中經(jīng)常使用 for 來對某個對象進行遍歷,此時被遍歷的這個對象就是可迭代對象,像常見的 list , tuple 都是。如果給一個準(zhǔn)確的定義的話,就是只要它定義了可以返回一個迭代器的 __iter__ 方法,或者定義了可以支持下標(biāo)索引的 __getitem__ 方法(這些雙下劃線方法會在其他章節(jié)中全面解釋),那么它就是一個可迭代對象。

Python迭代器(iterator)

迭代器是通過 next() 來實現(xiàn)的,每調(diào)用一次他就會返回下一個元素,當(dāng)沒有下一個元素的時候返回一個 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:

自己實現(xiàn)一個迭代器,如下(參見官網(wǎng)文檔):

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)

生成器是構(gòu)造迭代器的最簡單有力的工具,與普通函數(shù)不同的只有在返回一個值的時候使用 yield 來替代 return ,然后 yield 會自動構(gòu)建好 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

生成器最佳應(yīng)用場景是:你不想同一時間將所有計算出來的大量結(jié)果集分配到內(nèi)存當(dāng)中,特別是結(jié)果集里還包含循環(huán)。比方說,循環(huán)打印1000000個數(shù),我們一般會使用 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()

將可迭代對象轉(zhuǎn)化為迭代器。

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'

生成器表達式

和列表推導(dǎo)式唯一的區(qū)別就是中括號換成了小括號,如下:

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

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

相關(guān)文章

  • 卸載所有通過pip安裝的Python包的方法總結(jié)(Windows系統(tǒng))

    卸載所有通過pip安裝的Python包的方法總結(jié)(Windows系統(tǒng))

    這篇文章主要介紹了卸載所有通過pip安裝的Python包的方法總結(jié)(Windows系統(tǒng)),文中通過代碼示例和圖文講解的非常詳細,并具有一定的參考價值,需要的朋友可以參考下
    2024-08-08
  • python末尾逗號導(dǎo)致返回結(jié)果是一個元組的問題

    python末尾逗號導(dǎo)致返回結(jié)果是一個元組的問題

    在Python中,除非特別需要返回或傳參元組,一般不推薦在語句末尾添加逗號,應(yīng)該注意檢查是否存在末尾逗號導(dǎo)致的這些副作用,這篇文章主要介紹了python末尾逗號導(dǎo)致返回結(jié)果是一個元組,需要的朋友可以參考下
    2023-09-09
  • 在自動化中用python實現(xiàn)鍵盤操作的方法詳解

    在自動化中用python實現(xiàn)鍵盤操作的方法詳解

    今天小編就為大家分享一篇在自動化中用python實現(xiàn)鍵盤操作的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python中線程和進程有何區(qū)別

    python中線程和進程有何區(qū)別

    在本篇文章里小編給大家整理的是一篇關(guān)于python中線程和進程的區(qū)別相關(guān)知識點,有需要的朋友們可以參考下。
    2020-06-06
  • 一文帶你了解Python中的type,isinstance和issubclass

    一文帶你了解Python中的type,isinstance和issubclass

    這篇文章主要為大家詳細介紹了Python中的type、isinstance和issubclass的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-01-01
  • Python的iOS自動化打包實例代碼

    Python的iOS自動化打包實例代碼

    這篇文章主要給大家介紹了關(guān)于Python的iOS自動化打包的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Pycharm?cannot?set?up?a?python?SDK問題的原因及解決方法

    Pycharm?cannot?set?up?a?python?SDK問題的原因及解決方法

    這篇文章主要給大家介紹了關(guān)于Pycharm?cannot?set?up?a?python?SDK問題的原因及解決方法,這個問題已經(jīng)不是第一次出現(xiàn)了,所以干脆總結(jié)下,需要的朋友可以參考下
    2022-06-06
  • python實現(xiàn)一個簡單RPC框架的示例

    python實現(xiàn)一個簡單RPC框架的示例

    本文將會使用Python實現(xiàn)一個最簡單的RPC框架,不具有實用意義,但可以讓你清醒地理解RPC框架的幾個組成部分,只是比看Python自帶的xmlrpc清晰。
    2020-10-10
  • python實現(xiàn)機器人卡牌

    python實現(xiàn)機器人卡牌

    這篇文章主要為大家詳細介紹了python實現(xiàn)機器人卡牌,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • python求最大連續(xù)子數(shù)組的和

    python求最大連續(xù)子數(shù)組的和

    這篇文章主要介紹了python求最大連續(xù)子數(shù)組的和,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07

最新評論

江孜县| 丹寨县| 汉源县| 枣强县| 桦川县| 丹寨县| 广西| 城步| 韶山市| 潼南县| 滦平县| 伊川县| 寻甸| 冀州市| 望奎县| 洛宁县| 平阳县| 通榆县| 翁牛特旗| 上饶县| 河池市| 莒南县| 涟水县| 泽州县| 隆德县| 华宁县| 淮北市| 观塘区| 新干县| 甘孜| 台东市| 饶平县| 沁阳市| 平罗县| 长兴县| 内江市| 巴青县| 隆林| 哈巴河县| 桐庐县| 顺义区|