1. 程式人生 > 其它 >4.10 Python3 進階 - 迭代器 & 生成器

4.10 Python3 進階 - 迭代器 & 生成器

>>返回主目錄


原始碼

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)

>>返回主目錄

作者: PortosHan

出處: https://www.cnblogs.com/PortosHan/

關於作者:專注於軟體測試、測試開發等領域,請多多賜教!

本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。 原文連結 如有問題,可郵件([email protected])諮詢。