python **和*的作用(这里不讲运算符)

* 和 ** 的作用

*Example

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

操作符允许我们将一个键值对的字典,在函数调用中解包成关键字参数。

**Example:

> 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'

*unpacking into function call

> fruits = ['lemon', 'pear', 'watermelon']
> print(*fruits) // which is equal to 
> print(fruits[0], fruits[1], fruits[2])
lemon pear watermelon 

*在定义一个函数时,

from random import randint
def roll(*dice):
   return sum(randint(1, die) for die in dice)
   
roll(20) // 18
roll(6, 6) // 9
roll(6, 6, 6) // 8

*操作符可以用来捕获给函数的无限数量的位置参数。这些参数被捕捉到一个元组中。

我们可以在定义一个函数时使用 ** 来捕获给函数的任何关键字参数到一个字典中。

def tag(tag_name, **attributes):
  attribute_list = [
      f'{name}="{value}"'
      for name, value in attributes.items()
  ]
  return f"<{tag_name} {' '.join(attribute_list)}>"

> tag('a', href="http://treyhunner.com")
'<a href="http://treyhunner.com">'
>tag('img', height=20, width=40, src="face.jpg")
'<img height="20" width="40" src="face.jpg">'

Asterisks in tuple unpacking

>>> 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']
>>> ((first_letter, *remaining), *other_fruits) = fruits
>>> remaining
['e', 'm', 'o', 'n']
>>> other_fruits
['pear', 'watermelon', 'tomato']

字典中的双星号

>>> 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'}

// copy/merge dictionaries while overriding particular values:
>>> 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'}

总结

  1. 使用*和**来传递参数给一个函数
  2. 使用*和**来捕获传入函数的参数
  3. 使用*来接受只有关键字的参数
  4. 在元组解包时使用*来捕获项目
  5. 使用 * 将迭代项解包为一个列表/元组
  6. 使用**将字典解包到其他字典中

但是需要小心,当多次使用 ** 时,Python 中的函数不能多次指定相同的关键字参数。所以使用 ** 的每个 dictionary 中的键必须是不同的,否则会产生异常。

链接: Asterisks in Python: what they are and how to use them.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值