python初識06-函式基礎
什麼是函式?數學中有函式的概念,用於完成一個計算功能。python中的函式也是用於完成功能,並且不侷限於計算,將你想實現的功能封裝起來,用特定的語法定義,就成為了一個函式。使用函式可以避免函式冗長,拓展性和可讀性差的缺點。
1、函式定義和呼叫
定義與呼叫函式有固定的格式
# 定義 def func(): print('hello,world') # 呼叫 func()無參函式
def add2(x, y): print(x + y) return "add2函式執行" # 呼叫 add2(1, 2)有參函式
def register(): pass # 用於保持結構的完整空函式
在函式定義階段,只檢測語法錯誤,不執行程式碼;函式呼叫時,才會執行程式碼內容。
函式的呼叫除了直接呼叫外,還有 放在表示式裡,將函式執行結果二次加工;作為引數,傳給另外的函式(函式巢狀呼叫)。
其中,將函式執行結果二次加工,也可以在定義函式時,將想要的結果返回(return),然後對返回值進行處理。
2、函式的返回值 return 返回值的特點:•. 返回的值沒有型別限制,也沒有個數限制
I: return或者函式沒return:返回值None
II: return 值:返回的就是該值本身
III: return 值1,值2,值3:返回元組(值1,值2,值3) •. return是函式結束執行的標誌,函式內可以有多個return,但只要執行一次函式就立即結束,並且將return後的值當作本次呼叫的結果返回。
defsquare(x): res = x ** 2 return x, res square(5) # 這是函式的返回值,此時沒有輸出(列印),可以將其賦給變數後使用 print(square(5)) # 輸出 (5, 25)
3、函式的引數
在上面的函式裡,我們用到了引數,在定義階段的引數(形參),可以看作變數名,在呼叫階段的引數(實參),就是給變數名賦值,即將值繫結到變數名,這種繫結關係在函式結束後接觸。
形參分為 位置形參和預設形參。
實參分為 位置實參和關鍵字實參。
def func(x, y, z): print(x, y, z) func(1, 2, 3)
x,y,z是位置形參,與之對應的在呼叫階段的1,2,3就是位置實參。這兩者一一對應,按從左到右的順序,只要有位置形參,就必須有位置實參。
def func(x, y=2): print(x, y) func(1)
y = 2 是預設形參,它給y指定了一個預設值,如果呼叫階段沒有對y傳值,y預設為2。
它的用途是,在呼叫過程中,如果某個引數的值出現多次相同,就可以將其指定為預設引數。
注意:位置形參必須放在預設形參的前面
def func(x, y, z): print(x, y, z) func(1, z=3, y=2)
呼叫階段指定的 z = 3, y = 2 是關鍵字實參,它按照key = vaule的形式,寫在位置實參的右邊。由於指定了key,故可以不按照定義時形參的順序,但一定是在位置是參的右邊。
4、引數中*和**的用法
由於形參與實參是一一對應的關係,如果需要傳入的引數個數可變,就需要從函式定義時改變引數的個數,為了能讓引數個數更加靈活,python提供了可變長引數。
• *形參:*會將溢位的位置實參存成元組的形式然後賦值其後變數名,習慣上使用*args接收呼叫時傳的位置實參
def func(x, y, *args): print(x, y, args) func(1, 2, 3, 4, 5, 6) # 輸出 1 2 (3, 4, 5, 6)
• **形參:**會將溢位的關鍵字實參存成字典的格式然後賦值其後變數名,習慣上使用**kwargs接收呼叫時傳的關鍵字實參
def func(x, y, **kwargs): print(x, y, kwargs) func(1, y=2, z=3, m=1, n=2) # 輸出 1 2 {'z': 3, 'm': 1, 'n': 2}
• *實參:先將實參打散成位置實參,然後再與形參做對應,*後必須是可迭代物件。
def func(x, y, z): print(x, y, z) func(1, *[2, 3]) # 輸出1 2 3 func(*[1, 2, 3]) # 輸出1 2 3
• **實參:先將實參打散成關鍵字實參,然後再與形參做對應,**後是字典。
def func(x, y, z): print(x, y, z) func(**{'x': 1, 'z': 3, 'y': 2})
可變長引數給我們提供了一種帥到不行的傳值方式,即:
def inner(x, y, z): print(x, y, z) def doco(*args, **kwargs): inner(*args, **kwargs) doco(1, 2, 3) # 輸出 1 2 3
你會發現,在dico() 裡傳入的引數,被傳入了inner() 函式,這種傳值方法在講到裝飾器時,你會體會到它有多帥!
階段思維導圖