Python之迭代器與生成器

2022-08-14 04:24:10 字數 4259 閱讀 4509

可迭代物件

字面意思分析:可以重複的迭代的實實在在的東西。

list,dict(keys(),values(),items()),tuple,str,set,range, 檔案控制代碼(待定)

專業角度: 內部含有'__iter__'方法的物件,就是可迭代物件。

內建函式:dir()

print(dir(str))

判斷乙個物件是否是可迭代物件:

print('iter' in dir(str))

優點:

直觀。操作方法較多。

缺點:

佔記憶體。

不能迭代取值(索引,字典的key)。

迭代器

字面意思:可以重複迭代的工具。

專業角度: 內部含有'__iter__'並且含有"__next__"方法的物件,就是迭代器

可迭代物件轉化成迭代器:

l1 = [1, 2, 3, 4, 5]

# 內建函式iter()

obj = iter(l1)

# 迭代器可以迭代取值。利用next()進行取值

l1 = [1, 2, 3, 4, 5]

# 內建函式iter()

obj = iter(l1)

# print(obj)

print(next(obj))

print(next(obj))

print(next(obj))

print(next(obj))

print(next(obj))

print(next(obj))

迭代器優點:

非常節省記憶體。

惰性機制。

迭代器缺點:

不直觀。

操作不靈活。

效率相對低。

特性:

l1 = [22, 33, 44, 55, 66, 77]

obj = iter(l1)

for i in range(3):

print(next(obj))

for i in range(2):

print(next(obj))

利用while迴圈,模擬for迴圈內部迴圈可迭代物件的機制。

先要將可迭代物件轉化成迭代器。

利用next對迭代器進行取值。

利用異常處理try一下防止報錯。

可迭代物件與迭代器的對比

可迭代物件:

​ 是乙個私有的方法比較多,操作靈活(比如列表,字典的增刪改查,字串的常用操作方法等),比較直觀,但是占用記憶體,而且不能直接通過迴圈迭代取值的這麼乙個資料集。

應用:當你側重於對於資料可以靈活處理,並且記憶體空間足夠,將資料集設定為可迭代物件是明確的選擇。

迭代器:

​ 是乙個非常節省記憶體,可以記錄取值位置,可以直接通過迴圈+next方法取值,但是不直觀,操作方法比較單一的資料集。

應用:當你的資料量過大,大到足以撐爆你的記憶體或者你以節省記憶體為首選因素時,將資料集設定為迭代器是乙個不錯的選擇。(可參考為什麼python把檔案控制代碼設定成迭代器)。

# return 結束函式,給函式的執行者返回值(多個值通過元組的形式返回)。

# yield 不結束函式,對應著給next返回值(多個值通過元組的形式返回)。

pass

# def eat_baozi():

# list1 =

# for i in range(1,2001):

# return list1

## print(eat_baozi())

def eat_baozi_gen():

for i in range(1,2001):

# print(11)

yield f'號包子'

'''# ret1 = eat_baozi_gen()

# ret2 = eat_baozi_gen()

# # print(ret1)

# # print(ret2)

# print(next(ret1))

# print(next(ret1))

# print(next(ret1))

# # print(next(ret2))

# print(next(ret2))

# print(next(ret2))

# print(next(ret))

# print(next(ret))

'''# ret = eat_baozi_gen()

## for i in range(200):

# print(next(ret))

## for i in range(200):

# print(next(ret))

# yield from

# def func():

# l1 = [1, 2, 3]

# yield l1

# ret = func()

# print(next(ret))

# print(next(ret))

# print(next(ret))

# def func():

# l1 = [1, 2, 3]

# yield from l1

## '''

# yield 1

# yield 2

# yield 3

# '''

# ret = func()

# print(next(ret))

# print(next(ret))

# print(next(ret))

# yield : 對應next給next返回值

# yield from 將乙個可迭代物件的每乙個元素返回給next

# yield from 節省**,提公升效率(代替了for迴圈)

# l1 = [1,2,3......100]

# l1 =

# for i in range(1,101):

# print(l1)

# 列表推導式

l1 = [i for i in range(1, 101)]

# print(l1)

# obj = (i for i in range(1, 11))

# # print(obj)

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

# # print(next(obj))

1. next(obj)

2. for 迴圈

for i in obj:

print(i)

3. 資料轉化

print(list(obj))

生成器表示式:生成器 節省記憶體。

字典推導式,集合推導式:  兩種模式: 迴圈模式,篩選模式

l1 = ['小潘', '懟懟哥','西門大官人', '小澤ml亞']

dic = {}

for index in range(len(l1)):

dic[index] = l1[index]

print(dic)

print()

1~100

print()

python之迭代器與生成器

迭代器是乙個可以記住遍歷的位置的物件.迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完,迭代器只能往前,不能退後。迭代器有兩個基本的方法 iter 和next 注意 1.迭代器只能往前取值,不會後退。2.用iter函式可以返回乙個可迭代物件的迭代器。如果乙個函式中包括yield關鍵字,那...

Python之迭代器與生成器

每一次對過程的重複稱為一次 迭代 而每一次迭代得到的結果會作為下一次迭代的初始值。例如 迴圈獲取容器中的元素。定義 具有 iter 函式的物件,可以返回迭代器物件。例如列表,元組 語法 建立 class 可迭代物件名稱 def iter self return 迭代器 使用 for 變數名 in 可...

Python之迭代器與生成器

容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有的元素儲存在記憶體中 也有一些特例,並不是所有的元素都放在記憶體,比如迭代器和生成器物件 在python中,常見的容器物件有 從技術角度來說,當它可...