python 星号(*) 还能这么用

这篇具有很好参考价值的文章主要介绍了python 星号(*) 还能这么用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼

今天跟大家介绍一下 python 当中星号(*)的一些用法

首先大家最常见的就是在 python 中 * 是乘法运算符,实现乘法

sum = 5 * 5 # 25

除此之外,还有一种常见的用法就是 * 号操作符在函数中的用法

  • 单星号(*)在函数中用法

举个例子,你有一个函数,用来实现两个数求和

def add(num1, num2):
    return num1 + num2

print(add(1,2)) # 3

上面这个函数只能接收固定个数(两个)的参数,那如果我想要求任意数量的值的和该怎么办?

可以在形参部分加一个 *

def add(*num):
	sum = 0
	for i in num:
        sum += i
   	return sum

在函数定义的时候形参前面加一个 * 号,就可以用任意数量的参数来调用函数,如果检查数据类型,会发现 num 是一个元组(tuple)

即将所有传入函数的位置参数打包成一个元组

#使用任意数量的参数来调用函数
add(1, 2, 3, 4) # 10

那如果函数在定义的时候就已经固定了形参的个数

def add(num1, num2, num3):
    return num1 + num2 + num3

我们想要传递一个列表参数(假设这个列表有三个元素),可以这么调用函数

my_list = [1, 2, 3]
add(my_list[0], my_list[1], my_list[2])

这样子调用要多敲几个键盘,多麻烦。我们用 * 号来实现,前面我们看到 * 可以用在函数定义的时候的用法

在函数调用的时候加一个 * 号可以将一个列表或元组解构成多个变量

my_list = [1, 2, 3]
add(*my_list)
  • 双星号(**)在函数中的用法

上面我们介绍了 * 操作符在函数定义的时候可以用来接收多个参数,并且将参数打包成一个元组,在函数调用的时候可以对列表或者元组中的元素进行解构

