Python的迭代器和生成器

chszs發表於2009-01-24
版權宣告:本文為博主chszs的原創文章,未經博主允許不得轉載。 https://blog.csdn.net/chszs/article/details/3852669

Python的迭代器和生成器

一、迭代器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 “<string>”, line 1, in <string>
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`)

例子:
def power(values):
  for value in values:
  print `powering %s` %value
  yield value
def adder(values):
  for value in values:
  print `adding to %s` %value
  if value%2==0:
  yield value+3
  else:
  yield value+2
elements = [1,4,7,9,12,19]
res = adder(power(elements))
print res.next()
print res.next()
——————–
結果:
powering 1
adding to 1
3
powering 4
adding to 4
7

保持程式碼簡單,而不是資料。
注意:寧可有大量簡單的可迭代函式,也不要一個複雜的一次只計算出一個值的函式。

例子:
def psychologist():
  print `Please tell me your problems`
  while True:
  answer = (yield)
  if answer is not None:
  if answer.endswith(`?`):
  print (“Don`t ask yourself too much questions”)
  elif `good` in answer:
  print “A that`s good, go on”
  elif `bad` in answer:
  print “Don`t be so negative”
free = psychologist()
print free.next()
print free.send(`I feel bad`)
print free.send(“Why I shouldn`t ?”)
print free.send(“ok then i should find what is good for me”)
——————–
結果:
Please tell me your problems
None
Don`t be so negative
None
Don`t ask yourself too much questions
None
A that`s good, go on
None


相關文章