天天看點

Python-自定義函數

Python自定義函數

    • 聲明
    • 定義函數
    • 調用函數
    • 空函數
    • 函數傳回值
    • 函數參數
      • 預設參數
      • 可變參數
      • 關鍵字參數
      • 命名關鍵字參數
      • 參數組合
    • 遞歸函數
      • 遞歸優化--尾遞歸
      • 遞歸的優缺點

聲明

本篇内容是記錄廖雪峰老師的python教程筆記。

原教程網址為:https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888#0

定義函數

使用def定義函數,格式如下:

def f_name(f_para1,f_para2,…):

#此處縮進4格書寫函數體

調用函數

  • 同一py檔案下的,可以通過f_name(參數)調用
  • 調用另一py檔案下的函數,使用from 檔案名(無py) import f_name

空函數

def empty():

pass

函數傳回值

  • return

    傳回None

  • return x

    傳回x

  • return x1,x2,x3,…

    傳回一個tuple(x1,x2,x3,…)

函數參數

預設參數

def test(x,y=2)

此時預設y的值為2,在調用函數時,可以同時傳入兩個數分别賦給x,y,例如:test(3,3)

也可隻傳一個參數,賦給x,y此時取預設值2 ,例如:test(3)

預設參數必須指向不變對象(不變對象一旦建立,對象内部的資料就不能修改,減少了由于修改資料導緻的錯誤)

可變參數

在參數前面加入==*==号,表示傳入參數個數不确定,可以傳入任意個參數,包括0個參數。

這些可變參數,在函數調用時自動組裝為一個tuple。

關鍵字參數

允許傳入0/人一個含參數名的參數,這些關鍵字參數在函數内部自動組裝為一個dict

在參數前面加入==**==号,表明這是一個關鍵字參數。

命名關鍵字參數

閑置關鍵字參數的名字,例如隻接受city和job作為關鍵字參數,定義的函數如下:

def person(name, age, , city, job):

*後面的參數被視為命名關鍵字參數。

如果函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就不再需要一個特殊分隔符了。

命名關鍵字參數必須傳入參數名,這和位置參數不同。如果沒有傳入參數名,調用将報錯:

命名關鍵字參數可以有預設值,進而簡化調用;

參數組合

5種參數可以組合使用,但是,參數定義的順序必須是:必選參數、預設參數、可變參數、命名關鍵字參數和關鍵字參數

遞歸函數

遞歸優化–尾遞歸

為了防止棧溢出,将遞歸優化為尾遞歸,在return時不傳回表達式,僅傳回遞歸函數本身。

遺憾的是,大多數程式設計語言沒有針對尾遞歸做優化,Python解釋器也沒有做優化,是以,即使把上面的fact(n)函數改成尾遞歸方式,也會導緻棧溢出。

遞歸的優缺點

優點:邏輯簡單清晰

缺點:過深調用會導緻棧溢出

繼續閱讀