Python函数的参数和参数传递方式有哪些
Python函数的参数有以下几种类型:
1. 位置参数(Positional Arguments):这是函数定义时最普通的参数形式,根据参数的位置来进行参数传递。调用函数时需要按照函数定义时的参数顺序传递实际参数。
2. 关键字参数(Keyword Arguments):通过指定参数名来传递参数值,不需要按照参数顺序来传递参数。这种方式更易于识别和阅读,可以方便地跳过或者改变一些默认值。例如:
def greet(name, message):
print(f"Hello {name}, {message}")
greet(name="Alice", message="How are you?")
在这个例子中,参数的顺序并不重要,因为我们通过参数名来指定了对应的参数值。
3. 默认参数(Default Arguments):在函数定义时,可以给某些参数指定一个默认值。如果调用函数时不传递对应的实际参数,那么将使用这个默认值。例如:
def greet(name, message="How are you?"):
print(f"Hello {name}, {message}")
greet(name="Alice") # 输出:Hello Alice, How are you?
在这个例子中,参数message没有传递实际参数,因此会使用默认值"How are you?"。
4. 可变参数(Variable Arguments):当我们不确定需要传递多少个参数时,可以使用可变参数。Python提供了两种可变参数的方式:
- *args:表示接收任意个参数,这些参数会被包装成一个元组(tuple)传递给函数。例如:
def greet(*names):
for name in names:
print(f"Hello {name}")
greet("Alice", "Bob", "Charlie") # 输出:Hello Alice, Hello Bob, Hello Charlie
在这个例子中,我们可以传递任意多个参数,它们会被包装成names元组传递给函数。
- **kwargs:表示接收任意个关键字参数,这些参数会被包装成一个字典(dictionary)传递给函数。例如:
def greet(**info):
for key, value in info.items():
print(f"{key}: {value}")
greet(name="Alice", age=25, city="New York")
# 输出:
# name: Alice
# age: 25
# city: New York
在这个例子中,我们可以传递任意多个关键字参数,它们会被包装成info字典传递给函数。
5. 包裹参数(Packed Arguments):在函数定义时,我们可以使用*args和**kwargs,来分别接收可变参数和关键字参数。这样,我们在调用函数时可以直接传递一个元组或者字典,而不需要分别传递每个参数。例如:
def greet(*names, **info):
for name in names:
print(f"Hello {name}")
for key, value in info.items():
print(f"{key}: {value}")
greet("Alice", "Bob", "Charlie", name="David", age=30, city="New York")
# 输出:
# Hello Alice
# Hello Bob
# Hello Charlie
# name: David
# age: 30
# city: New York
在这个例子中,我们既可以传递任意多个位置参数,也可以传递任意多个关键字参数。
Python函数的参数传递方式有两种:
1. 值传递(Pass by Value):在函数调用时,会将实际参数的值复制一份传递给函数内部的形式参数,函数内部的操作不会影响到外部的实际参数。
def change_value(num):
num = 10
value = 5
print(value) # 输出:5
change_value(value)
print(value) # 输出:5
在这个例子中,函数change_value的形式参数num被赋值为10,但是并不影响外部的实际参数value。
2. 引用传递(Pass by Reference):在函数调用时,会将实际参数的引用传递给函数内部的形式参数,函数内部的操作会直接影响到外部的实际参数。
def change_list(lst):
lst.append(4)
my_list = [1, 2, 3]
print(my_list) # 输出:[1, 2, 3]
change_list(my_list)
print(my_list) # 输出:[1, 2, 3, 4]
在这个例子中,函数change_list通过调用append方法,直接修改了外部的实际参数my_list。
需要注意的是,在Python中,不论参数是可变对象还是不可变对象,都是引用传递。对于不可变对象(如整数、字符串等),因为不能直接修改其值,所以体现不出引用传递的特性。但是对于可变对象(如列表、字典等),会直接修改其值。这也是为什么上面的例子中,函数change_list可以直接修改外部的实际参数my_list的原因。
