文章

Python 函数参数介绍

Python 函数的参数非常灵活,支持多种不同的形式和组合。理解这些不同类型的参数以及它们的使用方式是掌握 Python 编程的基础之一。以下是对 Python 函数参数的详细介绍,以及与之相关的知识。

1. 位置参数(Positional Arguments)

最常见的参数类型。参数是按顺序传递给函数的,即函数调用时会依照参数的定义顺序进行匹配。

示例:

1
2
3
4
5
def greet(name, age):
    print(f"Hello, {name}! You are {age} years old.")

# 调用函数时按位置传递参数
greet("Alice", 30)  # 输出: Hello, Alice! You are 30 years old.

说明:

  • nameage 是位置参数。调用函数时,"Alice" 被传递给 name30 被传递给 age

2. 默认参数(Default Arguments)

可以为函数的某些参数设置默认值。如果调用时没有传递这些参数,则使用默认值。

示例:

1
2
3
4
5
6
7
8
def greet(name, age=25):
    print(f"Hello, {name}! You are {age} years old.")

# 调用时没有传递 age 参数,使用默认值
greet("Alice")  # 输出: Hello, Alice! You are 25 years old.

# 调用时传递了 age 参数
greet("Bob", 30)  # 输出: Hello, Bob! You are 30 years old.

说明:

  • age 是默认参数。函数调用时,如果没有提供 age 参数,使用 25 作为默认值。

3. 可变位置参数(Variable Positional Arguments)

通过 *args 传递任意数量的位置参数,这些参数会被收集成一个元组。args 只是一个约定名称,你可以使用任何有效的变量名。

示例:

1
2
3
4
5
6
7
8
9
10
11
def print_numbers(*args):
    for num in args:
        print(num)

print_numbers(1, 2, 3, 4, 5)
# 输出: 
# 1
# 2
# 3
# 4
# 5

说明:

  • *args 用来接收任意数量的位置参数。这些参数会被收集成一个元组,在函数内部可以通过 args 来访问。

4. 关键字参数(Keyword Arguments)

通过 **kwargs 接受任意数量的关键字参数。kwargs 是一个字典,存储的是参数名和对应的值。

示例:

1
2
3
4
5
6
7
8
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Alice", age=30)
# 输出: 
# name: Alice
# age: 30

说明:

  • **kwargs 使得函数能够接收多个以键值对形式传递的关键字参数。这些参数会被存储在一个字典中。

5. 命名关键字参数(Named Keyword Arguments)

通过 * 来指定命名关键字参数。* 后面的参数只能通过关键字传递,不能通过位置传递。这种方法通常用于强制传递参数时使用关键字。

示例:

1
2
3
4
5
def greet(*, name, age):
    print(f"Hello, {name}! You are {age} years old.")

greet(name="Alice", age=30)  # 输出: Hello, Alice! You are 30 years old.
# greet("Alice", 30)  # 错误: TypeError: greet() missing 2 required keyword-only arguments: 'name' and 'age'

说明:

  • nameage 需要通过关键字传递,不支持通过位置传递。

6. 混合参数(Mixed Arguments)

Python 允许将不同类型的参数混合使用。你可以将位置参数、默认参数、可变参数和关键字参数混合在一起,虽然需要注意参数的顺序。

示例:

1
2
3
4
5
6
7
8
9
10
def example(a, b=10, *args, c, d=20, **kwargs):
    print(f"a: {a}, b: {b}, c: {c}, d: {d}")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")

example(1, 2, 3, 4, c=5, d=30, extra1="extra", extra2="info")
# 输出:
# a: 1, b: 2, c: 5, d: 30
# args: (3, 4)
# kwargs: {'extra1': 'extra', 'extra2': 'info'}

说明:

  • a 是位置参数。
  • b 是默认参数。
  • *args 捕获多余的位置参数,存储在元组中。
  • c 是命名关键字参数,必须通过关键字传递。
  • d 是具有默认值的命名关键字参数。
  • **kwargs 捕获关键字参数,存储在字典中。

7. 参数类型注解(Type Annotations)

Python 允许你在函数参数和返回值上添加类型注解。这对代码的可读性和静态类型检查非常有帮助。

示例:

1
2
3
4
def add_numbers(a: int, b: int) -> int:
    return a + b

print(add_numbers(5, 10))  # 输出: 15

说明:

  • a: intb: int 表示 ab 应该是 int 类型。
  • -> int 表示该函数的返回值应该是 int 类型。

8. 命名参数的默认值

命名参数(带有默认值的参数)出现在位置参数后,函数调用时,如果没有提供该参数,会使用默认值。可以通过显式传递关键字参数来覆盖默认值。

示例:

1
2
3
4
5
def greet(name, age=25):
    print(f"Hello, {name}! You are {age} years old.")

greet("Alice")  # 输出: Hello, Alice! You are 25 years old.
greet("Bob", age=30)  # 输出: Hello, Bob! You are 30 years old.

说明:

  • age 有默认值,因此可以省略,但可以通过关键字参数传递新值。

9. \*\** 的高级用法

  • *args 用来接收不确定数量的位置参数。
  • **kwargs 用来接收不确定数量的关键字参数。
  • * 单独使用时,会强制要求后面的参数必须通过关键字传递。

10. 参数的顺序

在 Python 中,函数参数的顺序必须遵循以下规则:

  1. 位置参数:在最前面。
  2. 默认参数:紧跟位置参数。
  3. \*args:在默认参数之后。
  4. 命名关键字参数:通过 * 分隔,要求通过关键字传递。
  5. \**kwargs:放在最后。

总结

Python 的函数参数非常灵活,允许开发者根据需要选择最合适的参数类型。常见的参数类型包括位置参数、默认参数、可变位置参数、关键字参数、命名关键字参数等,结合使用这些不同类型的参数,可以使得函数更加灵活和易用。同时,类型注解也使得函数参数和返回值更加清晰。

如果你对某一类参数有更具体的疑问或想进一步深入了解,请随时告诉我!

本文由作者按照 CC BY 4.0 进行授权