這篇“Python中迭代器與生成器怎么使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python中迭代器與生成器怎么使用”文章吧。
內置有__iter__方法的都叫可迭代的對象。
Python內置str、list、tuple、dict、set、file都是可迭代對象。
x = 1.__iter__ # SyntaxError: invalid syntax # 以下都是可迭代的對象 name = 'nick'.__iter__ print(type(name)) # 'method-wrapper'>
執行可迭代對象的__iter__方法,拿到的返回值就是迭代器對象。
只有字符串和列表都是依賴索引取值的,而其他的可迭代對象都是無法依賴索引取值的,只能使用迭代器對象。
內置有__iter__方法,執行該方法會拿到迭代器本身。
內置__next__方法,執行該方法會拿到迭代器對象中的一個值。
s = 'hello' iter_s = s.__iter__() print(type(iter_s)) # 'str_iterator'> iter_s為迭代器對象 while True: try: print(iter_s.__next__()) except StopIteration: break #hello
s = 'hello' iter_s = iter(s) # 創建迭代器對象 print(type(iter_s)) # iter_s為迭代器對象 while True: try: print(next(iter_s)) # 輸出迭代器的下一個元素 except StopIteration: break # hello
可迭代對象可以直接使用常規for語句進行遍歷
for循環稱為迭代器循環,in后必須是可迭代的對象。
#str
name = 'nick'
for x in name:
print(x)
#list
for x in [None, 3, 4.5, "foo", lambda: "moo", object, object()]:
print("{0} ({1})".format(x, type(x)))
#dict
d = {
'1': 'tasty',
'2': 'the best',
'3 sprouts': 'evil',
'4': 'pretty good'
}
for sKey in d:
print("{0} are {1}".format(sKey, d[sKey]))
#file
f = open('32.txt', 'r', encoding='utf-8')
for x in f:
print(x)
f.close()把一個類作為一個迭代器使用需要在類中實現兩個方法 __iter__() 與 __next__() 。
__iter__() 方法返回一個特殊的迭代器對象, 這個迭代器對象實現了 __next__() 方法并通過 StopIteration 異常標識迭代的完成。
__next__() 方法會返回下一個迭代器對象。
StopIteration 異常用于標識迭代的完成,防止出現無限循環的情況,在 __next__() 方法中我們可以設置在完成指定循環次數后觸發 StopIteration 異常來結束迭代。
創建一個返回數字的迭代器,初始值為 1,逐步遞增 1,在 20 次迭代后停止執行:
class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 20: x = self.a self.a += 1 return x else: raise StopIteration myclass = MyNumbers() myiter = iter(myclass) for x in myiter: print(x)
class Range: def __init__(self, n, stop, step): self.n = n self.stop = stop self.step = step def __next__(self): if self.n >= self.stop: raise StopIteration x = self.n self.n += self.step return x def __iter__(self): return self for i in Range(1, 7, 3): print(i) #1 #4
class Fib:
def __init__(self):
self._a = 0
self._b = 1
def __iter__(self):
return self
def __next__(self):
self._a, self._b = self._b, self._a + self._b
return self._a
f1 = Fib()
for i in f1:
if i > 100:
break
print('%s ' % i, end='')
# 1 1 2 3 5 8 13 21 34 55 89在 Python 中,使用了 yield 的函數被稱為生成器(generator)。
跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用于迭代操作,更簡單點理解生成器就是一個迭代器。
在調用生成器運行的過程中,每次遇到 yield 時函數會暫停并保存當前所有的運行信息,返回 yield 的值, 并在下一次執行 next() 方法時從當前位置繼續運行。
調用一個生成器函數,返回的是一個迭代器對象。
yield后面可以加多個數值(可以是任意類型),但返回的值是元組類型的。
提供一種自定義迭代器的方式
yield可以暫停住函數,并提供當前的返回值
import sys def fibonacci(n): # 函數 - 斐波那契 a, b, counter = 0, 1, 0 while True: if counter > n: return yield a a, b = b, a + b counter += 1 f = fibonacci(10) #f 是一個生成器 print(type(f)) # 'generator'> while True: try: print(next(f), end=" ") except StopIteration: sys.exit()
yield和return:
相同點:兩者都是在函數內部使用,都可以返回值,并且返回值沒有類型和個數的限制
不同點:return只能返回一次值;yield可以返回多次值
def my_range(start, stop, step=1):
while start < stop:
yield start
start += 1
g = my_range(0, 3)
print(f"list(g): {list(g)}")復雜版本:
def range(*args, **kwargs):
if not kwargs:
if len(args) == 1:
count = 0
while count < args[0]:
yield count
count += 1
if len(args) == 2:
start, stop = args
while start < stop:
yield start
start += 1
if len(args) == 3:
start, stop, step = args
while start < stop:
yield start
start += step
else:
step = 1
if len(args) == 1:
start = args[0]
if len(args) == 2:
start, stop = args
for k, v in kwargs.items():
if k not in ['start', 'step', 'stop']:
raise ('參數名錯誤')
if k == 'start':
start = v
elif k == 'stop':
stop = v
elif k == 'step':
step = v
while start < stop:
yield start
start += step
for i in range(3):
print(i) # 0,1,2
for i in range(99, 101):
print(i) # 99,100
for i in range(1, 10, 3):
print(i) # 1,4,7
for i in range(1, step=2, stop=5):
print(i) # 1,3
for i in range(1, 10, step=2):
print(i) # 1,3,5,7,9把列表推導式的[]換成()就是生成器表達式 。
優點:比起列表推導式,可以省內存,一次只產生一個值在內存中
t = (i for i in range(10)) print(t) # <generator object at 0x00000000026907B0> print(next(t)) # 0 print(next(t)) # 1
舉例:
with open('32.txt', 'r', encoding='utf8') as f:
nums = [len(line) for line in f] # 列表推導式相當于直接給你一筐蛋
print(max(nums)) # 2
with open('32.txt', 'r', encoding='utf8') as f:
nums = (len(line) for line in f) # 生成器表達式相當于給你一只老母雞。
print(max(nums)) # ValueError: I/O operation on closed file.以上就是關于“Python中迭代器與生成器怎么使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。