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