標籤:ict 應該 自變數 傳回值 world 自訂 使用者自訂函數 另一個 對象
函數
l 函數是組織好的、可重複使用的,用來實現單一或相關功能的程式碼片段
l 函數能提高應用的模組性和代碼的重複利用率。Python提供了許多內建函數,也可以自己建立函數,這被叫做使用者自訂函數
l 函數分類:內建函數、自訂函數
l 不使用函數的問題:組織圖不清晰、代碼冗餘、無法統一管理且維護難度大
一、定義函數
l 函數代碼塊以def關鍵詞開頭,後接函數標識符名稱和圓括弧()
l 任何傳入參數和自變數必須放在圓括弧中間,圓括弧之間可以用於定義參數
l 定義函數的三種形式:無參(只執行一些操作)、有參(根據傳進的參數執行相應的邏輯)、空函數(設計代碼結構)
l 函數的第一行語句可以選擇性的使用文檔字串用於存放函數說明
l 函數內容以冒號起始,並且縮排
l return[運算式]結束函數,選擇性的返回一個值給調用方。不帶運算式的return相當於返回None
文法:
def 函數名(參數列表):
函數體
執行個體:
def hello(): print(‘Hello World!‘)hello()
二、 return語句
return [運算式] 語句用於退出函數,選擇性的向調用方返回一個運算式。不帶參數值的return語句返回None
l 一個函數沒有return時則返回None,等同於return None
l return跟一個值則返回該值,值沒有資料類型限制
l return跟多個值則返回一個元組
l 什麼時候需要有傳回值:
調用函數,經過一系列的操作,最後要拿到一個明確的結果,則必須要有傳回值
通常有參函數需要有傳回值,輸入參數經過計算得到一個最終的結果
l 什麼時候不需要有傳回值:
調用函數,僅僅只是執行一系列的操作,最後不需要得到什麼結果,則無需有傳回值
通常無參函數不需要有傳回值
執行個體:
def my_sum (arg1,arg2): total = arg1 + arg2 return totalres = my_sum(10,20)print(res)
三、函數調用的形式
1、語句形式,例:foo()
2、運算式形式,例:res=len(‘hello‘)
3、當做另一個函數的參數,例:range(len(‘hello‘))
四、 函數的參數
l 函數的參數分兩種:
形參:函數中的參數
實參:提供給函數調用的值
l 參數賦值方式:
1、 位置參數:按照從左至右的順序定義的參數,調用時的數量必須和聲明時的一樣
def foo(x,y): print(x) print(y)foo(1,2)
2、 關鍵字參數:按照“參數名=參數值”的形式定義,參數的順序可以與聲明時不一致。需要注意的是:關鍵字實參必須在位置實參右邊,對同一個形參不能重複傳值
def foo(x,y): print(x) print(y)foo(y=2,x=1)
3、 預設參數:調用函數時,如果沒有傳遞參數,則會使用預設參數。需要注意的是:預設參數必須在位置形參右邊,通常應該定義成不可變類型
def foo(name,age,sex=‘male‘): #在定義階段就已經為形參賦值了 print(name,age,sex)foo(‘zhangsan‘,age=18)foo(‘lisi‘,age=20)foo(‘wangwu‘,21,sex=‘female‘) #也可以為預設參數賦值
4、 可變長參數:針對實參在定義時間長度度不固定的情況,應該從形參的角度找到可以接收可變長實參的方案,這就是可變長參數(形參)。針對位置參數使用*args,關鍵字參數使用**kwargs
def foo(x,y,*args): #加了*號的變數名會存放所有未命名的變數參數。如果在函數調用時沒有指定參數,它就是一個空元組 print(x) print(y) print(args)foo(1,2,3,4,5,6)#執行結果如下:12(3, 4, 5, 6)
def foo(x,y,**kwargs): #加了**的變數名會存放所有未命名的變數參數。如果在函數調用時沒有指定參數,它就是一個空字典 print(x) print(y) print(kwargs)foo(x=1,y=2,z=3,a=4,b=5,c=6) #執行結果如下:12{‘z‘: 3, ‘a‘: 4, ‘b‘: 5, ‘c‘: 6}
擴充用法:
def foo(x,y,*args): print(x) print(y) print(args)foo(1,2,*(3,4,5,6)) #實際是:*args = *(3,4,5,6),結果為args = 3,4,5,6。可以簡單拆開打回原形#執行結果如下12(3, 4, 5, 6)
def foo(x,y,**kwargs): print(x) print(y) print(kwargs)foo(x=1,y=2,**{‘z‘:3,‘a‘:4,‘b‘:5,‘c‘:6})#執行結果如下:12{‘z‘: 3, ‘a‘: 4, ‘b‘: 5, ‘c‘: 6}
5、 命名關鍵字參數:*後定義的參數,必須被傳值(有預設值的除外),且必須按照關鍵字實參的形式傳值
def foo(*args,y): print(args) print(y)foo(1,2,3,4,5,y=6)
五、 函數對象
函數是第一類對象,即函數可以當做資料傳遞
1、 可以被賦值
def foo(): print(‘Hello World!‘)f = foof()
2、 可以當做參數傳入
def foo(): print(‘Hello World!‘)def wrapper(func): func()wrapper(foo)
3、 可以當做函數的返回
def foo(): print(‘Hello World!‘)def wrapper(func): return funcres = wrapper(foo)print(res)
4、 可以當做容器類型的元素
def foo(): print(‘Hello World!‘)dict = { ‘func‘:foo}print(dict)dict[‘func‘]()
Python 函數基礎