python 两个星号 python双星号什么运算_迭代

在Python中,碰到表达式前面加上*或者加上**, 就是所谓的星号表达式(starred expression)。其含义对初学者来说有点困扰,其实很容易理解和记忆。

  • 单星号*,用于展开可迭代的数据,
  • 双星号**,用于展开字典。

先从单个星号讲起

1、单个星号的含义

单个的星号*操作,表示展开一个可迭代的数据。哪些数据是可迭代的呢?常见的如列表,元组, 字符串等。看一下如下的例子:

python 两个星号 python双星号什么运算_迭代_02

上面的例子中,可迭代数据中的元素可以是字符串‘123’或者列表,其中元素都只有三个。左边用来展开可迭代数据的变量个数也有三个。一个匹配一个即可。但是左边用来匹配的只有两个,可以怎么做呢?

python 两个星号 python双星号什么运算_函数定义_03

通过借助*星号,可以成功的将后续匹配出来,形成列表。

另外来一个复杂一点的:

python 两个星号 python双星号什么运算_python 两个星号_04

从这些例子可以看出来,利用星号表达式,可以匹配任意长度的可迭代数据。

2、单个星号用在函数输入参数时作用

调用函数时候,作为函数的参数来输入,可以将所有输入参数组合在一起,再一起放到函数中。比如下面的add函数有两个输入参数,可以通过用inputs=[1,2]将两个值放在一起,并且*展开inputs作为输入,来调用add,实现函数调用。

python 两个星号 python双星号什么运算_python 两个星号_05

注意这里需要使用inputs需要加*好,如果不加则出现如下错误:

python 两个星号 python双星号什么运算_python 两个星号_06

错误提示是输入的参数个数不对,只有一个用来匹配了x,缺少一个用来匹配y的。但是利用*来将[1,2]列表展开后,就有了两个元素,可以作为add函数的两个输入参数,符合函数的参数个数要求,就不会有错误了。

3、单个星号在函数定义时的参数定义中的作用

在函数定义时候使用*args(args也可以是别的名字)作为输入参数,表示可以用来匹配任意个数(或者可变长度参数)的输入输入参数。

python 两个星号 python双星号什么运算_迭代_07

可以看到,args匹配到了所有的输入参数值,按输入值的顺序,组成了一个列表。因此*args,可以完成函数的位置参数(positional argument)的匹配。

4、双星号**的含义

**用来展开字典。可以用来做什么呢,举个例子:现在需要进行两个字典数据的合并成一个新字典,包含两个字典中的key和vaule对,可以通过**来完成。dict1={'x':1} , dict2={'y':2}, 如果直接用dict3={dict1, dict2},会报错。可以用 dict3={**dict1, **dict2}来组合。运行结果如下:

python 两个星号 python双星号什么运算_python_08

5、双星号**用在函数输入参数时作用

同样在函数调用时,使用**来实现关键字参数的输入例子。

python 两个星号 python双星号什么运算_python 两个星号_09

在ex2函数调用时候,使用**将kwargs展开,变成了需要的关键字参数,ex2(**kwarg)相当于调用ex2(x=1,y=2)。

6、双星号在函数定义时的参数定义中的作用

如果在函数定义时,做为输入,可以用来匹配关键字参数,并且在调用时候,将关键字参数的关键字和输入值,组成字典。

python 两个星号 python双星号什么运算_函数定义_10

可以看到,kwargs将输入的关键字参数均组成了到了一个字典里面。

7、思考题

1)请问如下的程序片段输出是什么?

python 两个星号 python双星号什么运算_python 两个星号_11

2) 如下的程序片段输出是什么?

python 两个星号 python双星号什么运算_数据_12

如果输入ex4(1,2,3,x=1, y=2, 4),会有什么结果呢?

8、附录

附加一些知识点:函数的两种参数类型:

Python的函数的输入参数有两种类型,一种是位置参数(positional argument),一种是关键字参数(keyword argument)。

所谓positional argument位置参数,是指用相对位置指代参数。关键字参数(keyword argument),见名知意使用关键字指代参数。位置参数或者按顺序传递参数,或者使用名字,自然使用名字时,对顺序没有要求。