1. 程式人生 > >python基礎語法總結(二)-- 函式function

python基礎語法總結(二)-- 函式function

python常用系統函式方法與模組

python基礎語法總結(一)-- python型別轉換函式+檔案讀寫

python基礎語法總結(二)-- 函式function

python基礎語法總結(三)-- 數與字串

python基礎語法總結(四)-- list列表

python基礎語法總結(五)-- 字典dic + 元組tuple

python基礎語法總結(六)-- python類與OOP面向物件特性


目錄

一. 函式定義

二. 函式與入參

1. 函式傳參的方式

2. 入參如果傳入列表,可能被函式改變其中內容

3. 傳遞任意數量的實參

三. 匿名函式 lambda


一. 函式定義

函式定義使用def關鍵字,使用接下來是方法名和入參,最後是冒號:

函式方法體在第一行下面,並且縮排若干空格(一般習慣4格)。所有保持同一縮排

'''函式定義'''
def function_1(arg1, arg2):
    """定義一個函式"""                    # 函式的註釋,會出現在help()的列印結果中
    print("arg1=" + arg1 + ", arg2=" + arg2)
    return

 

二. 函式與入參

1. 函式傳參的方式

  1. 位置傳參
  2. 關鍵字傳參
  3. 入參預設值
'''函式傳參方式'''
### 1 位置傳參
function_1("1", "2")                # 列印 arg1=1, arg2=2,呼叫時將第一個入參"1"傳入函式定義時的第一個引數arg1,第二個入參"2"傳入arg2

### 2 關鍵字傳參
function_1(arg1="1",arg2="2")       # 直接指定arg1傳入"1", arg2傳入"2"
function_1("1",arg2="2")            # 也可以只指定一個關鍵字入參,但必須放在最後


### 3 入參預設值
def function_2(arg1, arg2="2", arg3="3"):           # 定義函式時,直接對arg3入參設定預設值"3".有預設值的引數一定要放在最後
    print("arg1=" + arg1 + ", arg2=" + arg2 + ", arg3=" + arg3)

function_2("1","2","3")             # 列印arg1=1, arg2=2, arg3=3
function_2("1","2")                 # 即使沒有傳入arg3,也不會報錯,預設arg3賦值"3",列印:arg1=1, arg2=2, arg3=3
function_2(arg3="3", arg1="1", arg2="2")    # 全部使用關鍵字傳參時,順序可以顛倒
function_2(arg1="1", arg2="2")              # 不傳arg3也不報錯,使用預設值

注意:在呼叫函式時,如果有位置傳參和關鍵字傳參兩種方式
        1. 位置傳參必須放在關鍵字傳參之前
        2. 位置傳參的順序必須和函式定義時的順序一致

###
"""注意:在呼叫函式時,如果有位置傳參和關鍵字傳參兩種方式
        1. 位置傳參必須放在關鍵字傳參之前
        2. 位置傳參的順序必須和函式定義時的順序一致
"""
# function_1(arg1="1","2") 這種寫法會報錯:positional argument follows keyword argument,不能將關鍵字傳參放在位置傳參前
# function_1("2",arg1="1") 這種寫法會報錯:got multiple values for argument 'arg1'
                                # 位置傳參已經給arg1傳入"2"(位置傳參這個位置,只能傳給arg1),後面又用關鍵字傳參給arg1傳入"1",因此係統報錯
function_2("1", arg3="3", arg2="2")         # 當位置傳參正確時,後面的關鍵字傳參順序可以打亂
function_2("1", arg3="3")                   # 當位置傳參正確時,後面的關鍵字傳參可以省略部分或全部
# 總之,要先列出沒有預設值的形參,再列出有預設值的形參,要避免傳參歧義

 

2. 入參如果傳入列表,可能被函式改變其中內容

'''注意點:傳入列表,入參可能被函式方法改變'''
l1 = list(range(1,10,2))                # l1 = [1, 3, 5, 7, 9]

def function_3(init_list):
    for i in range(len(init_list)):
        init_list[i] = init_list[i] + 1     # 每一項都加一
function_3(l1)                  # 呼叫function_3函式
print(l1)                       # l1會被改變,列印結果:[2, 4, 6, 8, 10]

要避免改變原入參,可以用以下實現:

### 避免改變原入參的實現
l1 = list(range(1,10,2))                # l1 = [1, 3, 5, 7, 9]
function_3(l1[:])                       # 傳入l1的副本
print(l1)                               # l1 沒有被改變,仍為[1, 3, 5, 7, 9]

 

3. 傳遞任意數量的實參

# 傳遞任意數量的實參
def multi_args(a, *args):          # 可傳入多個引數,數量不定, 不定數量引數要放在最後;args是個空元組,並將傳入的引數都放在args中
    print(args)
multi_args(1,2,3,6,5,4)         # 成功執行,列印:(2, 3, 6, 5, 4),a賦值為1

# 使用任意數量的關鍵字實參
def multi_key_args(a, b, **key_args):           #key_args本質上是空字典,並將傳入的多個關鍵字入參都放入此引數中
    print(key_args)

multi_key_args(1, 2, first=3, second="ss")          #輸出: {'first': 3, 'second': 'ss'}
# multi_key_args(1, 2, 9, first=3, second="ss")  這樣寫會報錯 multi_key_args() takes 2 positional arguments but 3 were given, 說明**只能傳入關鍵字的引數

 

三. 匿名函式 lambda

'''匿名函式 lambda關鍵字'''
fun = lambda x: x * x           # 使用lambda關鍵字,定義一個匿名函式,返回平方,並將這個匿名函式傳給fun
fun(5)                          # 通過呼叫fun(x)來呼叫匿名函式,本例:25

### 匿名函式更多用在需要傳遞函式入參的地方
def function_out(a, fun):       # 準備工作,定義一個函式function_out(),其中第二個入參是函式型別的入參
    return fun(a) + 1
# 可以直接在呼叫某個函式時,在其入參的響應位置建立匿名函式並傳參,起到精簡程式碼的作用
result = function_out(3, lambda x: x + 5)           # 計算第一個入參+5之後再+1的值,本例:result = 9
result = function_out(3, lambda x: x ** 2)          # 計算第一個入參平方後再+1的值,本例:result = 10