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

繁華似錦Fighting發表於2021-07-10

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'
# 顯示不支援字串和數值相加

所以以後我們在呼叫函式的之後,一定要看看傳遞實參的資料型別是否正確。

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

相關文章