>>返回主目錄



原始碼

from typing import Iterable, Iterator

# 可迭代物件:字串、列表、元組、字典、集合、range()、enumerate()等
print('判斷字串是否是可迭代物件:', isinstance('Python', Iterable)) # True
print('判斷range函式生成的物件是否是可迭代物件:', isinstance(range(1), Iterable)) # True
print('判斷字串是否是迭代器:', isinstance('Python', Iterator)) # False

原始碼

# 建立迭代器:可通過__iter__()或內建函式iter()將可迭代物件建立為迭代器物件,例如:
# 將列表建立為迭代器
list_a = ['I', 'Love', 'Python']
# iter_list_a = list_a.__iter__()
iter_list_a = iter(list_a) # 同__iter__()
print('iter_list_a是可迭代物件:', isinstance(iter_list_a, Iterable))
print('iter_list_a是迭代器物件:', isinstance(iter_list_a, Iterator))
print('iter_list_a是迭代器物件:', iter_list_a) # 訪問迭代器:可通過__next__()或內建函式next()訪問迭代器物件中的下一個元素或通過迴圈語句訪問,例如:
# 列印1~5,使用for迴圈方式
for i in range(1, 6):
print('for迴圈列印1~5:', i)
print('-' * 50)
# 使用迭代器方式,理解for迴圈底層執行機制
iter_range = iter(range(1, 6))
while True:
try:
print('迭代器列印1~5:', next(iter_range))
except StopIteration:
break





原始碼

# 定義一個生成器函式
def generator(num):
print('生成器函式開始!')
n = 0
while n < num:
print('生成器返回前!', n)
yield n
n += 1
print('生成器返回後!', n)
print('生成器函式呼叫結束')
# return 5 # 告訴程式結束,不會返回5 gt = generator(3)
print('呼叫生成器返回:', gt) # 返回生成器物件,記憶體地址
print('第一次呼叫生成器next函式後:', next(gt)) # 0
print('第二次呼叫生成器next函式後:', next(gt)) # 1
print('第三次呼叫生成器next函式後:', next(gt)) # 2
# print('第四次呼叫生成器next函式後:', next(gt)) # 後續沒有碰到yield,拋StopIteration異常



原始碼

# 仍然使用上例generator()函式,使用for迴圈遍歷
gt_for = generator(3)
for g in gt_for:
print('迴圈呼叫生成器:', g)

原始碼

# 生成器表示式
# 求0~5的倍數
gen_double = (x * 2 for x in range(6))
print('生成器表示式返回:', gen_double) # 返回生成器物件
print('第一次呼叫生成器next函式後返回:', next(gen_double)) # 0
print('第二次呼叫生成器next函式後返回:', next(gen_double)) # 2
print('第三次呼叫生成器next函式後返回:', next(gen_double)) # 4

原始碼

# 例如,如下狗狗乾飯的生成器函式:
def dog_generator(dog_name):
print('狗狗準備開吃!')
food_list = []
while True:
print('生成器返回:前!')
food = yield food_list # food = yield = 'xxx'
print(f'狗狗:{dog_name},吃了:{food}')
food_list.append(food)
print('生成器返回:後!') dg = dog_generator('金毛')
# 強調:對於表示式形式的yield的生成器,在使用前必須先用next(g)或者g.send(None)初始化一次
print('初始化生成器:', next(dg)) # next(dg)==dg.send(None),開始執行函式體程式碼,next(res)==res.__next__()
print('-' * 50)
food_list_add1 = dg.send('大骨頭1')
print('狗狗已經吃了:', food_list_add1)
print('-' * 50)
food_list_add2 = dg.send('小骨頭1')
print('狗狗已經吃了:', food_list_add2)
print('-' * 50)
dg.close() # 關閉生成器 # food_list_add3 = dg.send('小骨頭2')
# print('狗狗已經吃了:', food_list_add3)

>>返回主目錄