欢迎访问宙启技术站
智能推送

Python函数的参数和参数传递方式有哪些

发布时间:2023-10-02 00:05:32

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的原因。