亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python迭代和迭代器詳解

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

迭代器

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

摘自維基百科

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

Python可迭代對(duì)象(Iterable)

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

Python迭代器(iterator)

迭代器是通過 next() 來實(shí)現(xiàn)的,每調(diào)用一次他就會(huì)返回下一個(gè)元素,當(dāng)沒有下一個(gè)元素的時(shí)候返回一個(gè) StopIteration 異常,所以實(shí)際上定義了這個(gè)方法的都算是迭代器。可以用通過下面例子來體驗(yàn)一下迭代器:

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:

自己實(shí)現(xiàn)一個(gè)迭代器,如下(參見官網(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)造迭代器的最簡(jiǎn)單有力的工具,與普通函數(shù)不同的只有在返回一個(gè)值的時(shí)候使用 yield 來替代 return ,然后 yield 會(huì)自動(dòng)構(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)用場(chǎng)景是:你不想同一時(shí)間將所有計(jì)算出來的大量結(jié)果集分配到內(nèi)存當(dāng)中,特別是結(jié)果集里還包含循環(huán)。比方說,循環(huán)打印1000000個(gè)數(shù),我們一般會(huì)使用 xrange() 而不是 range() ,因?yàn)榍罢叻祷氐氖巧善?,后者返回的是列表(列表消耗大量空間)。

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()

將可迭代對(duì)象轉(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á)式

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

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

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

相關(guān)文章

  • python實(shí)現(xiàn)四人制撲克牌游戲

    python實(shí)現(xiàn)四人制撲克牌游戲

    這篇文章主要介紹了python實(shí)現(xiàn)四人制撲克牌游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • python numpy數(shù)組中的復(fù)制知識(shí)解析

    python numpy數(shù)組中的復(fù)制知識(shí)解析

    這篇文章主要介紹了python numpy數(shù)組中的復(fù)制知識(shí)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python畫柱狀圖--不同顏色并顯示數(shù)值的方法

    python畫柱狀圖--不同顏色并顯示數(shù)值的方法

    今天小編就為大家分享一篇python畫柱狀圖--不同顏色并顯示數(shù)值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python檢查字符串是否是正確ISBN的方法

    python檢查字符串是否是正確ISBN的方法

    這篇文章主要介紹了python檢查字符串是否是正確ISBN的方法,涉及Python針對(duì)字符串的相關(guān)操作技巧,需要的朋友可以參考下
    2015-07-07
  • Python實(shí)現(xiàn)類繼承實(shí)例

    Python實(shí)現(xiàn)類繼承實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)類繼承實(shí)例,需要的朋友可以參考下
    2014-07-07
  • python進(jìn)度條庫tqdm使用記錄(特點(diǎn)和用法)

    python進(jìn)度條庫tqdm使用記錄(特點(diǎn)和用法)

    tqdm是一個(gè)Python庫,用于在命令行界面中創(chuàng)建美觀的進(jìn)度條,以跟蹤代碼中循環(huán)、迭代和任務(wù)的執(zhí)行進(jìn)度,本文給大家介紹python進(jìn)度條庫tqdm使用記錄,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • 梳理總結(jié)Python開發(fā)中需要摒棄的18個(gè)壞習(xí)慣

    梳理總結(jié)Python開發(fā)中需要摒棄的18個(gè)壞習(xí)慣

    大家好,今天給大家分享 18 個(gè) Python 初學(xué)者常有的壞習(xí)慣,這些壞習(xí)慣不僅影響 Python 代碼的可讀性,而且 影響 Python 的運(yùn)行性能,摒棄這些壞習(xí)慣并以 Pythonic 的方式編寫代碼,提高的不僅僅是你的代碼質(zhì)量,也給閱讀代碼的人留下好印象
    2022-01-01
  • python字典和JSON格式的轉(zhuǎn)換方式

    python字典和JSON格式的轉(zhuǎn)換方式

    這篇文章主要介紹了python字典和JSON格式的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python繪圖模塊?turtle案例代碼

    Python繪圖模塊?turtle案例代碼

    turtle庫是Python語言中一個(gè)很流行的繪制圖像的函數(shù)庫,想象一個(gè)小烏龜,在一個(gè)橫軸為x、縱軸為y的坐標(biāo)系原點(diǎn),(0,0)開始,它根據(jù)一組函數(shù)指令的控制,在這個(gè)平面坐標(biāo)系中移動(dòng),從而在它爬行的路徑上繪制了圖形,本文介紹Python繪圖模塊turtle,感興趣的朋友一起看看吧
    2023-01-01
  • python實(shí)戰(zhàn)之90行代碼寫個(gè)猜數(shù)字游戲

    python實(shí)戰(zhàn)之90行代碼寫個(gè)猜數(shù)字游戲

    這篇文章主要介紹了python實(shí)戰(zhàn)之90行代碼寫個(gè)猜數(shù)字,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論