python 函数传参机制与使用方法

  • Post category:Python

Python中函数的传参机制分为位置参数和关键字参数两种。

位置参数

位置参数是指按照函数定义时的顺序给函数传递参数,也称为位置传参。调用函数时,传入的参数数量必须和函数定义时的参数数量一致,否则会提示TypeError错误。

下面是一个计算两个数乘积的函数例子:

def product(x, y):
    return x * y

调用这个函数时需要传入两个参数,比如:

result = product(3, 4)

这个例子中,传入的参数3和4都是位置参数,分别对应函数定义中的第1个参数x和第2个参数y。函数执行后,返回结果12,赋值给变量result。

关键字参数

关键字参数是指按照参数名来传递参数,可以不按照函数定义时的顺序,也可以只传递部分参数。调用函数时,在参数名前加上“参数名=参数值”的形式即可。关键字参数和位置参数混合使用时,位置参数必须在前面传递。

下面是一个计算两个数乘积的函数,但是允许其中一个参数缺省的例子:

def product(x, y=1):
    return x * y

这个函数中,y的默认值为1。如果只传递一个参数,则y默认为1,返回值为这个参数值;如果传递两个参数,则按照传入的参数计算乘积。

调用这个函数时,可以按照位置传参,也可以按照关键字传参,比如:

result1 = product(3)           # 传递一个参数
result2 = product(x=3)         # 按照关键字传递一个参数
result3 = product(y=4, x=3)    # 按照关键字传递两个参数,y在前,x在后
result4 = product(3, y=4)      # 混合传参,位置参数在前,关键字参数在后

在这些调用过程中,变量result1将被赋值为3,返回值为xy;变量result2同样被赋值为3;变量result3将被赋值为12,返回值为xy;而变量result4同样也是12。

args和*kwargs参数

除了上述的位置参数和关键字参数之外,Python还提供了两种特殊的参数:args和*kwargs。

*args参数用来传递一个不定数量的位置参数,它会将参数打包成一个tuple传入函数,并在函数内部进行解包。可以在函数内部通过循环遍历tuple的元素来获取参数值。

下面是一个使用*args参数的例子:

def add(*args):
    result = 0
    for n in args:
        result += n
    return result

这个函数可以接受任意数量的参数,并将它们相加起来。比如:

result1 = add(1, 2)              # 传递两个参数,返回值为3
result2 = add(1, 2, 3)           # 传递三个参数,返回值为6
result3 = add(1, 2, 3, 4, 5)     # 传递五个参数,返回值为15

**kwargs参数用来传递一个不定数量的关键字参数,它会将参数打包成一个dict传入函数,并在函数内部进行解包。可以在函数内部通过字典的键来获取参数值。

下面是一个使用**kwargs参数的例子:

def print_info(**kwargs):
    for key, value in kwargs.items():
        print("{}: {}".format(key, value))

这个函数可以接受任意数量的关键字参数,并将它们打印出来。比如:

print_info(name="Tom", age=18)   # 传递两个关键字参数,输出"name: Tom"和"age: 18"
print_info(name="Jerry")         # 传递一个关键字参数,输出"name: Jerry"

参数传递的使用方法

在Python中,函数的参数可以在函数体内部使用,也可以在调用函数时从外部传递。使用函数时,需要根据实际情况选择恰当的参数传递方式。

如果函数的参数数量固定且参数含义清晰,可以使用位置传参的方式调用函数;如果函数的参数数量较多或含义不明显,可以使用关键字传参明确指定参数含义。

如果函数需要处理任意数量的同类型数据,可以使用args传参方式;如果函数需要处理任意数量、任意类型的数据,可以使用*kwargs传参方式。

需要注意的是,在函数定义时,参数的默认值应该使用不可变对象,以免在多次调用中出现副作用。

下面是一个综合应用以上知识点的函数例子:

def print_student_info(name, age, gender="Unknown", *courses, **scores):
    print("Student Information:")
    print("    name: {}".format(name))
    print("    age: {}".format(age))
    print("    gender: {}".format(gender))
    print("    courses:")
    for course in courses:
        print("        - {}".format(course))
    print("    scores:")
    for subject, score in scores.items():
        print("        - {}: {}".format(subject, score))

这个函数可以用来打印学生的信息、所选课程和考试成绩等。其中,gender参数是关键字参数,有默认值“Unknown”;courses参数是args参数,用来传递课程名,可以传递任意个数的参数;scores参数是*kwargs参数,用来传递学科名称和成绩,可以传递任意数量的关键字参数。函数调用方式如下:

print_student_info("Tom", 18,
                    "Male",
                    "Math", "English", "Chinese",
                    Math=90, English=85, Chinese=95)

输出结果为:

Student Information:
    name: Tom
    age: 18
    gender: Male
    courses:
        - Math
        - English
        - Chinese
    scores:
        - Math: 90
        - English: 85
        - Chinese: 95