四、Python的程序結構與函數
4.4 函數
函數能將代碼劃分為若干模塊,每一個模塊可以相對獨立的實現某一個功能,函數有兩個主要功能,分別是降低編程難度和實現代碼復用,函數是一種功能抽象,復用它可以將一個復雜的大問題分解為一系列簡單的小問題,小問題再分解成更小的問題,是一種分而治之的思想運用。
4.4.1 函數定義
函數的定義即函數功能的實現過程,包含函數頭與函數體兩部分。使用def關鍵字定義函數,后跟函數名、參數和冒號。函數體縮進。
語法格式如下:
def 函數名(參數1,參數2):函數體return 返回值列表
其中,關鍵要點包括:
def:關鍵字,標志著函數的開始。
函數名:函數的唯一標識。
參數:參數列表中的參數是形式參數,形參只在函數體中有效。
形文檔字符串:在函數體開始的第一個語句通常是一個字符串,用于描述函數的作用、參數、返回值等信息。
冒號:用于標記函數體的開始。
函數體:函數體包含了實現函數功能的代碼塊,由一行或多行代碼組成。
返回值:標志函數的結束,將返回值賦給函數的調用者,可選的返回一個值,如果沒有return,函數將返回none。
4.4.2 函數調用
函數被定義好之后不會立即執行,只有被程序調用時才會執行。
語法格式:
函數名(實參)
調用時,參數列表中給出實際要傳入函數內部的參數,這類參數稱為實際參數,即實參,實參可以是變量、常量、表達式、函數等。
4.4.3 參數傳遞
Python中函數的參數傳遞是指實參傳遞給形參的過程。python中函數支持以多種方式傳遞參數,包括位置傳遞,關鍵字傳遞,默認值傳遞,包裹傳遞,解包裹傳遞以及混合傳遞。
## 1. 位置傳遞(Positional Arguments)位置傳遞是最基本的參數傳遞方式,參數按照函數定義時的位置順序依次傳遞給函數。**示例:**```python
def greet(first_name, last_name):print(f"Hello, {first_name} {last_name}")greet("John", "Doe") # Hello, John Doe
markdown2. 關鍵字傳遞(Keyword Arguments)關鍵字傳遞允許調用者明確指定參數的名稱和值,這樣就不必關心參數的順序。示例:def greet(first_name, last_name):print(f"Hello, {first_name} {last_name}")greet(last_name="Doe", first_name="John") # Hello, John Doe
python3. 默認值傳遞(Default Argument Values)在函數定義時,可以為參數設置默認值。當調用函數時如果沒有傳遞該參數,則使用默認值。示例:def greet(name, greeting="Hello"):print(f"{greeting}, {name}")greet("John") # Hello, John
greet("Jane", greeting="Hi") # Hi, Jane
python4. 包裹傳遞(Variable-Length Non-Keyword Arguments, *args)使用星號(*)前綴的參數可以收集所有額外的位置參數,并將它們作為元組傳遞給函數。示例:def sum_all(*numbers):return sum(numbers)print(sum_all(1, 2, 3, 4)) # 10
python5. 解包裹傳遞(Unpacking, * for lists/tuples and ** for dictionaries)解包裹允許將一個列表、元組或字典解包成多個參數。示例:def greet(name, greeting):print(f"{greeting}, {name}")args = ["John", "Hello"]
greet(*args) # Hello, Johnkwargs = {"name": "Jane", "greeting": "Hi"}
greet(**kwargs) # Hi, Jane
python6. 可變關鍵字參數傳遞(Variable-Length Keyword Arguments, **kwargs)雙星號(**)前綴的參數可以收集所有額外的關鍵字參數,并將它們作為字典傳遞給函數。示例:def describe_person(name, **details):print(f"{name}:")for key, value in details.items():print(f" {key}: {value}")describe_person("Alice", age=30, job="Engineer") # Alice:# age: 30# job: Engineer
python7. 混合傳遞函數可以同時接受位置參數、關鍵字參數、默認值參數、可變參數等。示例:def describe_person(name, age, job=None, **details):print(f"{name} is a {age}-year-old {job or 'person'}:")for key, value in details.items():print(f" {key}: {value}")describe_person("Bob", 25, job="Developer", city="New York", hobby="Coding")
4.4.4 函數返回值(Return Values)
在Python中,函數可以通過return語句來返回一個或多個值。如果函數沒有顯式地返回任何值,則默認返回None。返回值可以是任何數據類型,包括基本類型(如整數、字符串)、復雜類型(如列表、字典)甚至是自定義對象。示例:
def add(a, b):return a + bresult = add(3, 4)
print(result) # 輸出:7def get_user_info(name, age):return {"name": name,"age": age}user = get_user_info("Alice", 30)
print(user) # 輸出:{'name': 'Alice', 'age': 30}
4.4.5 python函數作用域(Scope)
函數作用域決定了變量的可見性和生命周期。Python中有以下幾種作用域:1. 局部作用域(Local Scope):在函數內部定義的變量僅在該函數內部可見。函數執行完畢后,這些變量會被銷毀。
def my_function():local_var = 5print(local_var) # 可以訪問local_varmy_function() # 輸出:5
print(local_var) # 錯誤:NameError: name 'local_var' is not defined
python1. 全局作用域(Global Scope):在函數外部定義的變量擁有全局作用域,整個文件內都可以訪問,除非在函數內部被重新定義為局部變量。global_var = 10def access_global():print(global_var)access_global() # 輸出:10def modify_global():global global_var # 使用global關鍵字聲明使用全局變量global_var = 20modify_global()
print(global_var) # 輸出:20
python1. 內置作用域(Built-in Scope):包含Python內置的名稱(如len, range, str等),這些名稱在任何地方都可以直接訪問。2. 非局部作用域(Non-local Scope/Enclosing Scope):當一個函數嵌套在另一個函數內時,外層函數內的變量對內層函數而言是非局部變量。使用nonlocal關鍵字可以在內層函數中修改外層函數的變量。def outer():enclosed_var = 100def inner():nonlocal enclosed_varenclosed_var = 200print(enclosed_var)inner()print(enclosed_var) # 輸出也會是200,因為inner函數修改了enclosed_varouter()
python理解函數作用域對于編寫清晰、可維護的代碼至關重要,它幫助我們控制變量的可見范圍,避免命名沖突。
4.5 匿名函數(Lambda Functions)
匿名函數,通常被稱為lambda函數,在Python中是一種簡潔的方式用于定義小型、一次性使用的函數。這種函數不需要使用def關鍵字來定義,而是使用lambda關鍵字。lambda函數的主要用途是在需要小函數的地方,特別是在作為參數傳遞給高階函數時,如map(), filter(), sorted()等。
語法:lambda arguments: expression
python示例:# 使用lambda函數進行平方計算
square = lambda x: x ** 2
print(square(5)) # 輸出:25
使用lambda函數對列表進行排序
students = [("Alice", 28), ("Bob", 22), ("Charlie", 30)]
students.sort(key=lambda student: student[1])
print(students) # 輸出:[('Bob', 22), ('Alice', 28), ('Charlie', 30)]
4.6 模塊化編程
模塊化編程是一種將程序分解成獨立部分的方法,每個部分負責特定的功能。在Python中,模塊就是包含Python定義和語句的文件。通過將代碼組織成模塊,可以提高代碼的可讀性、可重用性和可維護性。
創建模塊: 創建一個.py文件即為創建一個模塊,例如math_operations.py。模塊內容示例:# math_operations.py
def add(a, b):return a + bdef subtract(a, b):return a - b
python導入模塊: 使用import語句可以導入模塊,然后調用其中的函數。導入示例:import math_operationsresult = math_operations.add(5, 3)
print(result) # 輸出:8result = math_operations.subtract(10, 4)
print(result) # 輸出:6
python從模塊導入特定函數: 使用from ... import ...語句可以直接導入模塊中的特定函數,而無需每次調用時都加上模塊名前綴。導入特定函數示例:from math_operations import add, subtractresult = add(7, 2)
print(result) # 輸出:9result = subtract(15, 5)
print(result) # 輸出:10
python使用as關鍵字給模塊或函數起別名: 可以使用as關鍵字給導入的模塊或函數起別名,簡化調用過程。別名示例:import math_operations as moresult = mo.add(8, 2)
print(result) # 輸出:10from math_operations import add as a, subtract as sresult = a(9, 3)
print(result) # 輸出:12result = s(18, 8)
print(result) # 輸出:10
python模塊化編程是Python編程中的一項重要技能,它有助于保持代碼的整潔和高效,同時也便于團隊協作和代碼復用。