Python的迭代器和生成器使用實(shí)例
一、迭代器Iterators
迭代器僅是一容器對(duì)象,它實(shí)現(xiàn)了迭代器協(xié)議。它有兩個(gè)基本方法:
1)next方法
返回容器的下一個(gè)元素
2)__iter__方法
返回迭代器自身
迭代器可使用內(nèi)建的iter方法創(chuàng)建,見(jiàn)例子:
>>> 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
--------------------
結(jié)果:
3
2
1
0
二、生成器Generators
從Python2.2起,生成器提供了一種簡(jiǎn)潔的方式幫助返回列表元素的函數(shù)來(lái)完成簡(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')
例子:
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()
--------------------
結(jié)果:
powering 1
adding to 1
3
powering 4
adding to 4
7
保持代碼簡(jiǎn)單,而不是數(shù)據(jù)。
注意:寧可有大量簡(jiǎn)單的可迭代函數(shù),也不要一個(gè)復(fù)雜的一次只計(jì)算出一個(gè)值的函數(shù)。
例子:
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")
--------------------
結(jié)果:
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
- 深入講解Python中的迭代器和生成器
- python的迭代器與生成器實(shí)例詳解
- Python中生成器和迭代器的區(qū)別詳解
- 舉例講解Python中的迭代器、生成器與列表解析用法
- 詳解Python3中的迭代器和生成器及其區(qū)別
- 老生常談Python之裝飾器、迭代器和生成器
- 解析Python中的生成器及其與迭代器的差異
- Python中的迭代器與生成器高級(jí)用法解析
- python生成器,可迭代對(duì)象,迭代器區(qū)別和聯(lián)系
- Python 深入理解yield
- 詳解Python3中yield生成器的用法
- Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語(yǔ)句操作示例
相關(guān)文章
Python實(shí)現(xiàn)合并兩個(gè)列表的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)合并兩個(gè)列表的方法,結(jié)合實(shí)例形式對(duì)比分析了常見(jiàn)的Python列表合并操作技巧,需要的朋友可以參考下2018-05-05
pytorch 調(diào)整某一維度數(shù)據(jù)順序的方法
今天小編就為大家分享一篇pytorch 調(diào)整某一維度數(shù)據(jù)順序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python+Flask編寫(xiě)一個(gè)簡(jiǎn)單的行人檢測(cè)API
Flask是一個(gè)微型的Python開(kāi)發(fā)的Web框架,基于Werkzeug WSGI工具箱和Jinja2模板引擎。本文將利用Flask框子編寫(xiě)一個(gè)簡(jiǎn)單的行人檢測(cè)API,感興趣的可以了解一下2022-03-03
詳解Django之a(chǎn)uth模塊(用戶認(rèn)證)
這篇文章主要介紹了詳解Django之a(chǎn)uth模塊(用戶認(rèn)證),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
基于Opencv制作的美顏相機(jī)帶你領(lǐng)略美顏特效的效果
最關(guān)于美顏類(lèi)相機(jī)最重要的是第一步:人臉檢測(cè),本篇文章中是采用openCV開(kāi)源庫(kù)實(shí)現(xiàn),文中給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09
解決.ui文件生成的.py文件運(yùn)行不出現(xiàn)界面的方法
今天小編就為大家分享一篇解決.ui文件生成的.py文件運(yùn)行不出現(xiàn)界面的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python tempfile模塊學(xué)習(xí)筆記(臨時(shí)文件)
這篇文章主要介紹了Python tempfile模塊學(xué)習(xí)筆記,著重講解了模塊下的幾個(gè)函數(shù),需要的朋友可以參考下2014-05-05
python中for循環(huán)輸出列表索引與對(duì)應(yīng)的值方法
今天小編就為大家分享一篇python中for循環(huán)輸出列表索引與對(duì)應(yīng)的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Python實(shí)現(xiàn)多圖繪制系統(tǒng)的示例代碼
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)制作一個(gè)多圖繪制系統(tǒng),文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2023-09-09

