Python:迭代器、生成器(yield)、iter函數


# 首先理解迭代器(iterators),迭代器是⼀個讓程序員可以遍歷的⼀個容
# 器(特別是列表)的對象。然⽽,⼀個迭代器在遍歷並讀取⼀個容器的數據元素時,並不
# 會執⾏⼀個迭代。這里有三個部分要說明:
# 可迭代對象(Iterable)
# 迭代器(Iterator)
# 迭代(Iteration)
# 可迭代對象(Iterable):⼀個可迭代對象是Python中任意的對象,只要它定義了可以返回⼀個迭代器的__iter__
# ⽅法,或者定義了可以⽀持下標索引的__getitem__⽅法。簡單說,⼀個可迭代對象,就是任意的對象,只要它能給我們提供⼀個迭代器。
# 只要它定義了⼀個next(Python2) 或者__next__⽅法。就是⼀個迭代器。
# ⽣成器也是⼀種迭代器,但只能對其迭代⼀次。這是因為他們並沒有把所有的值存在
# 內存中,⽽是在運⾏時⽣成值。可使用for循環、傳遞給任意可進行迭代的函數和結構。
# 大多數時候,生成器是以函數來實現的,並不返回一個值,而是yield(暫且叫作”生出“)一個值。
1 def generator_function(): 2    """定義一個生成器函數"""
3    for i in range(10): 4       yield i 5 
6 #調用生成器,以證實是一個可迭代對象
7 # for item in generator_function():
8 # print(item)
# 許多Python 2⾥的標准庫函數都會返回列表,⽽Python 3都修改成了返回⽣成器,因為⽣成
# 器占⽤更少的內存資源。

1 # 計算斐波那契數列的⽣成器
2 def fibon(n): 3    a = b = 1
4    for i in range(n): 5       yield a 6       a, b = b, a + b 7 
8 for x in fibon(100):
9  print(x)
# 使用python的內置函數next()獲取序列的下一個元素,到最后一個元素時,會拋出一個StopIteration的異常
# 使用for循環獲取序列的下一個元素時,for循環會自動捕捉這個異常並停止調用next()。
1 def generator_function(): 2    for i in range(3): 3       yield i 4 
5 # gen = generator_function()
6 # print(next(gen))
7 # print(next(gen))
8 # print(next(gen))
9 # print(next(gen)) # 驗證,使用next()函數到所有值被yield完后會拋出一個StopIteration的異常

# 字符串類型也支持迭代,但不是迭代器,如下所示
my_string = "Michael"
#next(my_string) # 不是迭代器,不能使用next()函數,拋出TypeError。
# 但使用另一個內置函數iter()轉換后,可以使用next()函數迭代
my_iter = iter(my_string)
print(next(my_iter)) # 經過iter()內置函數轉換后,字符串對象可以迭代。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM