加粗樣式@[toc]
面向過程的程式設計
基本單元,函式
函式時程式設計:允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式!
abs(-10)是函式呼叫,abs是函式本身
要獲得呼叫結果,我們可以把結果賦值給變數
也可以把函式本身賦給變數,即變數指向函式,這樣可以實現通過變數來呼叫函式
>>
>
absin function abs
>
>>
> f=
abs>>
> f(-10
)10
說明變數f現在已經指向了abs函式本身,直接呼叫abs()函式和呼叫f()完全相同
函式名也是變數
函式名就是指向函式的變數,
如果把abs指向其他物件呢?
>>
>
abs(-2
)traceback (most recent call last)
: file ""
, line 1,in
typeerror:
'int'
object
isnot
callable
指向其他物件後,就暫時沒有原來功能了
高階函式,在乙個函式中能呼叫另乙個函式
map
>>
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]
map()傳入的第乙個引數是函式物件f,
l =
for n in[1
,2,3
,4,5
,6,7
,8,9
]:)print
(l)
reduce 看官網咖
正確實現篩選功能
用於過濾序列,例如刪掉偶數只保留奇數,把乙個序列的空字串去掉
def
not_empty
(s):
return s and s,strip(
)list
(filter
(not_empty,
['a',''
,'b'
,none
,'c'
,'d'])
)#結果是 ['a','b','c']
內建sorted()函式可以對list排序
>>
>
sorted([
1,2,
7,6,
5,4]
)[1,
2,4,
5,6,
7]
sorted()函式也是乙個高階函式,他還可以接收乙個key函式來實現自定義的排序,例如按照絕對值大小排序
>>
>
sorted([
3,5,
-1,-
2],key=
abs)[-
1,-2
,3,5
]
key指定的函式將作用在list的每乙個元素上,並根據key函式返回的結果進行排序,對比原來的list和經過key=abs處理過的lsit:
>>
>
sorted([
3,5,
-1,-
2],key=
abs)[-
1,-2
,3,5
]
然後按照key進行排序
sort也可以給字串排序
>>
>
sorted([
'bob'
,'about'
,'zoo'
,'credit'])
['credit'
,'zoo'
,'about'
,'bob'
]按照accii碼值來排序的
>>
>
sorted([
'bob'
,'about'
,'zoo'
,'credit'
], key=
str.lower)
['about'
,'bob'
,'credit'
,'zoo'
]
要進行反向排序,不必改動key,可以傳入的三個引數reverse=ture
>>
>
sorted([
'bob'
,'about'
,'zoo'
,'credit'
], key=
str.lower, reverse=
true)[
'zoo'
,'credit'
,'bob'
,'about'
]
高階函式的抽象能力是非常強大的,而且核心**可以保持非常簡潔
寫完乙個求和函式後,不需要立刻求和,而是在後面的**中根據需要再計算怎麼辦,可以不返回求和的結果,而是返回求和的函式
返回函式沒有立刻執行,而是在主函式中呼叫了才被執行
在idle中寫程式的時候要在最後加上print(),因為他不是互動環境!!!
def
count()
: fs =
for i in
range(1
,4):
deff()
:return i*i
return fs
f1,f2,f3= count(
)#借用count來呼叫函式!!!
print
(f1())
print
(f2())
print
(f3(
))
牢記:
返回函式不要引用任何的迴圈變數,或者後續會發生變化的變數
如果一定要引用迴圈變數,需要再建立乙個函式,用該函式的引數繫結迴圈變數的值
def
count()
:def
f(j)
:defg(
):return j*j
return g
fs=for i in
range(1
,4):
)#f立刻被執行,因此i的當前值被傳入f()
return fs
f1,f2,f3 = count(
)print
(f1())
print
(f2(
))
缺點:**較長,可利用lambda函式縮短**
小結:乙個函式可以返回乙個計算結果,也可以返回乙個函式。
返回乙個函式時,牢記該函式並未執行,返回函式中不要引用任何可能會變化的量。
好處:因為函式沒有名字,不必擔心函式名衝突
沒有return語句
s=
list
(map
(lambda x:x*x,[1
,2,3
,4,5
,6,7
,8,9
]))print
(s)實際上就是
deff
(x):
return x*x
關鍵字lambda表示匿名函式,冒號前面的x表示函式引數
匿名函式有個限制,就是只能有乙個表示式,不用寫return語句,返回值就是該表示式的結果
匿名函式也是乙個函式物件,可以把匿名函式賦給乙個變數,再利用變數+引數 來呼叫函式,
f=
lambda x:x*x
print
(f(4
))
可以把匿名函式作為返回值返回
在**執行期間動態增加功能的方式,稱之為「裝飾器」decoator
int轉換其他型別的時候,預設按十進位制轉換
要想轉化為二進位制 int(x,base=2)
如果嫌一直寫太麻煩,可以定義乙個函式啊
def
int2
(x,base=2)
:return
int(x,base)
偏函式
functools.partial幫助我們建立乙個偏函式,不需要我們自己定義int2(),可以直接使用下面的**建立乙個新的函式
import functools
int2=functools.partial(
int base=2)
int2(
'100000'
)64
funtools.partial的作用就是,把乙個函式的某些引數給固定住(也就是設定預設值),返回乙個新的函式,呼叫這個新函式會更簡單。
小結:當函式的引數過多,需要簡化時,使用functools.partial可以建立乙個新的函式,這個新函式可以固定住原函式的部分引數,從而在呼叫的時候更簡單。
Pyhton 函式式程式設計
高階函式,引數是函式的函式 返回值的函式的函式。1 引數是函式的函式 前提 變數可以指向函式,指向後變數名就覆蓋了函式名,就可以用變數名來呼叫函式。如 print abs abs abs a abs print a a a print a 5 5 def square n return n 100 ...
Pyhton函式式程式設計簡介(四)裝飾器
4 python函式是乙個物件,函式執行完後內部變數被 return的東西不會被 由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 ...
學習函式式程式設計
函式式程式設計 函式程式設計是乙個非常古老的概念,早於第一台計算機的誕生,擁有悠久的歷史 學習函式程式設計的意義 1 函式式程式設計隨著react的流行受到了越來越多的關注 ps react的高階元件使用react高階函式來實現,高階函式就是函式式程式設計的乙個特性 2 vue3也開始擁抱函式式程式...