003 python函式式程式設計,模組

2022-07-26 04:42:11 字數 4288 閱讀 3618

1.1 高階函式

把函式作為引數傳入,這樣的函式稱為高階函式,函式式程式設計就是指這種高度抽象的程式設計正規化

函式名也是變數,函式名其實就是指向函式的變數!對於abs()這個函式,完全可以把函式名abs看成變數,它指向乙個可以計算絕對值的函式

1.2 map/reduce

1.2.1 map()函式接收兩個引數,乙個是函式,乙個是iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的iterator返回

>>> def

f(x):

return x *x

>>> r = map(f,[1,2,3,4,5,6,7,8,9])

>>>list(r)

[1, 4, 9, 16, 25, 36, 49, 64, 81]

1.2.2 reduce把乙個函式作用在乙個序列[x1, x2, x3, ...]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下乙個元素做累積計算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

利用reduce把序列[1, 3, 5, 7, 9]變換成整數13579

>>> from functools import

reduce

>>> def

fn(x, y):

...

return x * 10 +y

...>>> reduce(fn, [1, 3, 5, 7, 9])

13579

配合map(),把str轉換為int的函式

from functools import reduce

digits =

def str2int(s):

def fn(x, y):

return x * 10 + y

def char2num(s):

return digits[s]

return reduce(fn, map(char2num, s))

1.2.3 filter

python內建的filter()函式用於過濾序列

和map()類似,filter()也接收乙個函式和乙個序列。和map()不同的是,filter()把傳入的函式依次作用於每個元素,然後根據返回值是true還是false決定保留還是丟棄該元素。

例如,在乙個list中,刪掉偶數,只保留奇數,可以這麼寫

>>> def

is_odd(n):

return n%2 == 1

>>> list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))

[1, 5, 9, 15]

filter()函式返回的是乙個iterator,也就是乙個惰性序列,所以要強迫filter()完成計算結果,需要用list()函式獲得所有結果並返回list

1.2.4 sorted

python內建的sorted()函式就可以對list進行排序

>>> sorted([36, 5, -12, 9, -21])

[-21, -12, 5, 9, 36]

sorted()函式也是乙個高階函式,它還可以接收乙個key函式來實現自定義的排序,例如按絕對值大小排序

>>> sorted([36, 5, -12, 9, -21], key=abs)

[5, 9, -12, -21, 36]

對字串排序,我們給sorted傳入key函式,即可實現忽略大小寫的排序

>>> sorted(['

bob', '

about

', '

zoo', '

credit

'], key=str.lower)['

about

', '

bob', '

credit

', '

zoo']

要進行反向排序,不必改動key函式,可以傳入第三個引數reverse=true

>>> sorted(['

bob', '

about

', '

zoo', '

credit

'], key=str.lower, reverse=true)['

zoo', '

credit

', '

bob', '

about

']

1.3 匿名函式

當我們在傳入函式時,有些時候,不需要顯式地定義函式,直接傳入匿名函式更方便

以map()函式為例,計算f(x)=x2時,除了定義乙個f(x)的函式外,還可以直接傳入匿名函式

>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

[1, 4, 9, 16, 25, 36, 49, 64, 81]

關鍵字lambda表示匿名函式,冒號前面的x表示函式引數

匿名函式有個限制,就是只能有乙個表示式,不用寫return,返回值就是該表示式的結果

匿名函式也是乙個函式物件,也可以把匿名函式賦值給乙個變數,再利用變數來呼叫該函式

>>> f = lambda x: x *x

>>> f(5)

25

可以把匿名函式作為返回值返回

def

build(x, y):

return

lambda: x * x + y * y

1.4 偏函式

在介紹函式引數的時候,通過設定引數的預設值,可以降低函式呼叫的難度。而偏函式也可以做到這一點

int()函式還提供額外的base引數,預設值為10。如果傳入base引數,就可以做n進製的轉換

>>> int('

12345

', base=8)

5349

>>> int('

12345

', 16)

74565

functools.partial就是幫助我們建立乙個偏函式的,不需要我們自己定義int2(),可以直接使用下面的**建立乙個新的函式int2

>>> import

functools

>>> int2 = functools.partial(int, base=2)

>>> int2('

1000000')

64>>> int2('

1010101')

85

為了編寫可維護的**,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的**就相對較少,很多程式語言都採用這種組織**的方式。在python中,乙個.py檔案就稱之為乙個模組(module)

2.1 __init__

每乙個包目錄下面都會有乙個__init__.py的檔案,這個檔案是必須存在的,否則,python就把這個目錄當成普通目錄,而不是乙個包。__init__.py可以是空檔案,也可以有python**,因為__init__.py本身就是乙個模組,而它的模組名就是mycompany

2.2 模組:

模組是一組python**的集合,可以使用其他模組,也可以被其他模組使用。

建立自己的模組時,要注意:

1.模組名要遵循python變數命名規範,不要使用中文、特殊字元;

2.模組名不要和系統模組名衝突,最好先檢視系統是否已存在該模組,檢查方法是在python互動環境執行import abc,若成功則說明系統存在此模組。

2.3 關於if __name__ == '__main__'的解釋

1:__name__是乙個變數。前後加了雙下劃線是因為這是系統定義的名字。普通變數不要使用此方式命名變數。

2:python有很多模組,而這些模組是可以獨立執行的!這點不像c++和c的標頭檔案。

3:import的時候是要執行所import的模組的。

4:__name__就是標識模組的名字的乙個系統變數。這裡分兩種情況:假如當前模組是主模組(也就是呼叫其他模組的模組),那麼此模組名字就是__main__,通過if判斷這樣就可以執行「__mian__:」後面的主函式內容;假如此模組是被import的,則此模組名字為檔案名字(不加後面的.py),通過if判斷這樣就會跳過「__mian__:」後面的內容。

通過上面方式,python就可以分清楚哪些是主函式,進入主函式執行;並且可以呼叫其他模組的各個函式等等。

003 Python流程控制

通常的程式語言有三種控制結構。從上而下順序執行。a 0 a a 1 print a if cond1 block1 elif cond2 block2 if 1 2 print 1 less 2 print main block 分支結構永遠只有乙個分支會被執行。white語句 for語句 語句結構...

003 Python語法之運算子

運算子 描述例子 加 兩個物件相加 a b 輸出結果 31 減 得到負數或是乙個數減去另乙個數 a b 輸出結果 11 乘 兩個數相乘或是返回乙個被重複若干次的字串 a b 輸出結果 210 除 x 除以 y b a 輸出結果 2.1 取模 返回除法的餘數 b a 輸出結果 1 冪 返回x的y次冪 ...

函式式程式語言python 函式式程式設計

函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...