Pyhton學習九 函式式程式設計

2021-09-25 22:25:41 字數 4760 閱讀 1690

加粗樣式@[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也開始擁抱函式式程式...