9.1 参数 vs 实参
刚开始学习时,大家经常会搞混“参数”和“实参”的概念,但理解它们的区别对于掌握函数式编程非常重要。
参数 是函数定义中列出的变量。它们是函数用来引用传递给它的值的名称。函数参数就像是函数体中将要使用的值的“占位符”。定义函数时,我们描述的是它的参数。
def print_info(name, age): # name 和 age 是参数
print(f"Name: {name}, Age: {age}")
实参 是在调用函数时传递给函数的具体值或数据。实参会替换参数的位置来执行函数。实参可以是常量、变量、表达式甚至是其他函数的结果。
print_info("Alice", 30) # "Alice" 和 30 是实参
实参种类
- 位置实参:值按参数定义的顺序进行传递。
- 关键字实参:通过参数名称传递给函数的实参,允许它们在位置实参之后按任意顺序列出。
- 默认实参:在定义函数时,参数可以被赋予默认值。
你已经在使用位置实参,关键字实参和默认实参我们将在接下来的课程中讨论。
在Python中,参数和实参之间的区别有助于理解函数如何接收和处理数据。这种区别对于创建灵活的函数很重要,可以很容易地适应不同的调用环境,使代码更模块化和可复用。
9.2 默认值
Python中的默认实参是允许函数预先为一个或多个参数设置默认值的机制。这使得函数调用更加方便灵活,因为不需要每次调用函数时显式地指定所有实参。
定义默认实参
默认实参在函数定义中设置,其中在声明参数时指定一个会被使用的值,
如果在调用函数时实参未被传递
:
def print_info(name, company='Unknown'):
print(f"Name: {name}, Company: {company}")
在这个例子中,company
的默认值是'Unknown'。
- 简化函数调用:具有多个参数的函数可以只指定最重要的实参来调用。
- 灵活性:可以在不改变代码的情况下将函数适应于不同的使用场景。
- 代码可读性:明确指定默认值使代码自解释。
重要注意事项
不可变性:默认实参的值应该是不可变的数据类型,比如数字、字符串或元组。使用可变类型(例如列表或字典)可能会导致不想要的副作用,由于对这些对象的更改会在函数调用之间保留。
实参顺序:在函数定义中,具有默认值的参数应该跟在没有默认值的参数之后。
再看一个例子:
def create_user(username, is_admin=False):
if is_admin:
print(f"User {username} is an admin.")
else:
print(f"User {username} is a regular user.")
create_user("Alice") # is_admin == False
create_user("Bob", is_admin=True) # is_admin == True
create_user("Karl", True) # is_admin == True
上面展示了3种调用具有默认实参的函数的方法:每种方法都是有效的。
9.3 按名称传递参数
将参数按名称传递给函数使得更加清楚哪些值被传递给哪些实参,提升了代码的可读性,并减少了由于实参顺序不正确导致的错误。
要按名称传递参数的值,在调用函数时需将值赋予特定参数:
函数(参数1 = 值, 参数2 = 值)
这种方式在处理具有多个参数或具有默认值的参数的函数时特别有用。
按名称传递参数的优点
- 清晰和可读性:在调用时指定参数名称使得代码对其他开发者或自己重新查看旧代码时更易懂。
- 灵活性:参数可以按任意顺序传递,这在函数有多个参数时特别方便。
- 避免错误:无需记住函数的参数顺序,减少了由于传递不正确的实参而导致的错误的可能性。
使用示例
def create_profile(name, age, job):
print(f"Name: {name}")
print(f"Age: {age}")
print(f"Job: {job}")
create_profile(name = "John", age = 28, job = "Developer")
在这个例子中,参数不是按照顺序传递的,但是它们每个都被显式赋值,使得函数的调用更加灵活和清晰。
示例 2:
顺便说一下,你之前已经遇到过按名称传递参数。记得print()
函数吗?
特性和限制
按名称传递的参数必须跟在没有名称的参数之后,如果在函数定义中存在这样的参数。
不得在函数调用中多次使用相同的参数名称。
按名称传递参数是Python的一项强大功能,特别是在处理具有多个实参或可选值的函数时,使代码更加安全和可读。
GO TO FULL VERSION