51假期讀書筆記 上 流暢的python

2021-09-20 12:54:49 字數 3902 閱讀 3487

今天是51假期,我開啟了新的一章,✌️!

第五章 一等函式

程式語言理論家將「一等物件」定義為滿足下述條件的程式實體:

因此,按照以上的標準,整數、字串和字典都是一等物件。

5.1

5.15.

1 把函式視作物件

>>

>

deffunc1

(n):..

.''' return n!'''..

. n = n+1.

..return n..

.>>

> func1(1)

2>>

> func1.__doc__

' return n!'

>>

>

type

(func1)

#

從以上例項中,我得知函式是乙個function型別的物件,並且我可以用__doc__獲取它的文件屬性。

__doc__用於生成物件的幫助文字。

因此,該函式就符合一等物件的全部特徵。

可以賦值給變數,也可以作為引數傳給函式。

>>

> my_func = func1

>>

> my_func

>

>>

> func1

>

>>

> func1(func1(1)

)3

有了一等函式,就可以使用函式式風格來程式設計。

5.2

5.25.

2 高階函式

接受函式作為引數,或者將函式作為結果返回的函式是高階函式。

我們在第二章提到的sorted()排序的函式也是高階函式,因為它會將key作為引數會應用到各個元素中進行排序。

如下所示:

>>

> fruits =

['strawberry',,

'watermalon'

,'lemon'

]>>

>

sorted

(fruits, key=

len)[,

'lemon'

,'strawberry'

,'watermalon'

]

任何單個引數的函式都可以作為key引數的值。

>>

>

defreverse

(word):.

..return word[::

-1].

..>>

> reverse(

'my world'

)'dlrow ym'

>>

>

sorted

(fruits, key=reverse)[,

'watermalon'

,'lemon'

,'strawberry'

]

我們平常比較常用的高階函式有filter,map,reduce等。其中map和filter還是內建函式,但是由於引入了列表推導和生成式,他們變得不是特別重要了。

下面比較了兩種方式:

>>

>

list

(map

(func1,

range(6

)))[

1,2,

3,4,

5,6]

>>

>

[func1(n)

for n in

range(6

)][1

,2,3

,4,5

,6]>>

>

list

(map

(func1,

filter

(lambda n:n%2,

range(6

))))

[2,4

,6]>>

>

[func1(n)

for n in

range(6

)if n %2]

[2,4

,6]

map和filter返回的是乙個生成器,因此目前經常會被生成器表示式所取代。

在python2中,reduce是乙個內建函式,而在python3中,被放到了functools模組中。

>>

>

from functools import

reduce

>>

>

from operator import add

>>

>

reduce

(add,

range

(100))

4950

>>

>

sum(

range

(100))

4950

sum和reduce的通用思想都是將某個操作連續應用在序列中的元素上,並且累計之間的結果,返回成乙個值。

同樣的還有all和any函式:

>>

>

all(

range

(100))

false

>>

>

any(

range

(100))

true

>>

>

all(

range(1

,2))

true

>>

>

any(

range(1

))false

在邏輯中,真值(truth value),又稱邏輯值(logical value),是指示乙個陳述在什麼程度上是真的。在計算機程式設計上多稱做布林值、布林值。

5.3

5.35.

3 匿名函式

lambda關鍵式在python表示式中建立匿名函式。

然而,python簡單的句法限制了lambda函式的定義體中只能使用純表示式。也就是說,lambda函式的定義體中不能賦值,也不能使用while,try等語句。

剛才我們那個反轉單詞的例子就可以用lambda作為key

>>

>

sorted

(fruits, key=

lambda word:word[::

-1])

[,'watermalon'

,'lemon'

,'strawberry'

]

在使用lambda時,由於它的一些侷限性,因此建議走以下步驟:

編寫注釋,說明下lambda表示式的功能作用

研究一會兒注釋,找出乙個名稱來概括注釋

將lambda表示式轉換成def語句,使用那個名稱來定義函式

刪除注釋

lambda句法只是語法糖:與def一樣,lambda表示式會建立函式物件。

語法糖(syntactic sugar),也譯為糖衣語法,是由英國計算機科學家彼得·約翰·蘭達(peter j. landin)發明的術語,指向計算機語言中新增某種語法,這種語法對語言的功能並沒有影響,但是更方便程式設計師使用。通常而言,使用語法糖能夠增加程式的可讀性,從而減少**出錯的機會。 舉個例子,在c語言裡面我們經常用a[i][j]表示((a+i)+j),a[i][j]這種寫法簡潔明瞭,更容易被人理解。

51假期讀書筆記 下 流暢的python

5.4 5.45.4 可呼叫物件 除了使用者定義的函式,呼叫運算子 即 還可以應用到其他物件上。如果想判斷物件能否呼叫,可以使用內建的callable 函式。python的資料模型文件列出了以下7種可呼叫物件。python中的可呼叫型別有很多,因此可以通過內建函式callable 來判斷物件是否可呼...

《流暢的Python》讀書筆記

第1章 python資料模型 通過實現特殊方法,自定義資料型別可以表現得和內建型別一樣 repr 方便除錯和記錄日誌,str 方便使用者看 序列資料型別特殊方法使用最多 第2章 序列構成的陣列 系列型別可分為 可變和不可變 扁平序列和容器序列 列表推導生成器表示式提供了靈活構建和初始化序列的方式 元...

流暢的python讀書筆記

1.雖然也可以用列表推導來初始化元組 陣列或其他序列型別,但是生成器表示式是更好的選擇。這是因為生成器表示式背後遵守了迭代器協議,可以逐個地產出元素,而不是先建立乙個完整的列表,然後再把這個列表傳遞到某個建構函式裡。前面那種方式顯然能夠節省記憶體。生成器表示式的語法跟列表推導差不多,只不過把方括號換...