Dq

Python的迭代器和生成器哪个好 Python的迭代器和生成器怎么样

发布时间:2017/09/07 16:51:56来源:

Python是一款不错的软件,很多朋友都想知道Python的迭代器和生成器哪个好,一起来看看吧。

Python的迭代器和生成器哪个好

Python的迭代器和生成器哪个好 Python的迭代器和生成器怎么样

使用迭代器的优点

  对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。

  另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。

  迭代器更大的功劳是提供了一个统一的访问集合的接口,只要定义了__iter__()方法对象,就可以使用迭代器访问。

  迭代器有两个基本的方法

  next方法:返回迭代器的下一个元素

  __iter__方法:返回迭代器对象本身

  一、迭代器Iterators

  迭代器仅是一容器对象,它实现了迭代器协议。它有两个基本方法:

  1)next方法

  返回容器的下一个元素

  2)__iter__方法

  返回迭代器自身

  迭代器可使用内建的iter方法创建,见例子:

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

  结果:

  3

  2

  1

  0

  二、生成器Generators

  从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。

  它基于yield指令,允许停止函数并立即返回结果。

  此函数保存其执行上下文,如果需要,可立即继续执行。

  例如Fibonacci函数:

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

  结果:

  1

  1

  2

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

  PEP Python Enhancement Proposal Python增强建议

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