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

第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}!")