当前位置:  首页>> 技术小册>> Python编程轻松进阶(三)

7.2.7 形参和实参

在Python编程中,函数是组织代码块以实现特定功能的强大工具。函数通过接收输入(参数)并返回输出(返回值)来执行其任务。这些输入,即函数在定义时指定的变量,被称为形式参数(简称形参),而在调用函数时传递给函数的实际值则被称为实际参数(简称实参)。理解和掌握形参与实参的概念及其相互关系,对于编写高效、可复用的Python代码至关重要。

7.2.7.1 理解形参

形参是函数定义时声明的变量,它们代表了函数将要接收的数据的占位符。在函数体内部,你可以通过形参来访问传递给函数的值,并对这些值执行操作。形参的声明是在函数定义时完成的,通常位于函数名后的括号内,多个形参之间用逗号分隔。

  1. def greet(name, greeting):
  2. print(f"{greeting}, {name}!")

在这个例子中,namegreeting就是greet函数的形参。

7.2.7.2 实参的作用

实参是在调用函数时传递给函数的实际值。这些值可以是常量、变量、表达式的结果或者是其他函数的返回值。实参的数量、类型和顺序必须与函数定义中的形参相匹配(除非使用了特定的Python特性,如位置参数、关键字参数、默认参数、可变参数等),否则将引发错误。

继续上面的例子,调用greet函数时提供的值就是实参:

  1. greet("Alice", "Hello")

这里,"Alice""Hello"就是实参,它们分别被传递给namegreeting形参。

7.2.7.3 位置参数与关键字参数

  • 位置参数:按照函数定义中形参的顺序来传递实参。这是最常见的参数传递方式。
  1. greet("Bob", "Hi") # "Bob"对应name,"Hi"对应greeting
  • 关键字参数:在调用函数时,通过指定形参名来传递实参。这种方式使得参数的传递更加清晰,且可以不必按照形参定义的顺序来传递实参。
  1. greet(greeting="Hello", name="Charlie") # 关键字参数允许不按顺序传递

7.2.7.4 默认参数

在函数定义时,可以为形参指定默认值。如果在调用函数时没有为这些形参提供实参,那么将使用其默认值。默认参数提供了一种灵活的方式来处理可选的输入。

  1. def greet(name, greeting="Hello"):
  2. print(f"{greeting}, {name}!")
  3. greet("David") # 输出: Hello, David!

在这个例子中,greeting形参有一个默认值"Hello",因此在调用greet("David")时没有提供greeting实参时,将使用默认值。

7.2.7.5 可变参数

Python支持两种类型的可变参数,允许函数接收任意数量的实参:

  • *args(非关键字可变参数):允许你将一个不定长度的参数列表传递给一个函数。这些参数在函数内部被组织成一个元组。
  1. def sum_numbers(*args):
  2. return sum(args)
  3. print(sum_numbers(1, 2, 3, 4)) # 输出: 10
  • *kwargs(关键字可变参数):允许你将不定长度的关键字参数传递给一个函数。这些参数在函数内部被组织成一个字典。
  1. def greet_with_details(**kwargs):
  2. for key, value in kwargs.items():
  3. print(f"{key}: {value}")
  4. greet_with_details(name="Eve", age=30, occupation="Engineer")
  5. # 输出:
  6. # name: Eve
  7. # age: 30
  8. # occupation: Engineer

7.2.7.6 参数的混合使用

在Python中,你可以在同一个函数定义中混合使用位置参数、关键字参数、默认参数和可变参数。但是,它们的顺序和规则必须遵循一定的约定:

  1. 位置参数必须位于所有关键字参数之前。
  2. 默认参数必须位于所有位置参数之后。
  3. args参数必须位于所有位置参数和默认参数之后,但在*kwargs之前。
  4. **kwargs参数必须位于最后。
  1. def complex_function(a, b, c=0, *args, **kwargs):
  2. print(f"a: {a}, b: {b}, c: {c}")
  3. for arg in args:
  4. print(f"arg: {arg}")
  5. for key, value in kwargs.items():
  6. print(f"{key}: {value}")
  7. complex_function(1, 2, 3, 4, 5, extra1="foo", extra2="bar")
  8. # 输出:
  9. # a: 1, b: 2, c: 3
  10. # arg: 4
  11. # arg: 5
  12. # extra1: foo
  13. # extra2: bar

7.2.7.7 参数解包

在调用函数时,你还可以使用参数解包(unpacking)来传递列表、元组或字典作为位置参数、关键字参数。这通过***操作符实现。

  • 使用*解包列表或元组作为位置参数:
  1. numbers = [1, 2, 3]
  2. sum_numbers(*numbers) # 等同于 sum_numbers(1, 2, 3)
  • 使用**解包字典作为关键字参数:
  1. details = {"name": "Frank", "age": 25}
  2. greet_with_details(**details) # 等同于 greet_with_details(name="Frank", age=25)

7.2.7.8 结论

形参和实参是Python函数编程中的基本概念,它们共同构成了函数参数传递机制的核心。理解并熟练掌握这些概念,能够帮助你编写出更加灵活、强大且易于维护的Python代码。通过合理使用位置参数、关键字参数、默认参数、可变参数以及参数解包,你可以轻松处理各种复杂的参数传递场景,从而编写出更加高效、可复用的函数。在编写《Python编程轻松进阶(三)》这本书时,深入探讨这些概念及其应用场景,将有助于读者更好地掌握Python函数编程的精髓。


该分类下的相关小册推荐: