python中*的特殊用法 您所在的位置:网站首页 delta函数在python中的作用 python中*的特殊用法

python中*的特殊用法

2023-05-03 20:16| 来源: 网络整理| 查看: 265

除了表示乘法、乘方的作用外,*,星符号还有以下用法。

1.函数形参汇聚——打包 args 和*kwargs 常作变量出现于函数定义中,用于将不定量实参传递给函数。其中: *args 的本质是将位置形参汇集为 tuple 然后由变量 args 接收:

>>> def test1(x, *args): # 将除首个元素 x 外的位置参数 args 汇聚为一个 tuple print(x, args) >>> test1('a', 'b', 'c', 'd') 'a' ('b', 'c', 'd') >>> test1(1, 2, 3, 4) 1 (2, 3, 4)

**kwargs 的本质则是将关键字形参汇集为 dict 然后由变量 kwargs 接收:

>>> def test2(**kwargs): # 将所有关键字参数汇聚为 dict for key, value in kwargs.items(): print("{0} = {1}".format(key, value)) >>> test2(a=1, b=2, c=3, d=4) a = 1 b = 2 c = 3 d = 4

注意,单星操作符无法汇集关键字参数,双星操作符*才可以。

若想在函数定义使用位置形参(单星操作符)加关键字形参(双星操作符*)则须按照如下顺序:

>>> def test3(z, *args, **kwargs): print(z, args, kwargs) >>> test3(0, 1, 2, 3, 4, a=1, b=2, c=3, d=4) 0 (1, 2, 3, 4) {'a': 1, 'b': 2, 'c': 3, 'd': 4}

此外,写成args和kwargs其实并非必须的,仅为通俗的命名约定,只有变量前的单星号或双星号才是必须的。若有意,还可写成var和*vars等等。

2.函数实参分散 —— 解包 若函数形参是定长参数,则可使用分散操作符(scatteroperator)或初始化函数,类似解引用tuple和dict。 例如,使用分散操作符对tuple实参解包:

>>> def test4(var1, var2, var3, var4): print(var1, var2, var3, var4) >>> variables = (1, 2, 3, 4) # 注意, 可迭代对象即可, 不限于 tuple >>> test4(variables) # 不解包要报错 Traceback (most recent call last): File "", line 1, in test4(variables) TypeError: test4() missing 3 required positional arguments: 'var2', 'var3', and 'var4' >>> test4(*variables) # 作用在实参、解包输入即可 1 2 3 4

再有,使用分散操作符**对dict实参解包:

>>> def test4(var1, var2, var3, var4): print(var1, var2, var3, var4) >>> variables2 = {'var1':5, 'var2':6, 'var3':7, 'var4':8} # 注意 key 对应关键字形参 >>> test4(variables2) # 不解包要报错 Traceback (most recent call last): File "", line 1, in test4(variables2) TypeError: test4() missing 3 required positional arguments: 'var2', 'var3', and 'var4' >>> test4(**variables2) # 作用在实参、解包输入即可 5 6 7 8

3.解压可迭代对象赋值给多个变量 使用星号操作符构成星号表达式能够实现对可迭代对象(iterable)解压,从而将不确定个数或任意个数元素的可迭代对象赋值给任意数量的变量。其中,使用的变量将接受多余参数,并总保存在list中。

注意,常见的可迭代对象包含:序列sequence(list、string、tuple)、set、dict、迭代器iterator、生成器generator、文件对象等,而不局限于第2节中的类型。有些博客、教程声称“使用*可以对序列解压”是不尽然的,不确切的。

>>> x, *y = [1, 2, 3, 4, 5, 6] # unpack list >>> x 1 >>> y [2, 3, 4, 5, 6] >>> x, *y = 'abcdefg' # unpack string >>> x 'a' >>> y ['b', 'c', 'd', 'e', 'f', 'g'] >>> x, *y = (1, 2, 3, 4, 5, 6) # unpack tuple >>> x 1 >>> y [2, 3, 4, 5, 6] >>> x, *y = {'a':1, 'b':2, 'c':3} # unpack dict >>> x 'a' >>> y ['b', 'c'] >>> x, *y = {1, 2, 3, 4, 5, 6} # unpack set >>> x 1 >>> y [2, 3, 4, 5, 6] >>> generator = (i for i in range(1,7)) >>> generator >>> x, *y = generator # unpack for generator >>> x 1 >>> y [2, 3, 4, 5, 6]

补充: 在Python中,迭代器(iterator)是遵循迭代协议的对象。使用iter()从任何序列对象中得到迭代器(如list, tuple, dict, set等)。另一种形式的输入迭代器是生成器(generator)。很多容器如list、string可用for循环遍历对象。for语句会调用容器对象中的iter()函数,该函数返回一个定义了next()方法的迭代器对象,该方法将逐一访问容器中的元素。故在Python中,任意对象只要定义了next方法,就是一个迭代器。因此,Python容器如list、string、tuple、set、dict实际上都可以被称作迭代器。

4.单星号*对于解压、分割string很有用:

>>> line = 'nobody:*:-4:-4:Unprivileged User:/var/empty:/usr/bin/true' >>> uname, *fields, homedir, sh = line.split(':') # string 分割 + 解包 >>> uname 'nobody' >>> homedir '/var/empty' >>> sh '/usr/bin/true' >>> record = ('Child', 66, 12.34, (1, 6, 2020)) >>> name, *_, (*_, year) = record # 使用占位符如 _ 来接收无用的部分 >>> name 'Child' >>> year 2020


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有