1. 函数参数的概念
在Python中,单词function表示一个可以重复执行的代码块,可以接受输入并产生输出。函数可以用一组指定的参数调用。在函数中,这些参数在执行过程中被用作变量。
函数定义中的参数是函数可以接受的值。参数定义包括函数名称、参数列表(括在圆括号中)和冒号。函数也可以不需要参数,在这种情况下,括号是必需的,但它们在其中没有任何内容。
def function_name(parameter):
"""docstring"""
statement(s)
2. 参数传递的方式
2.1 位置参数
位置参数是指在函数定义中,参数的名称可以作为传递的值的名称,参数的值则是传递给该函数的对应值。
def add(a, b):
return a + b
print(add(1, 2)) # 3
在上述的add函数中,参数a和b都是位置参数,调用时需要按照顺序传递,如add(1, 2)。函数将1赋给a,2赋给b,然后返回它们的和。
2.2 关键字参数
关键字参数是指在函数调用时,参数名称和参数值对应传递。
def add(a, b):
return a + b
print(add(b=2, a=1)) # 3
在上述的add函数中,参数a和b仍然是位置参数,但是使用关键字参数可以让我们指定参数的名称,如add(b=2, a=1)。这种方式允许我们更加灵活地传递参数,特别是在函数的参数列表很长时,可以避免混淆参数的顺序。
2.3 默认参数
默认参数是指在函数定义时,可以给参数设置默认值。
def add(a, b=2):
return a + b
print(add(1)) # 3
print(add(1, 3)) # 4
在上述的add函数中,参数b有一个默认值2,这意味着在调用函数时如果没有传递b的值,则会使用默认值。
2.4 可变参数
可变参数是指在函数调用时可以传递可变数量的参数。
Python提供两种形式的可变参数:
可变位置参数:在参数列表前添加星号(*)。
可变关键字参数:在参数列表前添加两个星号(**)。
可变位置参数将函数调用中的所有剩余位置参数作为元组传递给函数。
def add(*numbers):
result = 0
for number in numbers:
result += number
return result
print(add(1, 2, 3)) # 6
在上述的add函数中,添加了一个可变位置参数numbers,它包含了所有传递给函数的位置参数。在函数内部,使用for循环遍历numbers,将每个数字相加,最后返回结果。
可变关键字参数将函数调用中的所有剩余关键字参数作为字典传递给函数。
def print_user(**user):
print(user)
print_user(name='John', age=20) # {'name': 'John', 'age': 20}
在上述的print_user函数中,添加了一个可变关键字参数user,它包含了所有传递给函数的关键字参数。在函数内部,将user打印出来。
3. 函数参数的传递顺序
Python中的函数参数传递顺序应该是:
位置参数
默认参数
可变位置参数
可变关键字参数
这意味着,在调用函数时,应该先传递位置参数,然后是默认参数,然后是可变位置参数,最后是可变关键字参数。
def function(a, b, c=0, *args, **kwargs):
pass
在上述的函数定义中,a和b是位置参数,c是一个有默认值的参数,args是一个可变位置参数,kwargs是一个可变关键字参数。
4. 传递不可变对象时的问题
Python中的函数传递不可变对象时,实际上是传递对象的副本,而不是对象本身。这意味着在函数中修改不可变对象的值时,实际上是在修改对象的副本,而不是原始对象。
def foo(num):
num += 1
x = 1
foo(x)
print(x) # 1
在这个例子中,函数foo期望传入一个不可变对象num。当我们传入一个整数1,Python会将1的值赋给一个新的变量num。当我们在函数中修改num时,实际上是在修改这个新变量的值,而不是原始变量x的值。
5. 总结
函数是Python中最基本的可重用代码块之一。参数是函数的重要组成部分,它们允许我们向函数传递数据以及控制函数的行为。Python提供了多种类型的参数,包括位置参数、关键字参数、默认参数和可变参数。了解这些参数类型以及它们的用途对于成为一个Python程序员是非常重要的。