目錄可以直接被 for 迴圈的物件稱為可迭代物件(iterable),意思就是可遍歷的。
from collections.abc import iterable, iterator
for i in 'abc':
print(i)
print(issubclass(str, iterable))
print(issubclass(str, iterator))
abc
true
false
可以被 next() 函式呼叫(也就是實現了 __iter__ 和 __next__ 方法)並不斷返回下乙個值的物件稱為迭代器(iterator),迭代器都
是可迭代物件,迭代器是訪問元素集合的一種方式,訪問時呼叫 next() 的時候才返回下乙個值,如果容器中沒有更多元素了,則丟擲 stopiteration
異常,所以它是惰性計算序列,更節省空間。
from collections.abc import iterable, iterator
# 迭代器
class foo:
def __init__(self):
self.prev = 0
self.curr = 1
def __iter__(self):
# print('iter')
return self
def __next__(self):
# print('next')
self.curr, self.prev = self.prev + self.curr, self.curr
return self.curr # 需要返回值給 i
foo = foo()
for i in foo:
if i > 20:
print(i)
break
print(i)
print(next(foo))
print(issubclass(foo, iterable))
print(issubclass(foo, iterator))
123
581321
34true
true
生成器(generator)都是迭代器的物件,所以本質上還是乙個迭代器,但是不需要自己像實現迭代器一樣自己去實現__iter__和__next__
方法,因為說過迭代器是一種訪問元素的方式所以需要自己實現,而生成器是乙個屬於generator類,內部已經實現兩個內建方法,也就是說生成器使
用較於迭代器更簡潔與高效。
from collections.abc import iterator
a = [i for i in range(10)]
b = (i for i in range(10))
print(f'列表生成式:')
print(f'生成器:')
print(next(b))
print(next(b))
print(issubclass(type(a), iterator))
print(issubclass(type(b), iterator))
列表生成式:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
生成器:at 0x03555470>01
false
true
生成器就是把演算法儲存在生成器裡面,每呼叫一次,裡面的迴圈才會執行一次然後中斷並返回值,不像的普通的迴圈一樣需要等到迴圈執行完畢才返回。
函式生成器和生成器使用起來也是沒有什麼區別,但是函式生成器需要顯示的使用 yield 關鍵字定義,在關鍵字後面跟需要返回的變數。
def foo():
prev = 0
curr = 1
while true:
curr, prev = prev + curr, curr
yield curr
foo = foo()
print(foo)
while true:
i = next(foo)
if i > 20:
print(i)
break
print(i)
print(next(foo))
print(next(foo))
123
581321
3455
函式生成器內部需要用 yield 進行接收引數,生成器物件使用 generator.send(arg) 進行傳參,呼叫send(x)給生成器傳值時,必須確保生成器已
經執行過一次next()呼叫,這樣會讓程式走到yield位置等待外部第2次呼叫。
generator.send(none)
next(generator)
def foo():
n = yield
for i in range(n):
yield i
foo = foo()
next(foo)
foo.send(10)
print(next(foo))
print(next(foo))
1
2
python第二章學習筆記
from math import print pi print e 3.141592653589793 2.718281828459045 print id 11 print id python print type 12 print type 1.2 140733182862288 2498184...
初學Python 第二章練習題
2 8 迴圈和操作符。建立乙個包含五個固定數值的列表和元組,輸出他們的和。然後修改 為接受使用者的輸入數值。while迴圈 for迴圈 2 9 迴圈和操作符。建立乙個包含五個固定數值的列表和元組,輸出他們的平均值。ps 重點在除法傳統的除法 對整型除法會捨去小數點部分,而地板除法 不管什麼型別的作數...
第二章筆記
1.遞迴查詢和迭代查詢 遞迴查詢是一條環路,直接想成遞迴的定義就行,你想查乙個 的ip,首先將這個 傳給它的本地dns,然後認為本地dns可以直接將ip給你,然後本地dns為了知道這個ip又詢問下個dns伺服器。從此可以看出,增加了被涉及的伺服器的資料,所以一般用迭代查詢,迭代查詢是你詢問完後給你下...