在 Python 编程中,函数是组织代码、提高复用性的基本单元。而“参数”是函数与外界交互的关键桥梁。理解函数参数的不同形式及其使用规则,有助于编写更灵活、清晰和健壮的代码。
一、五种函数参数的形式
Python 中的函数参数主要包括以下几类:
正确的顺序:
位置参数 → 默认参数 → *args → 命名关键字参数 → **kwargs
示例:
def example(a, b=2, *args, c, d=4, **kwargs):
...二、五种参数详细讲解
1、位置参数
位置参数(Positional Arguments)最常见的参数形式之一,参数顺序决定了值的匹配关系。
def greet(name, message):
print(f"{message}, {name}!")
greet("Alice", "Hello") # 输出:Hello, Alice!调用时按顺序传入参数即可。
2、默认参数
默认参数(Default Arguments)指的是为某些参数设定默认值,在调用时可以省略这些参数。
def greet(name, message="Hello"):
print(f"{message}, {name}!")
greet("mediaTEA") # 输出:Hello, mediaTEA!
greet("mediaTEA", "Good morning") # 输出:Good morning, mediaTEA!默认值在函数定义时就被计算并固定,不会在每次调用时重新初始化。如果默认值是可变对象(如列表或字典),所有调用共享同一个对象,容易造成逻辑错误。
错误示例:
def add_item(item, lst=[]): # 错误示范:共享一个默认列表
lst.append(item)
return lst期望输出:
print(add_item(1)) # 期望输出:[1]
print(add_item(2)) # 期望输出:[2]实际输出:
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2]
print(add_item(3)) # [1, 2, 3]修正写法:
def add_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst3、可变位置参数
可变位置参数(Variable Position Arguments,*args)用于接收多个额外位置参数,以元组形式传入。
def sum_all(*numbers):
total = sum(numbers)
print(f"Sum = {total}")
sum_all(1, 2, 3, 4) # 输出:Sum = 10也可以通过 * 运算符解包序列传入:
nums = [10, 20, 30]
sum_all(*nums) # 输出:Sum = 604、仅限关键字参数
仅限关键字参数(Keyword-only Arguments),也称“命名关键字参数”,Python 3 特性,若函数定义中出现了 *,其后的参数只能通过关键字传参。
def register(name, *, city, age):
print(f"{name} lives in {city}, age {age}.")
register("Alice", city="Beijing", age=22) # 正确
# register("Alice", "Beijing", 22) # 错误:city 和 age 必须显式写出参数名调用时必须显式写出参数名。这种方式可提升函数调用的可读性和安全性。
也可以为 * 之后的关键字参数设置默认值。
def greet(name, *, mood="happy"):
print(f"Hello, {name}! You seem {mood} today.")
greet("Alice") # Hello, Alice! You seem happy today.
greet("Bob", mood="excited") # Hello, Bob! You seem excited today.5、可变关键字参数
可变关键字参数(Variable Keyword Arguments,**kwargs)用于接收任意数量的关键字参数,形式上是一个字典。
def print_profile(**info):
for key, value in info.items():
print(f"{key}: {value}")
print_profile(name="mediaTEA", age=7, city="Changsha")也可以通过 ** 运算符解包字典传参:
data = {"name": "xiao hong", "age": 18}
print_profile(**data)三、综合示例
def demo(a, b=2, *args, c=3, **kwargs):
print("a =", a)
print("b =", b)
print("args =", args)
print("c =", c)
print("kwargs =", kwargs)
demo(10, 20, 30, 40, c=50, d=60, e=70)
# 解释:a=10(位置1),b=20(位置2),args=(30,40),c=50(命名),其余进入 kwargs输出结果:
a = 10
b = 20
args = (30, 40)
c = 50
kwargs = {'d': 60, 'e': 70}小结:参数顺序
先定必传(位置),再定默认(Default),星号打包(*args),限定命名(*),双星兜底(**kwargs)。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.