一、作为乘法或者是乘幂运算符

在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)

注意:缺省参数的定义位置:

  • 必须保证带有默认值的缺省参数在参数列表末尾!

调用带有多个缺省参数的函数:

  • 在调用函数时,如果有多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系!
def print_info(name, title="", gender=True):
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库中普遍见到,说明这是一种重要的典型的应用方案!