最近更新|軟件分類|單機(jī)游戲|軟件專題|手機(jī)版|軟件發(fā)布 Python的迭代器和生成器哪個(gè)好 Python的迭代器和生成器怎么樣
首頁(yè)>編程開發(fā)>Python的迭代器和生成器哪個(gè)好 Python的迭代器和生成器怎么樣

Python的迭代器和生成器哪個(gè)好 Python的迭代器和生成器怎么樣

我要評(píng)論2017/09/07 16:51:56來源:9553下載編輯:

Python是一款不錯(cuò)的軟件,很多朋友都想知道Python的迭代器和生成器哪個(gè)好,一起來看看吧。

Python的迭代器和生成器哪個(gè)好

Python的迭代器和生成器哪個(gè)好 Python的迭代器和生成器怎么樣

使用迭代器的優(yōu)點(diǎn)

  對(duì)于原生支持隨機(jī)訪問的數(shù)據(jù)結(jié)構(gòu)(如tuple、list),迭代器和經(jīng)典for循環(huán)的索引訪問相比并無優(yōu)勢(shì),反而丟失了索引值(可以使用內(nèi)建函數(shù)enumerate()找回這個(gè)索引值)。但對(duì)于無法隨機(jī)訪問的數(shù)據(jù)結(jié)構(gòu)(比如set)而言,迭代器是唯一的訪問元素的方式。

  另外,迭代器的一大優(yōu)點(diǎn)是不要求事先準(zhǔn)備好整個(gè)迭代過程中所有的元素。迭代器僅僅在迭代到某個(gè)元素時(shí)才計(jì)算該元素,而在這之前或之后,元素可以不存在或者被銷毀。這個(gè)特點(diǎn)使得它特別適合用于遍歷一些巨大的或是無限的集合,比如幾個(gè)G的文件,或是斐波那契數(shù)列等等。

  迭代器更大的功勞是提供了一個(gè)統(tǒng)一的訪問集合的接口,只要定義了__iter__()方法對(duì)象,就可以使用迭代器訪問。

  迭代器有兩個(gè)基本的方法

  next方法:返回迭代器的下一個(gè)元素

  __iter__方法:返回迭代器對(duì)象本身

  一、迭代器Iterators

  迭代器僅是一容器對(duì)象,它實(shí)現(xiàn)了迭代器協(xié)議。它有兩個(gè)基本方法:

  1)next方法

  返回容器的下一個(gè)元素

  2)__iter__方法

  返回迭代器自身

  迭代器可使用內(nèi)建的iter方法創(chuàng)建,見例子:

  >>> i = iter('abc')

  >>> i.next()

  'a'

  >>> i.next()

  'b'

  >>> i.next()

  'c'

  >>> i.next()

  Traceback (most recent call last):

  File "", line 1, in

  StopIteration:

  class MyIterator(object):

  def __init__(self, step):

  self.step = step

  def next(self):

  """Returns the next element."""

  if self.step==0:

  raise StopIteration

  self.step-=1

  return self.step

  def __iter__(self):

  """Returns the iterator itself."""

  return self

  for el in MyIterator(4):

  print el

  結(jié)果:

  3

  2

  1

  0

  二、生成器Generators

  從Python2.2起,生成器提供了一種簡(jiǎn)潔的方式幫助返回列表元素的函數(shù)來完成簡(jiǎn)單和有效的代碼。

  它基于yield指令,允許停止函數(shù)并立即返回結(jié)果。

  此函數(shù)保存其執(zhí)行上下文,如果需要,可立即繼續(xù)執(zhí)行。

  例如Fibonacci函數(shù):

  def fibonacci():

  a,b=0,1

  while True:

  yield b

  a,b = b, a+b

  fib=fibonacci()

  print fib.next()

  print fib.next()

  print fib.next()

  print [fib.next() for i in range(10)]

  結(jié)果:

  1

  1

  2

  [3, 5, 8, 13, 21, 34, 55, 89, 144, 233]

  PEP Python Enhancement Proposal Python增強(qiáng)建議

  tokenize模塊

  >>> import tokenize

  >>> reader = open('c:/temp/py1.py').next

  >>> tokens=tokenize.generate_tokens(reader)

  >>> tokens.next()

  (1, 'class', (1, 0), (1, 5), 'class MyIterator(object):/n')

  >>> tokens.next()

  (1, 'MyIterator', (1, 6), (1, 16), 'class MyIterator(object):/n')

  >>> tokens.next()

  (51, '(', (1, 16), (1, 17), 'class MyIterator(object):/n')

關(guān)鍵詞: Python