生成器
延遲操作,在需要的時候,呼叫它,才產生一個元素,節約空間資源,不立即產生全部結果
比如yield
看一個斐波那契數列的例子
#斐波那契
def fib(length):
a,b=0,1
n = 0
while n<length:
yield b #到此停止 相當于return 但是下次呼叫next時會從上次yield的位置繼續執行
n +=1
a,b = b,a+b
return "沒有更多內容" #會通過報錯來回傳
g = fib(10)
try:
print(next(g),next(g),next(g),next(g),next(g))
print(next(g),next(g),next(g),next(g),next(g))
print(next(g),next(g),next(g),next(g),next(g))
except Exception as e:
print(str(e))
生成器是一種特殊的迭代器,是可以迭代的
for i in fib(8):
print(i)
yield也有回傳值,可以呼叫send方法傳入回傳值
def f():
i=0
while i<10:
t = yield i #t就是send回來的值 i會yield出去
i+=1
print(t)
g = f()
#第一次呼叫必須先傳None
print(g.send(None))
print(g.send("哈哈")) #往生成器里面送值
print(g.send("呵呵"))
迭代器
1、迭代器是一個可以記住遍歷的位置的物件,
2、迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束,迭代器只能往前不會后退,
3、迭代器有兩個基本的方法:iter() 和 next(),
下面我們來自定義一個迭代器
#################自定義迭代器#############
class WordsIteror:
def __init__(self,string):
self.words = [ w.capitalize() for w in string.split()]
self.index = 0
def __next__(self):
if self.index == len(self.words):
raise StopIteration()
word = self.words[self.index]
self.index +=1
return word
class Words:
def __init__(self,string):
self.string = string
def __iter__(self):
return WordsIteror(self.string)
words = Words("I am Biningo Good morning")
i = iter(words) #__iter__()內置函式回傳的值
while True:
try:
print(next(i)) #呼叫__iter__()回傳的物件的__next__()方法
except:
print("Over!")
break
這是一個分割單詞的迭代器,呼叫next()則回傳下一個元素,自能前進
下面看一個元祖推導式生成迭代器
arr=(x for x in range(5)) #arr是一個迭代器型別
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/177767.html
標籤:Python
