跳到主要内容

Python 函数定义与参数详解

基础参数类型

位置参数

我在定义函数时使用位置参数让函数的调用保持简单直观,但需要调用者严格按照参数定义的位置传参。面对需要严格参数顺序的场景,我会优先考虑使用位置参数,这样能确保代码逻辑的明确性。

def greet_user(user_name, message):
return f"{message}, {user_name}"

print(greet_user("my_user", "Hello")) # Hello, my_user

默认参数

我在函数定义中设置默认参数值,以便在不传入对应参数时使用默认值。这种方式有助于简化函数调用,特别是在大量场景下不需要对参数进行调整时。编写默认参数时,我会确保默认值为不可变对象,以避免在多次调用间产生意料之外的状态共享问题。

def greet_default(user_name="my_user"):
return f"Hello, {user_name}"

print(greet_default()) # Hello, my_user
print(greet_default("my_guest")) # Hello, my_guest

关键字参数

当我需要灵活调整参数顺序或提高代码的可读性时,我倾向使用关键字参数调用函数。通过为参数显式指定名称,可以避免参数顺序错误,同时增强代码的自解释性。

def pet_info(pet_type, pet_name):
return f"My {pet_type} is called {pet_name}"

print(pet_info(pet_name="Kitty", pet_type="cat")) # My cat is called Kitty

可变参数

可变位置参数

我在面对数量不确定的参数集合时,会使用*args 来接收多余的位置参数。这样在调用函数时可以灵活传入任意数量的参数,从而更好地应对动态数据的处理需求。

def make_food(size, *ingredients):
return f"Making {size} food with {', '.join(ingredients)}"

print(make_food("large", "beef", "tomato", "lettuce"))

可变关键字参数

面对需要处理大量可选配置数据时,我会使用**kwargs 来接收不定数量的关键字参数。这样能灵活扩展函数的适用范围,并轻松管理额外的参数信息。

def user_profile(name, age, **details):
profile = {"name": name, "age": age}
profile.update(details)
return profile

user = user_profile("my_user", 25, city="Beijing", job="developer")
print(user)

参数组合使用

当我将位置参数、默认参数、可变参数、关键字参数等组合使用时,会特别注意参数的定义顺序与调用方式。确保代码清晰易读的同时,我也会在函数调用中使用关键字参数来使代码更具有可读性。面对复杂情况,我会根据实际业务需求灵活调整参数传入的方式。

def complex_func(a, b=10, /, *args, c=None, **kwargs):
print(f"a={a}, b={b}")
print(f"args={args}")
print(f"c={c}")
print(f"kwargs={kwargs}")

complex_func(1, 2, 3, 4, x=10, y=20)

强制位置参数

在 Python 3.8 及以上版本中,我可以使用斜杠/来标记必须以位置形式传入的参数。这种特性在我需要明确区分参数传递方式时十分有用,能更好地控制函数接口的使用方式。

def calc(x, y, /, z):
return x + y + z

print(calc(1, 2, z=3)) # 符合要求
# print(calc(x=1, y=2, z=3)) 不符合要求 因为x和y必须以位置参数传入