一、作为乘法或者是乘幂运算符
在Python中,*表示乘法,**表示次方,这个不必多说。
函数作为Python的一等公民,其参数的类型也非常丰富。下面结合参数类型,我们来看一下*的灵活作用。
另外,也有如下专门的特殊字符串连接用法:
print(3*"Hello ")结果是输出依次由*符号3个后面字符串组成的长字符串。
二、函数参数——位置实参
按照参数位置,依次传递参数,这是最普通的方式(大多数语言中都支持)。
def location(a, b)print(a + b)
location(3, 9)
小结:调用函数时,按顺序传递参数,3 传给 a,9 传给 b。调用时,不能缺少实参。
三、函数参数——关键字实参
如果不想严格按照顺序传递参数,也可以按关键字名称传递。举例如下:
def location(a, b)print(a + b)
location(b = 3, a = 9)
注意:调用上面函数时,按关键字名称传递参数,3 传给 b,9 传给 a。也不能缺少调用实参。
四、函数参数——缺省参数
定义函数时,可以给某个参数赋值一个默认值,具有默认值的参数就叫做缺省参数。
- 调用函数时,如果没有传入缺省参数 的值,则在函数内部使用参数默认值。
- 将常见的值设置为参数的缺省值,从而简化函数的调用。
- 要使用最常见的值作为默认值。
- 如果一个参数的值不能确定,则不应该设置默认值,具体的数值在调用函数时,由外界传递!
例如:对列表排序的方法
gl_num_list = [6, 3, 9]默认就是升序排序,因为这种应用需求更多。
gl_num_list.sort()print(gl_num_list)
只有当需要降序排序时,才需要传递 'reverse' 参数。
gl_num_list.sort(reverse=True)print(gl_num_list)
注意:缺省参数的定义位置:
- 必须保证带有默认值的缺省参数在参数列表末尾!
调用带有多个缺省参数的函数:
- 在调用函数时,如果有多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系!
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s%s 是 %s" % (title, name, gender_text))
# 提示:在指定缺省参数的默认值时,应该使用最常见的值作为默认值!
print_info("小明")
print_info("老王", title="班长")
print_info("小美", gender=False)
再看下面的例子:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)这是Python内置函数print函数的声明格式。可以看到,其中使用了很多缺省参数。而且注意到:这些缺省参数必须置于关键字参数之后。
五、多值参数
当函数需要处理的参数个数不确定时,可使用多值参数。python中有两种多值参数:
- 接收元组:参数名前加一个*
- 接收字典:参数名前加两个*
从众多一流开源库源码分析来看,一般在给多值参数命名时,习惯使用以下两个名字:
- *args — 存放元组参数
- **kwargs — 存放字典参数(kw即keyword,kwargs即键值对参数)
def demo(num, *args, **kwargs):
print(num)
print(args)
print(kwargs)
demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
输出:1
1
(2, 3, 4, 5)
{'name': '小明', 'age': 18, 'gender': True}
拆包:在上面多值参数传递时,实际上使用了拆包功能。拆包主要用于元组和字典参数的传递。在调用带有多值参数的函数时,Python使用拆包简化参数的传递:
- 直接将一个元组变量实参传递给元组形参args
- 在元组变量前,加*
- 直接将一个字典变量实参传递给字典形参kwargs
- 在字典变量前,加**
def demo(*args, **kwargs):
print(args)
print(kwargs)
gl_nums = (1, 2, 3)
gl_xiaoming = {"name": "小明", "age": 18}
注意:变量名前必须要加*号,否则不能无法正常拆包!
六、更复杂的应用情形
例1:函数参数中独立的斜杠
例1:在很多Python内置类中经常见到如下内容:
__init__(self, /, *args, **kwargs)说明:如果你想要函数的调用者:
在某个参数位置只能使用位置参数而不能使用关键字参数传参,那么你只需要在所需位置后面放置一个/
举例:
def f1(a, b, /):return a + b
对于上面这个函数而言,调用f1时参数a,b只能是特定的值,而不能以关键字传参,即f1(2, 3)执行正确而f1(a=2, 3)和f1(2, b=3)将执行错误。其实,上面第一个例子就是极为典型的应用场景,即不能使用__init__(self=......)这种表达方式。
例2:便于阅读
def plot(*args, scalex=True, scaley=True, data=None, **kwargs)本例中,为了便于阅读,最好在元组参数与字典参数中间间隔以可能的其他参数,这个示例中使用缺省参数作为间隔,具有较强阅读性。在许多第三方Python库中普遍见到,说明这是一种重要的典型的应用方案!
例3:函数参数中独立的*号
请看下面的示例:
def barh(y, width, height=0.8, left=None, *, align='center', **kwargs)python函数参数中间有一个(*)分隔,这指明:
星号后面为命名关键字参数,星号自己不是参数。命名关键字参数,在函数调用时必须带参数名字进行调用!
在许多第三方Python库中普遍见到,说明这是一种重要的典型的函数参数使用方案!
例4:函数定义中的三个点(...)
python函数参数中的三个点(...)用于作为默认参数。
def f(a:int=...):print(a)
调用及显示:
In [4]: f()Ellipsis
In [5]: f("Hello")
Hello
In [6]: f(99999)
99999
In [7]: f([1,2,3,4,5])
[1, 2, 3, 4, 5]
In [8]: f(...)
Ellipsis
In [9]: f(Ellipsis)
Ellipsis
大家可以结合缺省参数一起学习这里...的用法。在许多第三方Python库中普遍见到,说明这是一种重要的典型的应用方案!