Python中函式的用法

2021-09-24 18:38:30 字數 3270 閱讀 6948

目錄

python函式的基本格式

python函式的傳參

形式引數

實際引數

不定長引數

實參的值

函式的拆包

python函式的文件說明

作用域命名空間 閉包

python函式的定義與其他語言類似,但是python的函式體沒有大括號所包圍,所以函式體的縮排要嚴格。

def 函式名(引數1,引數2,...,引數n):

函式體**塊··

··return 返回值

python中的函式也是乙個物件,將可執行的**塊存在記憶體中,這些**塊不會立即執行,定義時只檢查語法錯誤,只在呼叫函式時才會執行。python中函式的定義語法非常靈活,但是靈活所帶來的問題就是容易出錯,尤其體現在引數的設定和傳遞上。

由於python中定義的變數的型別是動態型別,所以函式中的引數也不會指定變數型別,相傳什麼就傳什麼。在函式體**塊中使用引數時才會檢查其型別。

python函式的形式引數與c/c++中的類似,只存在於函式中,相當於在函式中定義了乙個區域性變數,函式結束後這個變數就被銷毀了,可以設定預設值。

實際引數的傳遞有兩種方式,一種是按位置傳參,就是按形參的定義順序來傳參。例如:

>>> def fun1(a,b,c):

... print(a)

... print(b)

... print(c)

...>>> fun1(1,2,3)12

3

另一種是按關鍵字傳參,即呼叫函式時指明形式引數的值。例如:

>>> def fun1(a,b):

... print(a)

... print(b)

...>>> fun1(b=1,a=2)

21

也可以混合使用,但是要將位置實參寫到前面。例如:

>>> def fun1(a,b,c):

... print(a)

... print(b)

... print(c)

...>>> fun1(1,c=3,b=2)12

3

形參的設定還有一種不定長引數,即可以傳遞未知數量的引數,型別也是任意的,但是不能接受關鍵字傳值。寫法就是在形參之前加「*」即可,而且形參列表中只能有乙個帶「*」的形參,否則會引起歧義。例如:

>>> def fun(*a):

... print(a)

...>>> fun(1,2,3,4,5)

(1, 2, 3, 4, 5)

不定長引數可以和其他引數配合使用,此時帶星號引數需要寫到形參列表的末尾。如果不寫到末尾的話,也可以將帶星號的引數後面的所有引數使用關鍵字傳值。例如:

>>> def fun(a,b,*c,d):

... print(c)

... print(d)

...>>> fun(1,2,3,4,5,d=6)

# 1給了a,2給了b,3 4 5給了c

(3, 4, 5)

6

有些型別的實參的值是可以在函式中修改的,例如:list、dictionary、set。但是有些不可以,例如:tuple、number、string等。例如:

#list可以被修改

>>> def fun(a):

... a[0]=2

...>>> b=[1,2,3]

>>> fun(b)

>>> print(b)

[2, 2, 3]

# 數字不可以被修改

>>> def fun(a):

... a=10

...>>> b=5

>>> fun(b)

>>> print(b)

5

如果想給函式傳遞乙個list或者set,可以使用函式的拆包呼叫。即在傳遞實參時,在引數名之前加上「*」。例如:

>>> def fun(a,b,c):

... print(a)

... print(b)

... print(c)

...>>> d=[1,2,3]

>>> fun(*d)12

3

>>> d=

>>> fun(**d)12

3

如果想給這個函式新增一些注釋,說明引數的意義,函式的作用,返回值的意義等,可以在函式中使用三個單引號的注釋形式來寫。然後使用help函式來顯示這些注釋。例如:

python中的作用域分為全域性作用域和函式作用域,與c/c++中的非常類似,可以模擬著學習。所有函式之外的作用域都是全域性作用域,全域性作用域在程式執行時建立,在程式結束時銷毀。而函式作用域在函式被呼叫時建立,函式結束時銷毀,函式每呼叫一次就會產生乙個新的函式作用域。在使用乙個變數時,會優先在當前的作用域中查詢。

python中的命名空間儲存了當前作用域中所有的物件和物件所對應的值或位址。本質上是乙個字典。locals函式可以獲取當前作用域的命名空間,globals函式可以獲取全域性作用域的命名空間。例如:

>>> a=10

>>> b=15

>>> c=20

>>> def fun():

... a=1

... b=2

... c=3

... local_a=locals()

... global_a=globals()

... print(local_a,type(local_a))

... print(global_a,type(global_a))

...>>> fun()

, '__builtins__': , 'fun1': , 'fun': , 'b': 15, 'd': , 'a': 10, 'c': 20}

在全域性作用域中還有程式自帶的一些物件,例如__name__等。

閉包在好多地方都有定義,python中的閉包是個較為複雜的概念,我在另一篇中做了詳細解釋:

Python中函式的用法

必須使用關鍵字 def 函式體注意縮排 函式名與 需繫結 應用 將重複的 封裝到函式,增強 模組化 print 函式名 輸出的結果為函式位址。def add args print args add 輸出結果空元組 add 1 輸出結果為 1 add 1,2 輸出結果為 1,2 add 1,2,4 輸...

Python中range 函式的用法

先列幾個range 函式的幾個用法 函式原型 range start,end,scan 引數含義 start 計數從start開始。預設是從0開始。例如range 5 等價於range 0,5 end 技術到end結束,但不包括end.例如 range 0,5 是 0,1,2,3,4 沒有5 sca...

Python中reduce 函式的用法

python中的reduce內建函式是乙個二元操作函式,他用來將乙個資料集合 鍊錶,元組等 中的所有資料進行下列操作 用傳給reduce中的函式 func 必須是乙個二元操作函式 先對集合中的第1,2個資料進行操作,得到的結果再與第三個資料用func 函式運算,最後得到乙個結果。如 python d...