翼度科技»论坛 编程开发 python 查看内容

python 星号(*) 还能这么用

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
哈喽大家好,我是咸鱼
今天跟大家介绍一下 python 当中星号(*)的一些用法
首先大家最常见的就是在 python 中 * 是乘法运算符,实现乘法
  1. sum = 5 * 5 # 25
复制代码
除此之外,还有一种常见的用法就是 * 号操作符在函数中的用法

  • 单星号(*)在函数中用法
举个例子,你有一个函数,用来实现两个数求和
  1. def add(num1, num2):
  2.     return num1 + num2
  3. print(add(1,2)) # 3
复制代码
上面这个函数只能接收固定个数(两个)的参数,那如果我想要求任意数量的值的和该怎么办?
可以在形参部分加一个 * 号
  1. def add(*num):
  2.         sum = 0
  3.         for i in num:
  4.         sum += num
  5.            return sum
复制代码
在函数定义的时候形参前面加一个 * 号,就可以用任意数量的参数来调用函数,如果检查数据类型,会发现 num 是一个元组(tuple)
即将所有传入函数的位置参数打包成一个元组
  1. #使用任意数量的参数来调用函数
  2. add(1, 2, 3, 4) # 10
复制代码
那如果函数在定义的时候就已经固定了形参的个数
  1. def add(num1, num2, num3):
  2.     return num1 + num2 + num3
复制代码
我们想要传递一个列表参数(假设这个列表有三个元素),可以这么调用函数
  1. my_list = [1, 2, 3]
  2. add(my_list[0], my_list[1], my_list[2])
复制代码
这样子调用要多敲几个键盘,多麻烦。我们用 * 号来实现,前面我们看到 * 可以用在函数定义的时候的用法
在函数调用的时候加一个 * 号可以将一个列表或元组解构成多个变量
  1. my_list = [1, 2, 3]
  2. add(*my_list)
复制代码

  • 双星号(**)在函数中的用法
上面我们介绍了 * 操作符在函数定义的时候可以用来接收多个参数,并且将参数打包成一个元组,在函数调用的时候可以对列表或者元组中的元素进行解构
那如果对象是字典,我们可以使用双星号操作符(**)
举个例子,假设有下面的函数
  1. def user_info(username, email, phone, date_of_birth):
  2.     user = get_user(username)
  3.     user.email = email
  4.     user.phone = phone
  5.     ...
复制代码
如果我们用关键字参数(keyword arguments,kwargs)调用它,就是下面的效果
  1. user_info('kanye', email='blog@example.com', phone='88888', date_of_birth='2000.08.15')
复制代码
那如果我需要增加传参个数,我就不得不去函数定义那里添加形参,这么做太麻烦了
我们可以这么做,我们在 kwargs 形参前面加了双星号,用于接收任意数量的关键字参数
  1. def user_info(username, **kwargs):
  2.     user = get_user(username)
  3.     user.email = kwargs['email']
  4.     user.phone = kwargs['phone']
  5.     ...
复制代码
在形参中,**kwargs 的关键是双星号,你完全可以使用其他名字例如 **usr(还是建议用 kwargs)
在函数定义中,** 操作符会把传进来的参数打包成字典
当然,我们可以像使用 Python 中的其他字典一样使用 kwargs 字典,这样会使代码更简洁易懂
  1. def user_info(username, **kwargs):
  2.     user = get_user(username)
  3.     for k,v in kwargs.items():
  4.             ....
复制代码
除此之外,** 操作符也可以用在函数调用的时候,用于将一个字典解构成多个变量
  1. dict = {
  2.         'email':"blog@example.com"
  3.         'phone':"88888"
  4.     ...
  5. }
  6. user_info(username,**dict)
复制代码

  • 单星号接收非关键字参数
在函数定义的时候,单星号可以独立使用,不需要变量(参数)名称,在Python中是一个完全有效的函数定义
  1. def my_function(*, keyword_arg):
  2.     ...
复制代码
在上面的函数定义中,* 号参数会接收所有非关键字参数(位置参数),然后剩下的关键字参数传给 keyword_arg
如果你在调用的时候只传了位置参数,就会报错
  1. my_function(1)
  2. """
  3. TypeError: my_function() takes 0 positional arguments but 1 was given
  4. """
复制代码
在上面代码中,函数my_function定义了一个命名关键字参数keyword_arg,但在函数调用时使用位置参数 1 来传递参数,而不是使用关键字参数的方式,所以报错
函数定义中,使用*来标识位置参数结束,之后的参数都被视为命名关键字参数,这意味着在函数调用时必须传递关键字参数
那如果我们想强制只使用位置参数,而不是上面案例中的只使用关键字参数该怎么办
我们使用 / 号来实现
  1. def only_positional_arguments(arg1, arg2, /):
  2.     ...
复制代码
如果你传递关键字参数,会发生报错,是不是很有意思
  1. only_positional_arguments(arg1=1, arg2=2)
  2. """
  3. TypeError: only_positional_arguments() got some positional-only arguments passed as keyword arguments: 'arg1, arg2'
  4. """
复制代码

  • 星号拓展用法
1、单星号构建或解构列表
比如说有下面两个列表
  1. my_list_1 = [1, 2, 3]
  2. my_list_2 = [10, 20, 30]
复制代码
我们打算合并这两个列表,可以用 + 操作符
  1. merged_list = my_list_1 + my_list_2
复制代码
但是单星号更灵活,比如说我们在合并的时候在中间加一个元素
  1. num=42
  2. merged_list = [*my_list_1, some_value, *my_list_2]
复制代码
我们知道,解构列表元素的时候可以这么干
  1. my_list = [1, 2, 3]
  2. a, b, c = my_list
  3. # a -> 1
  4. # b -> 2
  5. # c -> 3
复制代码
上面每个变量都存储了列表中的元素,那假设我打算将列表中的第一个和最后一个元素放在指定变量中,中间的元素还是作为列表,我该怎么办
可以使用单星号
  1. my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  2. a, *b, c = my_list
  3. # a -> 1
  4. # b -> [2, 3, 4, 5, 6, 7, 8, 9]
  5. # c -> 10
复制代码
需要注意的是,单星号接收的对象是列表
  1. my_list = [1, 2, 3]
  2. a, *b, c = my_list
  3. # a -> 1
  4. # b -> [2]
  5. # c -> 3
复制代码
2、双星号构建字典
同理,双星号可以用于构建字典
  1. dict1 = {
  2.     'age': '22'
  3. }
  4. dict2 = {
  5.     'email': 'blog@example.com'
  6. }
  7. user_dict = {'username': 'kanye', **dict1, **dict2}
复制代码
来源:https://www.cnblogs.com/edisonfish/p/17493391.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具