# Python的函數參數怎么使用
## 1. 函數參數基礎概念
在Python中,函數參數是函數定義時聲明的變量,用于接收調用函數時傳遞的值。參數允許我們將數據傳遞到函數內部進行處理,是實現代碼復用和模塊化的重要手段。
### 1.1 基本參數傳遞
最簡單的函數參數形式是位置參數:
```python
def greet(name, message):
print(f"{message}, {name}!")
greet("Alice", "Hello") # 輸出: Hello, Alice!
在這個例子中:
- name
和message
是形式參數
- “Alice”和”Hello”是實際參數
- 參數按照位置順序一一對應
需要注意的是: - 函數參數只在函數內部有效 - 參數名與外部變量名互不影響 - 參數傳遞實際上是對象引用的傳遞
x = 10
def modify(num):
num = 20 # 不會影響外部的x
print(num)
modify(x) # 輸出: 20
print(x) # 輸出: 10
Python支持多種參數傳遞方式,每種方式都有其特定的使用場景。
最常見的參數類型,按照定義時的順序進行傳遞:
def power(base, exponent):
return base ** exponent
result = power(2, 3) # 2的3次方
print(result) # 輸出: 8
注意事項: - 必須按照定義的順序傳遞 - 數量必須匹配 - 適用于參數較少且含義明確的情況
通過參數名指定值,可以不按順序傳遞:
def person_info(name, age, city):
print(f"{name}, {age}歲, 來自{city}")
person_info(age=25, city="北京", name="張三")
優勢: - 提高代碼可讀性 - 允許跳過某些參數(當有默認值時) - 適合參數較多的情況
為參數指定默認值,調用時可省略:
def greet(name, message="你好"):
print(f"{message}, {name}!")
greet("李四") # 輸出: 你好, 李四!
greet("王五", "Hi") # 輸出: Hi, 王五!
重要規則: - 默認參數必須放在非默認參數后面 - 默認值在函數定義時計算一次(注意可變對象的陷阱) - 適合參數有常用默認值的情況
處理不確定數量的參數時使用:
接收任意數量的位置參數,打包為元組:
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2, 3)) # 輸出: 6
print(sum_numbers(1, 2, 3, 4, 5)) # 輸出: 15
接收任意數量的關鍵字參數,打包為字典:
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=25, city="New York")
當多種參數類型混合使用時,必須遵循嚴格的順序:
示例:
def complex_func(a, b=2, *args, c=3, **kwargs):
print(f"a={a}, b=, args={args}, c={c}, kwargs={kwargs}")
complex_func(1, 4, 5, 6, c=7, x=8, y=9)
# 輸出: a=1, b=4, args=(5, 6), c=7, kwargs={'x': 8, 'y': 9}
在*args
后定義的參數必須使用關鍵字傳遞:
def kw_only(a, *args, b, c=2):
print(a, args, b, c)
kw_only(1, 3, 4, b=5) # 正確
kw_only(1, 2, 3) # 報錯,缺少b參數
調用函數時可以使用*
和**
解包序列和字典:
def point3d(x, y, z):
print(f"坐標: ({x}, {y}, {z})")
# 列表解包為位置參數
coords = [1, 2, 3]
point3d(*coords) # 相當于 point3d(1, 2, 3)
# 字典解包為關鍵字參數
params = {'x': 4, 'y': 5, 'z': 6}
point3d(**params) # 相當于 point3d(x=4, y=5, z=6)
Python 3.5+支持類型注解,提高代碼可讀性:
from typing import List, Dict
def process_data(
names: List[str],
scores: Dict[str, float],
threshold: float = 0.5
) -> List[str]:
return [name for name in names if scores.get(name, 0) > threshold]
注意: - 類型提示不會強制類型檢查 - 需要使用mypy等工具進行靜態檢查 - 提高代碼可維護性和IDE支持
def append_to(element, lst=[]): # 危險!
lst.append(element)
return lst
print(append_to(1)) # [1]
print(append_to(2)) # [1, 2] 不是預期的[2]
正確做法:
def append_to(element, lst=None):
if lst is None:
lst = []
lst.append(element)
return lst
Python的參數傳遞既不是傳值也不是傳引用,而是傳遞對象引用:
def modify_list(lst):
lst.append(4) # 會修改原始列表
lst = [7,8,9] # 不會影響原始列表
my_list = [1,2,3]
modify_list(my_list)
print(my_list) # 輸出: [1, 2, 3, 4]
*args
和**kwargs
提高靈活性def configure_app(**settings):
defaults = {
'debug': False,
'timeout': 30,
'retries': 3
}
final_settings = {**defaults, **settings}
# 應用配置邏輯...
return final_settings
def validate_input(*validators):
def decorator(func):
def wrapper(*args, **kwargs):
for i, val in enumerate(args):
if i < len(validators):
validators[i](val)
return func(*args, **kwargs)
return wrapper
return decorator
@validate_input(lambda x: x > 0, str.isalpha)
def process_data(num, text):
print(f"處理數字{num}和文本{text}")
process_data(10, "abc") # 正常
process_data(-1, "123") # 報錯
Python的函數參數系統既靈活又強大,理解各種參數類型及其適用場景對于編寫清晰、可維護的代碼至關重要。從簡單的位置參數到復雜的參數解包,每種技術都有其用武之地。掌握這些概念后,你將能夠設計出更加優雅和高效的函數接口。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。