在使用列表時,直接將資料存入列表將會佔據大量空間,且復用率較低,為解決這個問題,這裡了解一下迭代器,從而建立一種資料產生的方式,以此來節省空間。
注意,這裡需要使用到內建函式__iter__,簡單理解為,使用了__iter__才會是乙個可迭代物件,關於這部分,我們可以對一些物件做一些判斷,從而清楚是不是可迭代物件,比如l1列表:
from collections.abc import iterable
# 判斷l1是否為可迭代物件
l1 = [i for i in range(4)]
print(isinstance(l1, iterable)) # 結果為true,確定為迭代物件
這裡我們使用__iter__()方法和__next__()方法來將元素取出。
l2 = l1.__iter__()
# l2 = iter(l1) # 和上面一句等價
print(next(l2))
print(l2.__next__()) # 和上面一句等價
print(next(l2))
在這裡我們實現了使用for迴圈來取出元素的方法,在了解這裡之後,我們開始做乙個自己的迭代器
# 構造迭代器
class newiter():
# 用於生成斐波那契數列
def __init__(self, num):
self.num = num
self.a = 0
self.b = 1
def __iter__(self):
# 建立可迭代物件
return self
def __next__(self):
while self.num > 0:
result = self.a
self.a, self.b = self.b, self.a + self.b
self.num -= 1
return result
# 迴圈結束後跳出
raise stopiteration
new_iter = newiter(5)
print(next(new_iter))
print(next(new_iter))
這裡引入生成器個概念,生成器能做到迭代器能做的所有事,由於自動建立了iter()和next()方法,生成器顯得特別簡潔。除了建立和儲存程式狀態的自動方法,當
發生器終結時,還會自動丟擲 stopiteration 異常。簡單理解他就是迭代器的一種!!使用yield即可實現。
# 生成器實現
def new_create(num):
# 用於生成斐波那契數列
a, b = 0, 1
while num > 0:
yield a
a, b = b, a+b
num -= 1
new_iter = new_create(5)
print(next(new_iter))
print(next(new_iter))
目的就是節省空間,提高復用率 python迭代器簡單理解
1 凡是可應用於for迴圈的物件都是可迭代 可迴圈 iterable 物件,例如字串 列表 元組 字典 集合等 2 凡是可應用於next 方法的物件都是迭代器 iterator 物件,迭代器 iterator 是乙個惰性計算的過程,只有在需要返回下乙個數值的時候才會被計算 這一過程跟生成器很像,都是...
python簡單理解迭代器,生成器,裝飾器
迭代器 是什麼 是乙個抽象的概念,任何物件,如果它實現了next方法和iter方法,就是迭代器。next方法要麼返回迭代中的下一項,要麼返回乙個stapiteration異常,iter方法要返回乙個迭代器物件,而它本身就是乙個迭代器物件,所有返回自己本身。作用 像我們提供乙個中間人即迭代器幫助我們迭...
理解Python的迭代器
首先,廖雪峰老師的教程中解釋了迭代器和生成器,這篇文章只是補充和我個人的總結。可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以被next 函式呼叫並不斷返回下乙個值的物件稱為迭代器 iterator 所有的iterable均可以通過內建函式iter 來轉變為iterator。對...