這篇文章主要講解了“python迭代、可迭代、迭代器舉例分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“python迭代、可迭代、迭代器舉例分析”吧!
下面我們通過斐波那契數列類的案例來詳細了解迭代器、生成器。
class Fib(object): # count表示生成斐波那契數列的個數 def __init__(self, count): self.count = count # 保存前兩個值 self.x = 0 self.y = 1 # 記錄生成數列的下標 self.index = 0 # 聲明Fib類是可迭代的 def __iter__(self): return self # 生成下一個數 def __next__(self): if self.index < self.count: result = self.x self.x, self.y = self.y, self.x + self.y self.index += 1 return result else: raise StopIteration # 創建迭代器 fib = Fib(6) # 獲取迭代器下一個值 print(next(fib)) # 遍歷迭代器其余的值 for value in fib: print(value) print(fib) ll = (i for i in range(10)) print(ll) out: 0 1 1 2 3 5 <__main__.Fib object at 0x000001E493DF5700> <generator object <genexpr> at 0x000001E493936430>
迭代器指有__iter__方法的函數或類運行或創建實例后生成的命名空間。打印迭代器顯示的就是某某對象在內存某處,迭代器實質是一個內存地址,通過特定的方法訪問該地址可以獲得相應的數據。
緊接著前面的代碼,測試下列代碼。
fib1 = Fib(6) fib2 = Fib(5) print(fib1) print(fib2) out: <__main__.Fib object at 0x000001AD3E445700> <__main__.Fib object at 0x000001AD3E48A4F0>
可以看到fib1和fib2雖然內部代碼相同,但由于它們的參數不同所以它們有不同的命名空間,那么它們就是不同的迭代器。
生成器指獲取迭代器內部數據的方法或函數。注意方法和函數本身不是生成器,只有執行后有命名空間且可以返回值的才是生成器。
def even(n): # 定義一個返回值是偶數的生成器,值范圍在0至n之間 i = 0 while i <= n: if i % 2 == 0: yield i i += 1 print('__iter__' in dir(even)) print('__next__' in dir(even)) num = even(5) print('__iter__' in dir(num)) print('__next__' in dir(num)) out: False False True True
生成器有2種:
通過__next__方法return返回值。例子是上面的Fib類。
通過yield或yield from語句返回值。例子是上面的even函數。有yield或yield from語句的函數在執行后會自動生成__iter__方法和__next__方法。
感謝各位的閱讀,以上就是“python迭代、可迭代、迭代器舉例分析”的內容了,經過本文的學習后,相信大家對python迭代、可迭代、迭代器舉例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。