1. 程式人生 > >python初識06-函式基礎

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後的值當作本次呼叫的結果返回。
def
square(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() 函式,這種傳值方法在講到裝飾器時,你會體會到它有多帥!

 

階段思維導圖