函數參數
參數種類
Python 的函數參數主要包含以下幾種:
- 必選參數
- 默認參數
- 可變參數
- 關鍵字參數
必選參數(位置參數)
必須參數是調用一個Python函數時必須指定的參數值,不指定會報錯的那種。
def greet(name):
print('Hello ' + name + "!")
# 調用時,必須指定name參數值
greet('Zou Jingyao')
運行結果(不指定會報錯):
默認參數
默認參數指的是有默認值的參數,調用函數時可以給默認參數傳值也可以不傳值,不傳值時用默認值(默認值是函數定義出寫的)
例如:
def greet(name='Zou Jingyao'):
print('Hello ' + name + "!")
# 可以給默認參數傳值
greet('Zou Jingwen')
# 不指定name參數值時就用默認值
greet()
運行結果:
可變參數
可變參數就是傳入的參數數量是可變的,當我們不確定會給函數傳多少值時,很有用。這些參數在函數調用時自動組裝爲一個元組。
可變參數的標識是在前面加一個*,這不代表C++類似的指針,而是表示接受一個元組,可以接受任意數量的參數,0個也行。
def greet(*names):
for name in names:
print('Hello ' + name + "!")
greet('Zou Jingyao', 'Zou Jingwen', 'Wang Fumei', 'Ting Ting')
運行結果:
關鍵字參數
關鍵字參數允許傳入任意個含參數名的參數,這些關鍵字參數在函數調用時自動組裝爲一個字典。也就是說,關鍵字參數將長度任意的鍵-值對,作爲參數傳遞給函數。
關鍵字參數的標識是**,它擴展了函數功能,使傳遞參數過程更爲簡便。
def greet(**dictionary):
for key, value in dictionary.items():
print(key + ':' + str(value))
greet(name='Zou Jingyao', age=21, work='student')
運行結果:
參數組合使用的順序
這四種參數如果想要一起使用是由順序的,順序依次應該是必選參數、默認參數、可變參數和關鍵字參數。
# 定義一個包含多種參數的函數
def greet(x, y, z=0, *names, **dictionary):
print('x =', x)
print('y =', y)
print('z =', z)
print('names =', names)
print('dictionary =', dictionary)
greet(1, 2, 3, 'yao', 'wen', 'ting')
print('*'*50)
greet(1, 2, 3, 'yao', 'wen', 'ting', age=21, work='student')
運行結果:
函數返回值
在Python函數中用return語句將值返回到調用函數的出口,有return返回值纔是完整的函數。
如果沒有定義函數返回值,那麼程序會自動讓函數返回一個None對象,表示沒有任何值。
將值作爲返回值
Python中可以返回多個值,將其封裝成一個元組打包返回。
def greet():
return 'Zou Jingyao', 'Zou Jingwen', 'Ting Ting'
names = greet()
print(names)
運行結果:
('Zou Jingyao', 'Zou Jingwen', 'Ting Ting')
def greet():
return 'beautiful', 'Zou Jingyao'
description, name = greet()
print(description + " " + name)
運行結果:
beautiful Zou Jingyao
將函數作爲返回值
參考
我們除了可以將各種類型的值作爲返回值外,也可以將函數作爲返回值。例如,我們要定義一個函數來求列表中數值元素的和,一般情況下我們是這樣定義的:
def plus(*args):
s = 0
for n in args:
s = s + n
return s
但是,如果我們不需要立刻求和,而是在後面的程序中,根據需求再計算,這種情況怎麼辦呢?這時我們定義的函數可以不返回求和的結果,而是返回計算求和的函數。所以我們還可以用如下方法定義函數:
def lazy_plus(*args):
def plus():
s = 0
for n in args:
s = s + n
return s
return plus
當我們調用lazy_plus()時,返回的並不是求和結果,而是計算求和的函數:
用lazy_plus()時,返回的並不是求和結果,而是求和函數
f = lazy_plus(1,2,3,4,5)
print(f)
運行結果:
<function lazy_plus.<locals>.plus at 0x000001DAC97F9950>
調用函數f時,才真正計算求和的結果:
# 調用函數f時,得到真正求和的結果
f = lazy_plus(1,2,3,4,5)
print(f())
運行結果:
15
在上述例子中,我們在函數lazy_plus中又定義了函數plus,而且內部函數plus是可以引用外部函數lazy_plus的參數和局部變量的。當函數lazy_plus返回函數plus時,相關參數和變量也將會保存在返回的函數中,這種方式也稱爲“閉包”(Closure)。
函數名和變量類型
類型 | 特徵 | 舉例 |
---|---|---|
private | 以兩個下劃線開頭代表非公開,不應該直接引用 | __xxx()、__x |
protected | 以一個下劃線開頭的,直接從外部訪問不會產生異常 | _xxx()、_x |
public | 一般使用的都是公開的,可以直接訪問 | abs()、max() |
特殊變量 | 名字前後都有兩個下劃線的量,允許被直接引用,但是會被用作特殊 | __author__、__name__ |