1、默认参数
默认参数是指函数在其定义中为某些参数设定了一个默认值,这样的参数被称为默认参数。默认参数是一种非常有用的功能,当调用函数时不传递该参数时,函数将使用默认值,并且不会像必须参数那样报错。
动手练一练:
def student(name, age=15):
print("学生姓名:", name)
print("学生年龄:", age)
student("张三")
执行以上代码,输出结果为:
学生姓名: 张三
学生年龄: 15
上面的例子中,“age”参数被赋予了默认值15,所以在调用函数时可以不传递“age”参数。注意在定义函数时,必须先定义非默认参数,然后才能定义默认参数,否则Python解释器会报错,例如:
动手练一练:
def student(age=15, name):
print("学生姓名:", name)
print("学生年龄:", age)
student("张三")
执行以上代码,输出结果为:
SyntaxError: non-default argument follows default argument
上面的例子中,Python解释器输出错误信息“语法错误:非默认参数不能跟在默认参数后面”。
动手练一练:
def student(name, age=15, address="北京"):
print("学生姓名:", name)
print("学生年龄:", age)
print("学生地址:", address)
print("-------全部传递3个参数-------")
student("张三", 12, "上海")
print("-------不传递第3个参数-------")
student("李四", 13)
print("-------不传递第2个参数-------")
student("王五", address="广东")
print("-------只传递第1个非默认参数-------")
student("赵六")
执行以上代码,输出结果为:
-------全部传递3个参数-------
学生姓名: 张三
学生年龄: 12
学生地址: 上海
-------不传递第3个参数-------
学生姓名: 李四
学生年龄: 13
学生地址: 北京
-------不传递第2个参数-------
学生姓名: 王五
学生年龄: 15
学生地址: 广东
-------只传递第1个非默认参数-------
学生姓名: 赵六
学生年龄: 15
学生地址: 北京
上面的例子中,默认参数可以让函数的调用更加简单,它可以帮助我们少写不少代码,不需要传递每个参数。我们在编写程序时,如果有许多地方调用函数、但是部分参数的值又是相同情况的时候,设置默认参数就更加简便了。
2、可变参数
在Python函数中,可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。当我们定义函数时,有时候无法确定函数调用时会传入多少个参数。为了应对这种情况,Python提供了可变参数的机制,允许我们在函数定义中接受可变数量的参数。基本语法如下:
some(*args,**kwargs)
“some”为任意函数名,“*args”和“**kwargs”为可变参数。使用“*args”可以接受任意数量的参数,例如:
动手练一练:
def student(*args):
print(args)
student()
student(5, 6)
student("张三", 12, "上海")
执行以上代码,输出结果为:
()
(5, 6)
('张三', 12, '上海')
上面的例子中,“*args”参数获取得到的是一个元组类型,若“args”前不加“*”号,那么student()只能接收一个参数,参数给多给少都会报错,而加上“*”就能成功运行。这是因为“*”把函数student()接收到的多个参数都打包成了元组类型,并赋值给了变量“args”,这也正是它能作为可变参数的原因。与“*args”不同,使用“**kwargs”可以接受任意数量的关键字参数,例如:
动手练一练:
def student(**kwargs):
print(kwargs)
student()
student(name="张三", age=12)
执行以上代码,输出结果为:
{}
{'name': '张三', 'age': 12}
上面的例子中,“**kwargs”参数输出的时候是一个字典类型,所以我们在调用函数时也必须要使用关键字参数的方法来传递参数。
在程序开发中,经常见到函数中有*args和**kwargs写法,它们都起到了可变参数的作用,用于解决一些未知的情况,例如:
动手练一练:
def student(*args, **kwargs):
a = 0
for i in args:
a += i
print("数字总和是", a)
for k,v in kwargs.items(): # items()可以遍历字典中所有的key和value,并分别传递给k和v。
print(k,v)
student(2,3,4, name="张三", age=15)
执行以上代码,输出结果为:
数字总和是 9
name 张三
age 15
上面的例子中,通过使用可变参数,我们可以编写更加灵活的函数,适应不同数量和类型的参数传入,这种机制在需要处理不确定数量参数的函数时非常有用。
Python的函数不只在定义时可以使用“*”与“**”来声明不确定数量的参数,在函数调用时我们同样可以使用“*”与“**”来传递未知的参数,例如:
动手练一练:
def student(*args, **kwargs):
print(args)
print(kwargs)
age = [12, 13, 14]
address = {
"代号1": "北京",
"代号2": "上海"
}
student(*age, **address)
执行以上代码,输出结果为:
(12, 13, 14)
{'代号1': '北京', '代号2': '上海'}
上面的例子中可以看到,不论在函数定义时,还是在函数调用时,函数的参数都能以some(*args,**kwargs)的语法形式调用。