Python的三器 邱乘屹的個人技術部落格

2021-10-06 16:15:41 字數 2574 閱讀 3399

迭代器生成器

裝飾器的本質就是乙個閉包函式,其作用就是在不修改原函式及其呼叫方式的情況下對原函式功能進行擴充套件

閉包原理

def

wraper

(func)

: b =

'我是b'

# 閉包中inner中的b變數先從inner中獲取值,沒有則從wraper中獲取一層層往上找

definner

(a):

print

(a,b)

print

('before'

) ret = func(a)

print

('after'

)return ret

return inner

@wraper

defshow_list

(b):

print

('show_list'

)

show_list(

'我是a'

)

裝飾器的使用場景

授權:裝飾器能有助於檢查某個人是否被授權去使用乙個web應用的端點(endpoint)。它們被大量使用於flask和django web框架中

日誌:在記錄日誌的地方新增裝飾器

快取:通過裝飾器獲取快取中的值

可以被for迴圈的都是可迭代的 字串、列表、元組、字典、集合都可以被for迴圈,說明他們都是可迭代的,將某個資料集內的資料「乙個挨著乙個的取出來」,就叫做迭代。

from collections import iterable

l =[1

,2,3

,4]

t =(1

,2,3

,4)

d =s =

print

(isinstance

(l,iterable)

)print

(isinstance

(t,iterable)

)print

(isinstance

(d,iterable)

)print

(isinstance

(s,iterable)

)

結合我們使用for迴圈取值的現象,再從字面上理解一下,其實迭代就是我們剛剛說的,可以將某個資料集內的資料「乙個挨著乙個的取出來」,就叫做迭代

'''

dir([1,2].__iter__())是列表迭代器中實現的所有方法,dir([1,2])是列表中實現的所有方法,都是以列表的形式返回給我們的,為了看的更清楚,我們分別把他們轉換成集合,

然後取差集。

'''#print(dir([1,2].__iter__()))

#print(dir([1,2]))

print

(set

(dir([

1,2]

.__iter__())

)-set(

dir([1

,2])

))結果:

生成器可以理解為一種資料型別,這種資料型別自動實現了迭代器協議(其他資料型別需要呼叫自己的內建iter方法)

在python中,一邊迴圈,一邊計算的機制,稱為生成器。

我們知道的迭代器有兩種:一種是呼叫方法直接返回的,一種是可迭代物件通過執行iter方法得到的,迭代器有的好處是可以節省記憶體。如果在某些情況下,我們也需要節省記憶體,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。

python中提供的生成器:

生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行

生成器表示式:類似於列表推導,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表

生成器generator:

​ 本質:迭代器(所以自帶了__iter__方法和__next__方法,不需要我們去實現)

特點:惰性運算,開發者自定義

迭代器和生成器

-迭代器

-可迭代協議--含有iter方法的都可以迭代的

-迭代器協議--含有next和iter的都是迭代器

特點:-節省記憶體空間

-方便逐個取值,乙個迭代器只能取一次

-生成器

所有的生成器都是迭代器

-含有yield 關鍵字的函式都是生成器函式

-生成器函式特點:

-呼叫之後函式內的**不執行,返回生成器

-每從生成器中取乙個值就會執行一段**,遇見yield就停止

如何從生成器中取值?

-for : 如果沒有break會一直取完

-next : 每次只取一次

- 資料型別強制轉換:會一次性把所有的資料都讀到記憶體中

生成器表示式:

(條件成立想放在生成器中的值 for i in 可迭代的 if 條件)

Python遞迴 邱乘屹的個人技術部落格

遞迴的優劣勢 遞迴的使用場景 遞迴就是一種直接或者間接的呼叫自身函式或者方法的演算法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解。遞迴的最大深度,如何解決?遞迴的最大深度為998,如果超過最大深度,會導致棧溢位 如何解決遞迴最大深度問題呢?import sys sys...

Python高階函式 邱乘屹的個人技術部落格

lambda只是乙個表示式,函式體比def簡單很多。lambda的主體是乙個表示式,而不是乙個 塊。僅僅能在lambda表示式中封裝有限的邏輯進去。lambda表示式是起到乙個函式速寫的作用。允許在 內嵌入乙個函式的定義。格式 lambda的一般形式是關鍵字lambda後面跟乙個或多個引數,緊跟乙個...

python中的迴圈語句 邱乘屹的個人技術部落格

1.range函式 star 計數從star開始.預設是從0開始 stop 計數到stop結束,但不包括stop step 步長,預設為1 range 5 等價與 range 0,5 range 1,10,2 獲取所有奇數,這裡面的 2 就代表步長2.for迴圈 基本使用 for 變數 in 迴圈的...