Python的迭代器和生成器
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
相關文章
- 1.5.4 Python迭代器和生成器Python
- python迭代器和生成器的總結Python
- python3.7 迭代器和生成器Python
- python 生成器&迭代器Python
- Python之裝飾器、迭代器和生成器Python
- Python生成器、迭代器、可迭代物件Python物件
- 草根學Python(七) 迭代器和生成器Python
- PHP的迭代器和生成器PHP
- Python之可迭代物件、迭代器、生成器Python物件
- Python迭代器與生成器Python
- 簡單介紹python迭代器和生成器Python
- Python學習筆記 - 迭代器和生成器Python筆記
- Python迭代器&生成器&裝飾器Python
- Python的生成器和迭代器有什麼區別?Python
- python 中的迭代器和生成器簡單介紹Python
- 搞清楚 Python 的迭代器、可迭代物件、生成器Python物件
- Python語法—迭代器、生成器Python
- Python學習之路34-迭代器和生成器Python
- python_裝飾器——迭代器——生成器Python
- 什麼是Python的迭代器和生成器?(附程式碼)Python
- 迭代器,生成器
- 史上最全 Python 迭代器與生成器Python
- 一文徹底搞懂Python可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)的概念Python
- 迭代器和生成器區別是什麼?Python學習!Python
- Python基礎(四)——迭代器/物件,生成器Python物件
- 迭代器,生成器(generator)和Promise的“微妙”關係Promise
- Python迭代和迭代器詳解Python
- 《python-美藏篇》1.可迭代、迭代器與生成器Python
- Python 三目運算,列表解析,裝飾器,迭代器和生成器Python
- 可迭代物件 vs 迭代器 vs 生成器物件
- Python入門之迭代器與生成器的區別Python
- 生成器函式,迭代器函式
- 生成器與迭代器的區別
- 詳解python三大器——迭代器、生成器、裝飾器Python
- 淺談ES6中迭代器和生成器
- 【重溫基礎】13.迭代器和生成器
- Python系列(三):關於迭代器和生成器,你該瞭解這些Python
- Python3-流程控制語句、迭代器、生成器Python