那如果对象是字典,我们可以使用双星号操作符(**

举个例子,假设有下面的函数

def user_info(username, email, phone, date_of_birth):
    user = get_user(username)
    user.email = email
    user.phone = phone
    ...

如果我们用关键字参数(keyword arguments,kwargs)调用它,就是下面的效果

user_info('kanye', email='blog@example.com', phone='88888', date_of_birth='2000.08.15')

那如果我需要增加传参个数,我就不得不去函数定义那里添加形参,这么做太麻烦了

我们可以这么做,我们在 kwargs 形参前面加了双星号,用于接收任意数量的关键字参数

def user_info(username, **kwargs):
    user = get_user(username)
    user.email = kwargs['email']
    user.phone = kwargs['phone']
    ...

在形参中,**kwargs 的关键是双星号,你完全可以使用其他名字例如 **usr(还是建议用 kwargs)

在函数定义中,** 操作符会把传进来的参数打包成字典

当然,我们可以像使用 Python 中的其他字典一样使用 kwargs 字典,这样会使代码更简洁易懂

def user_info(username, **kwargs):
    user = get_user(username)
    for k,v in kwargs.items():
    	....

除此之外,** 操作符也可以用在函数调用的时候,用于将一个字典解构成多个变量

dict = {
	'email':"blog@example.com"
	'phone':"88888"
    ...
}

user_info(username,**dict)
  • 单星号接收非关键字参数

在函数定义的时候,单星号可以独立使用,不需要变量(参数)名称,在Python中是一个完全有效的函数定义

def my_function(*, keyword_arg):
    ...

在上面的函数定义中,* 号参数会接收所有非关键字参数(位置参数),然后剩下的关键字参数传给 keyword_arg

如果你在调用的时候只传了位置参数,就会报错

my_function(1)
"""
TypeError: my_function() takes 0 positional arguments but 1 was given
"""

在上面代码中,函数my_function定义了一个命名关键字参数keyword_arg,但在函数调用时使用位置参数 1 来传递参数,而不是使用关键字参数的方式,所以报错

函数定义中,使用*来标识位置参数结束,之后的参数都被视为命名关键字参数,这意味着在函数调用时必须传递关键字参数

那如果我们想强制只使用位置参数,而不是上面案例中的只使用关键字参数该怎么办

我们使用 / 号来实现

def only_positional_arguments(arg1, arg2, /):
    ...

如果你传递关键字参数,会发生报错,是不是很有意思

only_positional_arguments(arg1=1, arg2=2)

"""
TypeError: only_positional_arguments() got some positional-only arguments passed as keyword arguments: 'arg1, arg2'
"""
  • 星号拓展用法

1、单星号构建或解构列表

比如说有下面两个列表

my_list_1 = [1, 2, 3]
my_list_2 = [10, 20, 30]

我们打算合并这两个列表,可以用 + 操作符

merged_list = my_list_1 + my_list_2

但是单星号更灵活,比如说我们在合并的时候在中间加一个元素

num=42
merged_list = [*my_list_1, some_value, *my_list_2]

我们知道,解构列表元素的时候可以这么干

my_list = [1, 2, 3]
a, b, c = my_list

# a -> 1
# b -> 2
# c -> 3

上面每个变量都存储了列表中的元素,那假设我打算将列表中的第一个和最后一个元素放在指定变量中,中间的元素还是作为列表,我该怎么办

可以使用单星号

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a, *b, c = my_list

# a -> 1
# b -> [2, 3, 4, 5, 6, 7, 8, 9]
# c -> 10

需要注意的是,单星号接收的对象是列表

my_list = [1, 2, 3]
a, *b, c = my_list

# a -> 1
# b -> [2]
# c -> 3

2、双星号构建字典

同理,双星号可以用于构建字典文章来源地址https://www.toymoban.com/news/detail-491908.html

dict1 = {
    'age': '22'
}

dict2 = {
    'email': 'blog@example.com'
}

user_dict = {'username': 'kanye', **dict1, **dict2}

到了这里,关于python 星号(*) 还能这么用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • selenium还能这么玩:连接已经存在的浏览器

    测试和爬虫对selenium并不会陌生,现有的教程已经非常多。但是因为 selenium 封装的方法比较底层,所以灵活性非常高,我们可以基于这种灵活性来实现非常丰富的定制功能。 这篇文章介绍一个操作,可以让 selenium 连接我们手动打开的浏览器。他的应用场景主要是:你可以通

    2024年02月08日
    浏览(40)
  • [C++历练之路]C++模板还能这么玩,已经走了好多弯路,后悔没有早点学会到。

    W...Y的主页 😊  代码仓库分享💕    🍔前言:  在C++的世界里,模板是一种强大而神奇的工具,宛如编程的瑰宝匣,蕴藏着无限的可能性。它们不仅能够让我们编写通用的代码,还能够在编译时实现类型安全的抽象。然而,模板的奥秘并非易见,它们像是编码世界中的魔法

    2024年02月04日
    浏览(29)
  • Python 中星号(*)的用法

    Python实用教程_spiritx的博客-CSDN博客 星号​​*​​ 往往被称为乘法运算符,是所有程序中最为常用的运算符号之一,在Python 中,星号还有很多隐藏的强大功能。 本文将用最容易理解的例子来解释星号*的 五个使用场景,从初级用法到高阶用法。 最简单的用法是利用星号作为基

    2024年02月05日
    浏览(25)
  • python的字典合并和星号功能

    无需确保值与变量个数相同 场合是在函数定义还是函数调用 函数形参 一个* 在函数形参*params后面,最好不要再加入别的形参 定义成 def myprint(*params,x) ,调用myprint(1,2,3)报错。 非要这么定义,调用时显式指出哪个值给x 两个* 函数调用 一个* 两个* 定义和调用函数时都使用

    2024年02月11日
    浏览(26)
  • Python中的*(星号)和**(双星号)完全详解

    在Python中,*和**是两个重要的运算符,它们具有不同的用途。 *(星号)用于解包序列或可迭代对象,将其元素分配给函数的参数或在列表、元组等数据结构中进行拼接。 **(双星号)用于解包字典,将其键值对传递给函数的参数或在字典中进行拼接。 【示例代码】 下面是在

    2024年02月05日
    浏览(30)
  • 用python画一个五角星的代码,用python画星号三角形

    大家好,小编来为大家解答以下问题,用python画一个五角星的代码,用python画星号三角形,今天让我们一起来看看吧! 大家好,小编为大家解答python编写一个打地鼠的游戏程序的问题。很多人还不知道python编写一个打地鼠的游戏代码,现在让我们一起来看看吧! 如果你没有

    2024年03月24日
    浏览(31)
  • 安卓协议逆向 咸鱼 frida rpc 调用方案

    通过frida rpc调用真机获取指定的搜索结果数据。 本文仅供大家学习及研究使用、切勿用于各种非法用途。 frida 提供了一种跨平台的 rpc (远程过程调用)机制,通过 frida rpc 可以在主机和目标设备之间进行通信,并在目标设备上执行代码,可实现功能如下: 1、动态地

    2024年02月07日
    浏览(29)
  • 咸鱼之王小游戏PC版鼠标模拟器实现

    最近朋友在玩咸鱼之王小游戏,用电脑挂机,由于火把缺乏,我看他经常疯狂的点鼠标攻击敌人。 我:\\\"你为什么不用鼠标模拟器去点?\\\" 朋友:\\\"鼠标模拟器点也不能干其他的事情,鼠标必须放到游戏窗口才行。\\\", 我:\\\"我帮你简单实现个鼠标模拟器吧\\\"  总结 其实原理很简单

    2024年02月12日
    浏览(90)
  • Python大火,零基础还能学习么?

    Python近段时间一直涨势迅猛,在各大编程排行榜中崭露头角,得益于它多功能性和简单易上手的特性,让它可以在很多不同的工作中发挥重大作用。 正因如此,目前几乎所有大中型互联网企业都在使用 Python 完成各种各样的工作,比如Web应用开发、自动化运维、人工智能领域

    2024年02月06日
    浏览(26)
  • 今天给大家带来Python炫酷爱心代码

    前言: 这个是小编之前朋友一直要小编去做的,不过之前技术不够所以一直拖欠今天也完成之前的约定吧! 至于他是谁,我就不多说了直接上代码 如果有需要的话,可以联系小编噢!

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包