迭代器生成器

2022-08-11 15:57:15 字數 3459 閱讀 6485

函式的遞迴呼叫

函式在呼叫階段間接或直接又呼叫了自己

遞迴:遞推:基於回溯的結果,一步一步往上推

二分法:

演算法:高效率解決問題的方法

二分法必須基於乙個有順序的容器型別

判斷某個值在不在容器裡面

每次擷取上一次容器型別一半進行比較

三元表示式:

結果一 if 條件 else 結果二

只有結果為2個可能性的情況下就可以用三元表示式

匿名函式

沒有名字的函式

關鍵字lambda

lambda 形參:返回值

1.當場定義當場呼叫

(lambda 形參:返回值)()

2.給匿名命名

func = lanbda 形參:返回值

func()

3.匿名函式通常是配合其他函式一起使用的(內建函式,自定義函式)

常見的內建函式

max:內部基於for迴圈的,先乙個乙個將傳入的容器型別的元素乙個個取出,如果沒有指定key(key對應著乙個函式)那麼就根據取出的元素乙個個進行比較得出最大的值。如果指定了key,那麼max會將元素交給這個函式,拿函式的返回值進行比較,但出來的結果還是傳入的結果

min:同上,求出最小值

sum:求和

map:對映關係,乙個個成對應map(匿名函式,容器物件)

filter:過濾

zip:拉鍊,也是一一對應,返回出來的是乙個元祖

sorted:排序,裡面可以指定rerverse=true可以使其反轉,預設是false

reduce:是將多個值變成乙個值,reduce(匿名函式,物件,預設值)不指定預設值的話那麼就拿容器的第一和第二個進行比較

迭代器:

所以說迭代器就是重複過程的工具

可迭代物件:

內建有__iter__方法的物件就是可迭代物件

迭代器物件:

內建有__iter__方法和__next__方法的就是迭代器物件

迭代器物件裡面的呼叫__iter__方法得到的是自身,然後可迭代物件呼叫__iter__方法得到的結果就是迭代器物件

count =0

while count < 3:

print(111)

count+=1

這個就可以說是乙個迭代器

迭代器物件呼叫__next__方法可以進行取值

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

迭代器優缺點:

優點:不依賴索引取值,減少記憶體空間,不會記憶體溢位

缺點:不能取出指定的元素,取完後會報錯,需要try處理。

特點:只能依次往後進行取值,不能後退

迭代器的取值:

ls = [1,2,3,4]

iter_l = ls.__iter__() 生成乙個迭代器物件

print(iter_l.__next__())進行取值

print(iter_l.__next__())

print(iter_l.__next__())

print(iter_l.__next__())

print(iter_l.__next__()) 如果已經去完了就會報錯stopiteration

for迴圈的in後面的跟著的是乙個可迭代物件

for迴圈執行的步驟:

1.將in後面的可迭代物件執行__iter__方法轉換成迭代器物件

2.呼叫__next__方法進行迭代取值

3.進行異常處理

其本質上也是乙個迭代器,但是乙個自定義的迭代器。

其內部有yield的關鍵字

如果在函式內部有yield關鍵字,那麼這個函式在函式名加括號呼叫的時候,不會執行其函式體**,會將其轉換成乙個生成器,這也可以說是,生成器初始化,將函式變成乙個迭代器

例子:

def

func():

print('

2222')

yield

print('

33333')

yield

..........

res = func()生成器初始化

這樣在res.__next__()就可以進行取值,但會返回乙個none,yield後面可以跟值,yield後面跟的值,就是呼叫__next__()獲取到的您可以得到的值。

yield後面可以跟多個值,返回的會打包成乙個元祖。

另外yield會暫停函式的執行狀態。

yield支援外界傳參

defdog(name):

print('

%s 準備開吃

'%name)

while

true:

food = yield

print('

%s 吃了 %s

'%(name,food))

g = dog('

owen')

g.__next__() #

必須將**執行至yield才能夠為其傳值

然後用關鍵字send從外界為其傳值

g.send('火腿

') #

給yield的左邊變數傳參,觸發了__next__方法

g.send('

大雞腿')

yield總結:

1.能夠將自定義的函式變成乙個生成器,提供了一種自定義生成器的方式

2.yield能夠將函式的執行狀態給暫停住

3.能夠支援外界給其傳參,關鍵字send

4.yield可以有返回值

與return的異同點:

相同之處:都有返回值,並能夠返回多個值

不同點:yield能夠暫停函式的執行狀態,並且yield可以返回多次值,但return只能返回一次值,並且立即結束函式。yield可以有外界進行傳參

chr():是將數字轉為ascill表對應的字元

ord():是將字元轉為ascill表對應的數字

div():是返回當前物件命名空間的裡面的可呼叫的名字

divmod()是分頁器

callable()是可以判斷是不是乙個可呼叫(加括號可以執行其相應的功能)的物件

all()裡面的物件只要有乙個為false那麼將為false

any()裡面的物件只要有乙個為true,那麼就都為true

help()檢視物件裡面的注釋內容

exec():字串執行python**,支援多行,並且只要是支援python語法的都能夠被執行,並且會將執行**過程中產生的名字放入某個命名空間裡面

eval():字串執行python**,但不支援語法,只能做簡單的表示式

isinterance判斷物件是不是什麼型別(object,型別)

str()轉為字串

int()轉為整型

面向過程概念:

面向過程就是一條流水線式的寫**,就是先乾這個在幹那個,一步一步往下面走。

優點:就是將複雜的問題流程化,將其簡單化了

建議是在寫好不用去更改的場景下去使用面向過程,如linux的核心,就是寫好後不用去更改的場景

生成器 迭代器

最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...

迭代器,生成器

迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...

迭代器 生成器

迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...