『無為則無心』Python函數 — 25、Python中的函數

Python函數的說明

Python中函數的應用非常廣泛,前面章節中我們已經接觸過多個函數,比如 input()print()range()len() 函數等等,這些都是 Python 的內置函數,可以直接使用。

除了可以直接使用的內置函數外,Python 還支持自定義函數,即將一段有規律的、可重複使用的代碼定義成函數,從而達到一次編寫、多次調用的目的。

函數也是一個對象,對象是內存中專門用來存儲數據的一塊區域。

1、函數的使用

(1)定義函數

格式

def 函數名(參數):
    代碼1
    代碼2
    ......

你可以定義一個自己想要功能的函數,以下是簡單的規則:

  • 函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號()。
  • 任何傳入參數和自變量必須放在圓括號中間。圓括號之間可以用於定義參數。
  • 函數的第一行語句可以選擇性地使用文檔字符串,用於存放函數說明。
  • 函數內容以冒號起始,並且縮進。
  • return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回None

(2)調用函數

函數名(參數)

注意:

  1. 函數名是自定義的標識符,需符合定義標識符的規則與規範。
  2. 不同的需求,參數可有可無。

(3)使用函數的注意事項

  • 在Python中,函數必須先定義後使用
    如果先調用會報錯,NameError: name 'info_print' is not defined
  • 如果沒有調用函數,函數裏面的代碼不會執行,需要調用函數代碼才會執行。
  • 函數執行流程
    • 解釋器執行定義函數的時候,函數體內部縮進的代碼並沒有執行。
    • 當函數被調用的時候,解釋器回到定義函數的地方去執行下方縮進的代碼,當這些代碼執行完,回到調用函數的地方繼續向下執行。

練習

# 需求:一個函數:打印hello world

# info_print()  # 報錯函數未定義

# 定義函數
def info_print():
    print('hello world')

# 調用函數
info_print()

2、函數的參數

在Python中,函數參數的寫法有很多種,我們先來說一下,最簡單參數的寫法。

思考:完成需求如下:一個函數完成兩個數1和2的加法運算,如何書寫程序?

# 定義函數
def add_num1():
    result = 1 + 2
    print(result)

# 調用函數
add_num1()

思考:上述add_num1函數只能完成數字1和2的加法運算,如果想要這個函數變得更靈活,可以計算任何用戶指定的兩個數字的和,如何書寫程序?

分析

用戶要在調用函數的時候指定具體數字,那麼在定義函數的時候就需要接收用戶指定的數字。

那麼函數調用時候指定的數字和定義函數時候接收的數字即是函數的參數。

# 定義函數時同時定義了接收用戶數據的參數a和b,a和b是形參.
def add_num2(a, b):
    result = a + b
    print(result)


# 調用函數時傳入了真實的數據10 和 20,真實數據為實參.
add_num2(10, 20)

# 定義函數有2個參數,傳入數據也要是2個,一定要相等,否則會報錯
# 結果:TypeError: add_num2() missing 1 required positional argument: 'b'
add_num2(100)  # 報錯

總結

函數的參數:函數調用的時候可以傳入真實數據,增大函數的使用的靈活性.

  • 形參:函數定義時書寫的參數(非真實數據),定義形參就相當於在函數內部聲明了變量,但是並不賦值。
  • 實參:函數調用時書寫的參數(真實數據)。

如果函數定義時,指定了形參,那麼在調用函數時也必須傳遞實參,實參將會賦值給對應的形參。

簡單來說,調用函數時有幾個形參就得傳幾個實參。

3、實參的類型

函數在調用時,解析器不會檢查實參的類型,實參可以傳遞任意類型的對象。

任何數據類型,包括函數對象。

示例

# 定義函數1
def fn1(a):
    print('a =', a)

# 定義函數2
def fn2(b):
    print('b =', b)

b = 123  # b = 123
b = True  # b = True
b = 'hello'  # b = hello
b = None  # b = None
b = [1, 2, 3]  # b = [1, 2, 3]

fn2(b)
fn2(fn1)  # b = <function fn1 at 0x0000000002555948>

沒有類型檢查,有時候會導致出現一些問題,如下:

def fn3(a, b):
    print(a + b)

fn3(123, "456")

# 結果:TypeError: unsupported operand type(s) for +: 'int' and 'str'
# 顯示不支持字符串和數值相加

所以以後我們在調用函數的之後,一定要看看傳遞實參的數據類型是否正確。

以後我們學到異常的時候,可以通過異常來解決因傳遞參數類型錯誤,而引發的異常。