这篇主要探讨 ** 和 * 前缀运算符,**在变量之前使用的*and **运算符.

简单示例:

>>> numbers = [2, 1, 3, 4, 7]
>>> more_numbers = [*numbers, 11, 18]
>>> print(*more_numbers, sep=', ')
2, 1, 3, 4, 7, 11, 18

用途:

  1. 使用 * 和 ** 将参数传递给函数
  2. 使用**和**捕获传递给函数的参数
  3. 使用*只接受关键字参数
  4. 使用*元组拆包过程中捕获项目
  5. 使用*解包iterables到一个列表/元组
  6. 使用**要解压缩词典到其他字典

例子解释:

  1. 调用函数时,*可以使用运算符将​​可迭代对象解压缩为函数调用中的参数:

    >>> fruits = ['lemon', 'pear', 'watermelon', 'tomato']
    >>> print(fruits[0], fruits[1], fruits[2], fruits[3])
    lemon pear watermelon tomato
    >>> print(*fruits)
    lemon pear watermelon tomato
    

    该print(*fruits)行将fruits列表中的所有项目print作为单独的参数传递到函数调用中,而我们甚至不需要知道列表中有多少个参数。

  2. ** 运算符允许我们采取键值对的字典,并把它解压到函数调用中的关键字参数。

    >>> date_info = {'year': "2020", 'month': "01", 'day': "01"}
    >>> filename = "{year}-{month}-{day}.txt".format(**date_info)
    >>> filename
    '2020-01-01.txt'
    

    ** 将关键字参数解包到函数调用中并不是很常见。我最常看到的地方是练习继承时:super()通常要同时包含*和**。
    双方*并 **可以在函数调用中多次使用,像Python 3.5的。

    >> fruits = ['lemon', 'pear', 'watermelon', 'tomato']
    >>> numbers = [2, 1, 3, 4, 7]
    >>> print(*numbers, *fruits)
    2 1 3 4 7 lemon pear watermelon tomato
    **多次使用类似:>>> date_info = {'year': "2020", 'month': "01", 'day': "01"}
    >>> track_info = {'artist': "Beethoven", 'title': 'Symphony No 5'}
    >>> filename = "{year}-{month}-{day}-{artist}-{title}.txt".format(
    ...     **date_info,
    ...     **track_info,
    ... )
    >>> filename
    '2020-01-01-Beethoven-Symphony No 5.txt'
    
  3. 定义函数时,*可以使用运算符捕获为函数提供的无限数量的位置参数。这些参数被捕获到一个元组中。

    from random import randintdef roll(*dice):return sum(randint(1, die) for die in dice
    
  4. 我们可以用**定义一个函数时,捕捉给予功能到字典中的任何关键字参数:

    def tag(tag_name, **attributes):attribute_list = [f'{name}="{value}"'for name, value in attributes.items()]return f"<{tag_name} {' '.join(attribute_list)}>"
    
  5. 带有仅关键字参数的位置参数,要接受仅关键字的参数,可以*在定义函数时在使用后放置命名参数

    def get_multiple(*keys, dictionary, default=None):return [dictionary.get(key, default)for key in keys]
    上面的函数可以这样使用:>>> fruits = {'lemon': 'yellow', 'orange': 'orange', 'tomato': 'red'}
    >>> get_multiple('lemon', 'tomato', 'squash', dictionary=fruits, default='unknown')
    ['yellow', 'red', 'unknown']
    

    参数dictionaryand default在其后*keys,这意味着只能将它们指定为关键字参数。如果我们尝试在位置上指定它们,则会收到错误消息:

    
    >>> fruits = {'lemon': 'yellow', 'orange': 'orange', 'tomato': 'red'}
    >>> get_multiple('lemon', 'tomato', 'squash', fruits, 'unknown')
    Traceback (most recent call last):File "<stdin>", line 1, in <module>
    TypeError: get_multiple() missing 1 required keyword-only argument: 'dictionary'
  6. 不带位置参数的仅关键字参数
    仅关键字参数的功能很酷,但是如果您需要仅关键字参数而不捕获无限的位置参数怎么办?

    def with_previous(iterable, *, fillvalue=None):"""Yield each iterable item along with the item before it."""previous = fillvaluefor item in iterable:yield previous, itemprevious = item```
    

该函数接受一个iterable参数,该参数可以在位置上指定(作为第一个参数),也可以通过其名称和作为fillvalue仅关键字参数的参数来指定。这意味着我们可以这样调用with_previous:

>>> list(with_previous([2, 1, 3], fillvalue=0))
[(0, 2), (2, 1), (1, 3)]
但不是这样的:
>>> list(with_previous([2, 1, 3], 0))
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: with_previous() takes 1 positional argument but 2 were given
此函数接受两个参数,并且其中一个fillvalue 必须指定为关键字arguments。
  1. 元组拆包中的星号
    Python 3还添加了一种新的使用运算符的方式,该方式仅与上面的-when-defining-a-function和*-when-when-calling-afunction功能有关。

    >>> fruits = ['lemon', 'pear', 'watermelon', 'tomato']
    >>> first, second, *remaining = fruits
    >>> remaining
    ['watermelon', 'tomato']
    >>> first, *remaining = fruits
    >>> remaining
    ['pear', 'watermelon', 'tomato']
    >>> first, *middle, last = fruits
    >>> middle
    ['pear', 'watermelon']
    
  2. 列表文字中的星号
    Python 3.5 通过PEP 448引入了大量的新功能。最大的新功能之一是能够将可迭代对象转储到新列表中。

    假设您有一个函数,该函数可以接收任何序列,并返回一个列表,其中该序列与该序列的反序连接在一起:

    def palindromify(sequence):return list(sequence) + list(reversed(sequence))
    

    该函数需要将事物转换为列表几次,以连接列表并返回结果。在Python 3.5中,我们可以改为输入:

    def palindromify(sequence):return [*sequence, *reversed(sequence)]此代码删除了一些不必要的列表调用,因此我们的代码更加高效和可读。

    这是另一个例子:

    def rotate_first_item(sequence):return [*sequence[1:], sequence[0]]
    

    该函数返回一个新列表,其中给定列表(或其他序列)中的第一项移动到新列表的末尾。

    * 运算符的这种使用是将不同类型的可迭代对象连接在一起的好方法。的*操作者适用于任何可迭代,而使用+操作者仅适用于具有所有相同类型的特定序列。

    这不仅限于创建列表。我们还可以将可迭代项转储到新的元组或集合中:

    >>> fruits = ['lemon', 'pear', 'watermelon', 'tomato']
    >>> (*fruits[1:], fruits[0])
    ('pear', 'watermelon', 'tomato', 'lemon')
    >>> uppercase_fruits = (f.upper() for f in fruits)
    >>> {*fruits, *uppercase_fruits}
    {'lemon', 'watermelon', 'TOMATO', 'LEMON', 'PEAR', 'WATERMELON', 'tomato', 'pear'}
    

    请注意,上面的最后一行获取一个列表和一个生成器,并将它们转储到新集中。在使用之前*,以前没有一种简单的方法可以在一行代码中做到这一点。以前有一种方法可以做到,但要记住或发现它并不容易:

    >>> set().union(fruits, uppercase_fruits)
    {'lemon', 'watermelon', 'TOMATO', 'LEMON', 'PEAR', 'WATERMELON', 'tomato', 'pear'}
    
  3. 字典文字中的双星号
    PEP 448还**允许该运算符用于将键/值对从一个字典转储到新字典中,从而扩展了功能:

    >>> date_info = {'year': "2020", 'month': "01", 'day': "01"}
    >>> track_info = {'artist': "Beethoven", 'title': 'Symphony No 5'}
    >>> all_info = {**date_info, **track_info}
    >>> all_info
    {'year': '2020', 'month': '01', 'day': '01', 'artist': 'Beethoven', 'title': 'Symphony No 5'}
    

    例如,我们可以在添加新值的同时复制字典:

    >>> date_info = {'year': '2020', 'month': '01', 'day': '7'}
    >>> event_info = {**date_info, 'group': "Python Meetup"}
    >>> event_info
    {'year': '2020', 'month': '01', 'day': '7', 'group': 'Python Meetup'}
    

    或在覆盖特定值的同时复制/合并字典:

    >>> event_info = {'year': '2020', 'month': '01', 'day': '7', 'group': 'Python Meetup'}
    >>> new_info = {**event_info, 'day': "14"}
    >>> new_info
    {'year': '2020', 'month': '01', 'day': '14', 'group': 'Python Meetup'}
    

ref: https://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them/

python中 *和 **的用法相关推荐

  1. 五分钟理解yield在python中的简单用法,让你不再迷惑

    很多同学无论是在学习python还是使用python的过程中,都会遇到yield关键字,这个让人头大的问题,今天,就给大家分享一下我自学yield的心路历程 基本概念: (1)在 Python 中,使 ...

  2. format函数python的顺序_[转载] Python中format函数用法

    Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...

  3. python代码大全表解释-python中的字典用法大全的代码

    如下代码是关于python中的字典用法大全的代码. #!/usr/bin/env python # # [SNIPPET_NAME: Dictionaries 101] # [SNIPPET_CATE ...

  4. python教程实例-Python中函数的用法实例教程

    本文以数值计算为例讲述了Python中函数的用法,分享给大家供大家参考借鉴之用.具体如下: 我们都知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需 ...

  5. 详解python中的用法_详解python中*号的用法

    1.表示乘号 2.表示倍数,例如: def T(msg,time=1): print((msg+' ')*time) T('hi',3) 打印结果(打印3次): hi hi hi 3.单个 * (1) ...

  6. python中 str.strip()用法

    python中 str.strip()用法 1.描述 str.strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列. (即可以去除特殊字符串) 注意:该方法只能删除开头或是 ...

  7. Python中的del用法

    python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以帮助深入理解python的内存方面的问题. python的del不同于C的free和C++的delete. 由于pyth ...

  8. python中的super用法详解_【Python】【类】super用法详解

    一.问题的发现与提出 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(sel ...

  9. python中argv的用法

    python中argv的用法 sys.argv可以用来获取命令行参数,其中sys.argv[0]为脚本名,即python文件名,列表中的其他值为传入的参数值,一般定义方式为 script, arg1, ...

  10. python中max函数用法_Python中max函数用法实例分析

    Python中max函数用法实例分析 更新时间:2015年07月17日 15:45:09 作者:优雅先生 这篇文章主要介绍了Python中max函数用法,实例分析了Python中max函数的功能与使用 ...

最新文章

  1. 黑龙江专科大学计算机专业,黑龙江10大最好的专科学校,有你心仪的学校吗?...
  2. SqlServer2000日志文件过大问题处理
  3. 中兴通讯首席科学家谈5G现状
  4. 小度智能音箱维修点_会投屏电视的智能音箱——小度智能音箱PLAY青春版轻体验...
  5. UICollectionView,CollectionView,瀑布流
  6. java8 base64_Java 8中的Base64 –加入乐趣为时不晚
  7. 年轻人如何做好自己的人生规划?
  8. python书籍_最好的Python书籍,让您像专业程序员一样编程
  9. leetcode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
  10. 金融产品经理的能力修炼精进指南
  11. android页面监听扫描枪,Android监听扫描枪内容(二)
  12. 寻梦港家政上门服务小程序微擎
  13. jena 查询 java_Jena搭建SPARQL查询RDF数据
  14. 作为一个大学生如何自学计算机编程
  15. 一文搞懂PV、UV、VV、IP及其关系与计算
  16. 资深项目经理推荐的五款项目管理工具
  17. cacti 画图 断续问题处理
  18. matlab的diag函数
  19. U-Net卷积神经网络
  20. python微信图片dat转码(整理版)

热门文章

  1. Windows 7的Win+tab的妙用
  2. 电脑自动跳出各种传奇广告怎么解决
  3. Halcon 快速入门
  4. BAPI_GOODSMVT_CREATE MIGO采购订单IQC质检退回到供应商 124 实例
  5. QT纯代码打造音乐播放器
  6. 怎么知道自己是否适合计算机专业,如何判断热门专业是否适合自己?
  7. 国防科大计算机学院夏令营
  8. JAVA基础入门学习
  9. 威纶通触摸屏从入门到精通
  10. 数据库之——sqlite下载及使用