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