當前位置: 華文世界 > 科技

第5章 Python函式

2024-08-26科技

5.1 定義與呼叫

函式的作用:能夠將復雜的程式邏輯分解為可重復使用的模組。

業務→業務邏輯→程式邏輯

語法:

# 定義一個函式def 函式名(參數列): """ 這個函式的功能是實作xxx功能 """ 函式體 # 呼叫函式函式名(參數列)

範例:

# 定義一個函式def hello(): """ 這個函式的功能是實作輸出hello,world功能 """ print("HelloWorld") # 呼叫函式hello()

5.2 函式名

命名規則

1、可以由字母、數位和底線組成

2、不能以數位開頭

3、不能是 Python 中的關鍵字(如 if 、 for 、 while 等)

合法函式名範例

def my_function(): passdef add_numbers(): passdef calculate_sum(): pass

不合法函式名範例

# 以數位開頭def 123function(): pass# 是關鍵字def if(): pass

函式最佳命名規則

1、 使用小寫字母和底線 ,函式名應全部使用小寫字母,並使用底線 ( _ ) 分隔單詞。例如, add_numbers

2、 簡潔但具有描述性 ,函式名應該盡可能簡短,但也要足夠描述其功能。例如, get_total 比 gt 更好

3、 使用動詞 ,函式名通常以動詞開頭,因為它表示一個動作。例如, read_file , send_email

4、 使用名詞 ,如果函式用於獲取某些資訊,可以使用名詞。例如, get_list , fetch_data

5、 使用字首或字尾 ,使用字首或字尾可以幫助區分不同型別的函式。例如, is_valid 表示一個布爾檢查函式, get_ 通常用於獲取資訊

6、 避免使用數位 ,盡量不要在函式名中使用數位,除非它們有特殊意義。例如, process_data_v2 可能表示這是數據處理常式的第二個版本

最佳函式命名範例

def add_numbers(): passdef get_total(): passdef read_file(): passdef send_email(): passdef get_list(): passdef fetch_data(): passdef is_valid(): passdef process_data_v2(): pass

5.3 函式參數

在 Python 函式中,函式可以沒有參數,也可以有參數。如果有參數,函式參數是用來傳遞數據給函式的變量。根據不同的需求,Python 支持多種型別的參數,包括位置參數、關鍵字參數、預設值參數、不定長參數等。

5.3.1 位置參數

位置參數是按照順序來傳遞給函式的。

def multiply(x, y): print(x * y) multiply(3, 5) # 3 和 5 是位置參數

5.3.2 關鍵字參數

關鍵字參數允許你在呼叫函式時透過參數名指定參數值,這樣就不必關心參數的實際位置了。關鍵字參數可以在任何位置使用,並且可以與位置參數混合使用。

def multiply(x, y): print(x * y) multiply(x=3, y=5) # 使用關鍵字參數multiply(3, y=5) # 混合使用位置參數和關鍵字參數

當位置參數和關鍵字參數混合使用時,位置參數必須出現在關鍵字參數之前

5.3.3 預設值參數

預設值參數是在定義函式時為參數指定一個預設值。如果呼叫函式時沒有提供這個參數的值,那麽就會使用預設值。

def multiply(x, y=5): print(x * y)multiply(3, 6)multiply(3)multiply(x=3, y=6)multiply(x=3)

5.3.4 不定長參數

不定長參數允許函式接受不定數量的位置參數或關鍵字參數。

不定長位置參數 (*args)

當參數列前面加上星號 (*) 時,可以接收任意數量的位置參數。

def add_numbers(*args): numbers_sum = 0 for i in args: numbers_sum += i print(numbers_sum)add_numbers(1, 2)add_numbers(1, 2, 3)

不定長關鍵字參數(**kwargs)

當參數列前面加上兩個星號 (**) 時,可以接收任意數量的關鍵字參數。

def print_message(**kwargs): for key, value in kwargs.items(): print(key + "=" + str(value))print_message(name="buddha", age=18, height=1.75)print("*" * 20)print_message(name="buddha", age=18)

5.3.5 參陣列合

一個函式的參數可以有位置參數、預設值參數、不定長位置參數、不定長關鍵字參數的組合。如果有參陣列合,其函式定義時,參數從左到右的順序是:位置參數、預設值參數、不定長位置參數、不定長關鍵字參數。

def show(name, height=1.80, *args, **kwargs): print(f'{name},{height}') for i in args: print(i) for key, value in kwargs.items(): print(f'{key}-{value}')show("buddha", 1, 2, says="hello,world")

5.4 函式返回值

1、返回值,就是函式執行完畢,返回給呼叫者的結果。如果函式沒有顯式地返回任何值,則通常返回 None

2、函式需要顯示地返回 返回值 ,用關鍵字 return

3、函式內可以有多個return,碰到第一個return關鍵字就結束了函式的呼叫

4、在Python中,可以返回一個值,或用 元組 的方式返回多個值

返回一個值的範例

# 函式返回一個值def add_numbers(a, b): return a + bsum_numbers = add_numbers(1,2)print(sum_numbers) # 3

返回多個值的範例

