1.1 高階函式
把函式作為引數傳入,這樣的函式稱為高階函式,函式式程式設計就是指這種高度抽象的程式設計正規化
函式名也是變數,函式名其實就是指向函式的變數!對於abs()
這個函式,完全可以把函式名abs
看成變數,它指向乙個可以計算絕對值的函式
1.2 map/reduce
1.2.1 map()函式接收兩個引數,乙個是函式,乙個是iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的iterator返回
>>> deff(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 importreduce
>>> 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中,刪掉偶數,只保留奇數,可以這麼寫
>>> defis_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
可以把匿名函式作為返回值返回
defbuild(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
>>> importfunctools
>>> 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,雖然也可以歸結...