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、 內建作用域:
內層使用外層變量
# 全域變量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}!")