Python中函數的參數和返回值筆記

函數參數

參數種類

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__
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章