# 函式返回元組,元組中含有多個值def do_numbers(a, b): return a + b, a - bnumbers = do_numbers(1, 2)print(numbers[0], numbers[1])

5.5 作用域

作用域是指變量在程式中的可見性範圍。

1、 局部作用域:

  • 在函式內部定義的變量具有局部作用域,只能在該函式內部存取。
  • 當函式呼叫結束時,局部變量的作用域也隨之結束。
  • 2、 全域作用域:

  • 在函式外部定義的變量具有全域作用域,可以在整個程式中存取。
  • 全域變量在程式執行開始時建立,在程式結束時銷毀。
  • 3、 封閉作用域:

  • 當一個函式內部定義了另一個函式時,內部函式可以存取外部函式的變量(局部變量)。
  • 外部函式的變量(局部變量)對於內部函式來說處於封閉作用域。
  • 4、 內建作用域:

  • Python 提供了一系列內建函式和常量,如 print() 、 type() 、 input() 等,它們在所有作用域中都是可用的。
  • 內層使用外層變量

    # 全域變量x = "全域變量"def outer_function(): y = "外部函式的局部變量" # 封閉作用域 def inner_function(): z = "內部函式的局部變量" # 局部作用域 print(z) print(y) # 存取封閉作用域中的變量 print(x) # 存取全域作用域中的變量 inner_function()outer_function()# 下面這行會丟擲 NameError,因為 y 是封閉作用域中的變量# print(y)# 下面這行會打印全域變量 x 的值print(x)

    原則是:內層可以使用外層,外層使用不了內層

    內層修改外層變量

    函式內部修改全域變量,該全域變量需要在函式內部用 global 關鍵字聲明

    內層函式修改外層函式的變量,該外層函式的局部變量在內層函式中用 nonlocal 關鍵字聲明

    外層不直接使用內層的變量,這樣子破壞了函式的封裝性

    5.6 函式的巢狀

    在 Python 中,函式的巢狀是指在一個函式內部定義另一個函式。這樣的設計可以用來建立更加復雜的功能組合,同時保持程式碼的整潔和模組化。

    簡單巢狀

    def outer(): print("這是外部函式被呼叫") def inner(): print("這是內部函式被呼叫") inner()outer()

    返回內部函式

    def outer_function(): print("外包函式...") def inner_function(): return "內部函式..." return inner_function # 返回內部函式的參照inner = outer_function() # 獲取內部函式的參照print(inner()) # 呼叫內部函式

    巢狀的套用

    def factorial(n): """ 實作階乘的功能,內部函式是遞迴函式 """ def recursive_factorial(n): if n == 0: return 1 else: return n * recursive_factorial(n - 1) return recursive_factorial(n)print(factorial(3)) # 輸出 6

    5.7 匿名函式

    在 Python 中,匿名函式也稱為 lambda 函式。它是一種簡潔的方式來定義一個小型的、一次性使用的函式。

    匿名函式的語法:

    lambda 參數: 運算式

    說明:

  • 參數:可以是一個或多個參數,多個參數之間用逗號分隔
  • 運算式:是一個單一的運算式,運算式的結果作為函式的結果返回
  • 範例:

    # 範例 1:計算兩個數的和add = lambda x, y: x + yprint(add(3, 5)) # 範例 2:對一個數進行平方運算square = lambda x: x ** 2print(square(4)) # 範例 3:判斷一個數是否為偶數is_even = lambda x: x % 2 == 0print(is_even(6))

    5.8 文件字串

    文件字串是放在函式、類或模組的第一個邏輯行上的字串,用於描述該物件的用途、行為或用法。 __doc__ 內容可以用來獲取這些文件字串的內容。

    範例:

    def function(*args): """函式的文件字串 :param args: 參數說明 :return: 函式返回值說明 """ pass# 透過 函式名.__doc__ 獲取文件字串print(function.__doc__)# 透過 help(函式名) 獲取文件字串help(function)

    5.9 內建函式

    Python 中提供了大量的內建函式,這些函式可以直接在程式中使用。

    5.9.1 獲取內建函式幫助資訊

    方式一:官方手冊地址:https://docs.python.org/3/library/functions.html

    方式二: 函式名.__doc__

    方式三:help(函式名)

    ......

    5.9.2 常見內建函式範例

    # print() 用於輸出文本或變量的值print("Hello, World!")num = 5print(num)# len() 返回物件(如字串、列表、元組等)的長度str = "Python"print(len(str)) list = [1, 2, 3, 4, 5]print(len(list))# range() 用於生成一個整數序列for i in range(5): print(i) # sum() 計算可叠代物件(如列表、元組等)中所有元素的總和numbers = [1, 2, 3, 4, 5]print(sum(numbers))# max() 和 min() 分別返回可叠代物件中的最大值和最小值numbers = [5, 2, 8, 1, 9]print(max(numbers))print(min(numbers))# abs() 返回一個數的絕對值num = -5print(abs(num))# type() 返回物件的型別num = 5print(type(num))# input() 用於獲取使用者的輸入name = input("請輸入您的名字:")print(f"您好,{name}!")