定义函数是编程中的基本技能之一,它允许我们将代码组织成可重用的块。Python 提供了简单而强大的方式来定义函数,并且支持多种参数传递方式和返回值处理。
定义函数
使用 def 关键字来定义一个函数。函数定义通常包括函数名、参数列表(可选)和函数体。以下是一个简单的例子:
def greet():
print("Hello, world!")
调用这个函数很简单:
greet() # 输出: Hello, world!
参数传递
位置参数 (Positional Arguments)
这是最常用的参数类型,参数按照它们在函数定义中的顺序传递给函数。
def greet(name):
print(f"Hello, {name}!")
greet("Alice") # 输出: Hello, Alice!
默认参数 (Default Arguments)
可以为参数指定默认值,如果调用时没有提供对应的参数,则使用默认值。
def greet(name="world"):
print(f"Hello, {name}!")
greet() # 输出: Hello, world!
greet("Bob") # 输出: Hello, Bob!
关键字参数 (Keyword Arguments)
您可以在调用函数时通过参数名来指定参数值,这样就不需要考虑参数的位置。
def greet(first_name, last_name):
print(f"Hello, {first_name} {last_name}!")
greet(last_name="Smith", first_name="John") # 输出: Hello, John Smith!
可变长度参数 (*args 和 **kwargs)
有时我们不知道需要传递多少个参数,或者想要传递一个字典或列表作为参数。这时可以使用 *args 和 **kwargs。
*args:收集所有额外的位置参数到一个元组中。
**kwargs:收集所有额外的关键字参数到一个字典中。
def greet_everyone(*names):
for name in names:
print(f"Hello, {name}!")
greet_everyone("Alice", "Bob", "Charlie")
def greet_with_details(**details):
for key, value in details.items():
print(f"{key}: {value}")
greet_with_details(name="David", age=30)
返回值
函数可以通过 return 语句返回一个或多个值。如果没有显式地使用 return,则函数会隐式地返回 None。
def add(a, b):
return a + b
result = add(5, 3)
print(result) # 输出: 8
返回多个值
Python 函数可以返回多个值,这实际上是返回了一个元组,然后可以解包为多个变量。
def get_user_info():
return "Alice", 25, "Engineer"
name, age, occupation = get_user_info()
print(name, age, occupation) # 输出: Alice 25 Engineer
示例:结合以上所有概念
下面是一个更复杂的例子,展示了如何将上述所有概念组合在一起:
def calculate_area(shape, *dimensions, **options):
"""
根据形状计算面积,支持矩形和圆。
:param shape: 形状名称 ('rectangle' 或 'circle')
:param dimensions: 对于矩形,传入两个维度;对于圆,传入半径。
:param options: 其他选项,如是否打印结果。
:return: 计算出的面积
"""
if shape == 'rectangle':
length, width = dimensions
area = length * width
elif shape == 'circle':
radius, = dimensions
area = math.pi * radius ** 2
else:
raise ValueError("Unsupported shape")
if options.get('print_result', False):
print(f"The area of the {shape} is {area:.2f}")
return area
# 使用示例
calculate_area('rectangle', 10, 5, print_result=True)
calculate_area('circle', 7, print_result=True)