python3 匿名函式和生成器思考

2021-09-25 14:00:06 字數 3087 閱讀 9763

匿名函式形式

lambda x:表示式
這裡x是引數,匿名函式使用lambda關鍵字定義,其結果就是返回值。匿名函式有個限制,就是只能有乙個表示式,不用寫return,返回值就是該表示式的結果。

def

short_function

(x):

return x *

2

等價於

equiv_anon =

lambda x: x *

2

用匿名函式有個好處,因為函式沒有名字,不必擔心函式名衝突。此外,匿名函式也是乙個函式物件,也可以把匿名函式賦值給乙個變數,再利用變數來呼叫該函式:

>>

> f =

lambda x: x * x

>>

> f

lambda

> at 0x101c6ef28

>

>>

> f(5)

25

同樣,也可以把匿名函式作為返回值返回,比如:

def

build

(x, y)

:return

lambda

: x * x + y * y

關於匿名函式的引數問題
in [1]

: strings=

['foo'

,'card'

,'bar'

,'aaaa'

,'abab'

]in [2]

: strings.sort(key=

lambda x:

len(

set(

list

(x))))

in [3]

: strings

out[3]

:['aaaa'

,'foo'

,'abab'

,'bar'

,'card'

]

在這裡,匿名函式的x是指什麼呢?

實際上,sort方法的key的預設值是none,在預設的情況下,是逐個讀取列表中的元素,就其元素本身進行比較,像字串就是按字母順序進行排序。

而key=lambda x: len(set(list(x))),這裡匿名函式也是處理sort方法逐個讀取的元素。

\quad

\quad

\quad

迭代是python最強大的功能之一,是訪問集合元素的一種方式。

迭代器是乙個可以記住遍歷的位置的物件。

迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

迭代器有兩個基本的方法:iter() 和 next()

大部分以列表或列表型物件為引數的方法都可以接受任意的迭代物件,包括內建方法比如min,max和sum,以及型別建構函式比如list和tuple。

生成器是構造新的可遍歷物件的一種非常簡便的方式。普通函式執行並一次返回單個結果,而生成器則「惰性」地返回乙個多結果序列,在每乙個元素產生之後暫停,直到下乙個請求。

在 python 中,使用了 yield 的函式被稱為生成器(generator)。

跟普通函式不同的是,生成器是乙個返回迭代器的函式,只能用於迭代操作,更簡單點理解生成器就是乙個迭代器。

在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行。

呼叫乙個生成器函式,返回的是乙個迭代器物件。

in [1]

:def

squares

(n=10):

print

('generating squares from 1 to '

.format

(n **2)

)for i in

range(1

, n +1)

:yield i **

2in [2]

:gen = squares(

)gen

out[2]

:>

in [3]

:for x in gen:

print

(x, end=

' ')

out[3]

:generating squares from

1 to 10014

9162536

4964

81100

:itertools模組

標準庫中的itertools模組是適用於大多數資料演算法的生成器集合。例如,groupby可以根據任意的序列和乙個函式,通過函式的返回值對序列中連續的元素進行分組。

in [1]

:import itertools

first_letter =

lambda x: x[0]

names =

['alan'

,'adam'

,'wes'

,'will'

,'albert'

,'steven'

]for letter, names in itertools.groupby(names, first_letter)

:print

(letter,

list

(names)

)# names is a generator

out[1]

:a [

'alan'

,'adam'

]w [

'wes'

,'will'

]a [

'albert'

]s [

'steven'

]

這裡我是這樣理解的:itertools.groupby有兩個引數,乙個是列表,乙個分組的標準,和前面的sort方法一樣,傳入匿名函式的引數就是方法逐個讀取的列表元素。通過letter,names分別將生成器的分好的組名和組元素取出(以列表的形式列印)

python3 匿名函式 與 生成器

對於keras來講,這兩個概念很重要。匿名函式很簡單,有時候我們的函式很簡單,我們就會想要偷個懶,不想再單獨出去定義新的方法,現在立刻馬上就順手寫個函式。這時就需要匿名函式。比如map func list 的作用是將list當中的每個元素都當作引數輸入到func 這個函式中。如果我就做個x x操作,...

python3生成器 Python3 生成器

python3 生成器 閱讀 125 發布於 2020 05 19 14 29 25 在python中,一邊迴圈一邊計算出元素的機制,稱為生成器 generator。生成器的優點 一次返回乙個結果,延遲計算。這對於大資料量處理,是個非常有用的優勢。占用記憶體量是工程師必須考慮的乙個問題。提高 可讀性...

python3之生成器

斐波那契 fibonacci 數列列是乙個非常簡單的遞迴數列,除第乙個和第二個數外,任意乙個數都可由前兩個數相加 得到。用電腦程式輸出斐波那契數列的前 n 個數是乙個非常簡單的問題,許多初學者都可以輕易寫出如下函式 def fab max n,a,b 0,0,1 while n max print ...