python3 第十八章 迭代器與生成器

2022-07-16 12:57:11 字數 2875 閱讀 9583

1、迭代器(iterator)

字串,列表或元組物件都可用於建立迭代器:

例項1:

basket = ['

', '

orange

', '

pear

', '

banana']

it = iter(basket) #

建立迭代器物件

#輸出迭代器的下乙個元素

print

(next(it))

#輸出迭代器的下乙個元素

print(next(it))

以上**,輸出:

orange

例項2:

basket = '

abc'

it = iter(basket) #

建立迭代器物件

print(next(it)) #

輸出迭代器的下乙個元素

print(next(it)) #

輸出迭代器的下乙個元素

以上**,輸出:

a

b

通常會和for語句搭配使用,如:

basket = '

abc'

it = iter(basket) #

建立迭代器物件

for n in

it:

print(n)

以上**,輸出:

a

bc

python中 list,truple,str,dict這些都可以被迭代,但他們並不是迭代器。為什麼?

因為和迭代器相比有乙個很大的不同,list/truple/map/dict這些資料的大小是確定的,也就是說有多少是可知的。但迭代器不是,迭代器不知道要執行多少次,所以可以理解為不知道有多少個元素,每呼叫一次next(),就會往下走一步,是惰性的。

判斷是不是可以迭代,用iterable

from collections import

iterable

print('

{} 是iterable?

', isinstance({}, iterable))

print('

() 是iterable?

', isinstance((), iterable))

print('

100 是iterable?

', isinstance(100, iterable))

以上**,輸出:

{} 是iterable? true

() 是iterable? true

100 是iterable? false

判斷是不是迭代器,用iterator

from collections import

iterator

print('

{} 是iterable?

', isinstance({}, iterator))

print('

() 是iterable?

', isinstance((), iterator))

print('

(x for x in range(10)) 是iterable?

', isinstance((x for x in range(10)), iterator))

以上**,輸出:

{} 是iterable? false

() 是iterable? false

(x for x in range(10)) 是iterable? true

凡是可以for迴圈的,都是iterable

凡是可以next()的,都是iterator

集合資料型別如list,truple,dict,str,都是itrable不是iterator,但可以通過iter()函式獲得乙個iterator物件

python中的for迴圈就是通過next實現的

for x in [1, 2, 3, 4, 5]:  

pass

等價於

#

先獲取iterator物件

it = iter([1, 2, 3, 4, 5])

while

true:

try:

#獲取下乙個值

x =next(it)

except

stopiteration:

#遇到stopiteration就退出迴圈

break

2、生成器

在 python 中,使用了 yield 的函式被稱為生成器(generator)。

def fibonacci(n):  #

生成器函式 - 斐波那契

a, b, counter = 0, 1, 0

while

true:

if counter >n:

return

yield

a a, b = b, a +b

counter += 1f = fibonacci(10) #

f 是乙個迭代器,由生成器返回生成

什麼情況下需要使用 yield?乙個函式 f,f 返回乙個 list,這個 list 是動態計算出來的(不管是數學上的計算還是邏輯上的讀取格式化),並且這個 list 會很大(無論是固定很大還是隨著輸入引數的增大而增大),這個時候,我們希望每次呼叫這個函式並使用迭代器進行迴圈的時候乙個乙個的得到每個 list 元素而不是直接得到乙個完整的 list 來節省記憶體,這個時候 yield 就很有用。

第十八章 發布與訂閱

通過subscribe命令,客戶端可以訂閱乙個或多個頻道,每當有其他客戶端向被訂閱的頻道傳送訊息,頻道的訂閱者都會收到訊息 通過psubscribe命令,客戶端可以訂閱乙個或多個模式,每當有其他客戶端向被訂閱的頻道傳送訊息,與該頻道相匹配的模式訂閱者也會收到 redisserver中用乙個字典儲存了...

python入到到實戰 第十八章

第十八章 django入門 建立專案 新建目錄learning log 切換到learning log下,執行 python m venv ll env,建立虛擬環境 啟用虛擬環境,執行ll env scripts activate 停止虛擬環境,執行deactivate windows環境,其他作...

第十八章 19 結構體與函式

19 結構體與函式 由於結構可以看作乙個資料型別並且可以賦值,因為我們可以將結構傳遞到函式中,或者在函式中返回乙個結構 按值返回我們知道需要複製返回的結構,結構體可以容納不同的型別的變數,相應產生的問題是複製資料也很多,假如我們不想複製資料,那麼就要按位址返回 include using names...