python學習第四節 迭代器 生成器

2022-07-17 08:51:09 字數 2948 閱讀 6940

1:什麼是迭代

可以直接作用於for迴圈的物件統稱為可迭代物件(iterable)。

可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器(iterator)。

所有的iterable均可以通過內建函式iter()來轉變為iterator。

對迭代器來講,有乙個__next()就夠了。在你使用for 和

in 語句時,程式就會自動呼叫即將被處理的物件的迭代器物件,然後使用它的next__()方法,直到監測到乙個stopiteration異常。

>>> l = [1,2,3]

>>> [x**2 for x in l]

[1, 4, 9]

>>> next(l)

traceback (most recent call last):

file "", line 1, in

typeerror: 'list' object is not an iterator

>>> i=iter(l)

>>> next(i)

1>>> next(i)

2>>> next(i)

3>>> next(i)

traceback (most recent call last):

file "", line 1, in

stopiteration

#1、為何要有迭代器?

對於序列型別:字串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對於字典、集合、檔案等型別是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的迭代方式,這就是迭代器

#2、什麼是可迭代物件?

可迭代物件指的是內建有__iter__方法的物件,即obj.__iter__,如下

'hello'.__iter__

(1,2,3).__iter__

[1,2,3].__iter__

.__iter__

.__iter__

open('a.txt').__iter__

#3、什麼是迭代器物件?

可迭代物件執行obj.__iter__()得到的結果就是迭代器物件

而迭代器物件指的是即內建有__iter__又內建有__next__方法的物件

檔案型別是迭代器物件

open('a.txt').__iter__()

open('a.txt').__next__()

#4、注意:

迭代器物件一定是可迭代物件,而可迭代物件不一定是迭代器物件

2:迭代器物件的使用

dic=

iter_dic=dic.__iter__() #得到迭代器物件,迭代器物件即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身

iter_dic.__iter__() is iter_dic #true

print(iter_dic.__next__()) #等同於next(iter_dic)

print(iter_dic.__next__()) #等同於next(iter_dic)

print(iter_dic.__next__()) #等同於next(iter_dic)

# print(iter_dic.__next__()) #丟擲異常stopiteration,或者說結束標誌

#有了迭代器,我們就可以不依賴索引迭代取值了

iter_dic=dic.__iter__()

while 1:

try:

k=next(iter_dic)

print(dic[k])

except stopiteration:

break

#這麼寫太醜陋了,需要我們自己捕捉異常,控制next,python這麼牛逼,能不能幫我解決呢?能,請看for迴圈

3:for迴圈

#基於for迴圈,我們可以完全不再依賴索引去取值了

dic=

for k in dic:

print(dic[k])

#for迴圈的工作原理

#1:執行in後物件的dic.__iter__()方法,得到乙個迭代器物件iter_dic

#2: 執行next(iter_dic),將得到的值賦值給k,然後執行迴圈體**

#3: 重複過程2,直到捕捉到異常stopiteration,結束迴圈

迭代器的優缺點

#優點:

- 提供一種統一的、不依賴於索引的迭代方式

- 惰性計算,節省記憶體

#缺點:

- 無法獲取長度(只有在next完畢才知道到底有幾個值)

- 一次性的,只能往後走,不能往前退

什麼是生成器

#

只要函式內部包含有yield關鍵字,那麼函式名()的到的結果就是生成器,並且不會執行函式內部**

deffunc():

print('

====>first')

yield 1

print('

====>second')

yield 2

print('

====>third')

yield 3

print('

====>end')

g=func()

print(g) #

生成器就是迭代器

g.__iter__

g.__next__

#2、所以生成器就是迭代器,因此可以這麼取值

res=next(g)

print(res)

python學習 GUI第四節

今天用gui內容寫乙個加法計算器 需要三個對話方塊及乙個按鈕 from tkinter import master tk v1 strin ar v2 strin ar v3 strin ar def text content 測試輸入是否為數字,若不是數字則不能錄入 return content....

Python基礎第四節

字典是 鍵值對 的無序可變序列,其中每個元素都是乙個 鍵值對 包含 鍵物件 和 值物件 就像可通過列表元素索引值獲取對應物件,我們可通過 鍵物件 獲取 刪除 更新其對應的值物件。鍵必須是不可變資料,如整數 浮點數 字串 元組,不能是字典 列表 集合等可變物件,鍵不可重複。若重複出現鍵,則後面的覆蓋前...

學習python第四節課

基礎資料概念 資料型別指的就是變數的值的型別,也就是可以為變數賦哪些值 整數和小數 整數 所有整數 例如 a 1 b 100 c 999 都是int型別 小數常量 所有小數 例如 a 1.2 b 6.66 用float型別表示 字串是由數字 字母 下劃線組成的一串字元 注意 單引號和雙引號不能混合使...