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 += num
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、双星号构建字典
同理,双星号可以用于构建字典
dict1 = {
'age': '22'
}
dict2 = {
'email': 'blog@example.com'
}
user_dict = {'username': 'kanye', **dict1, **dict2}
python 星号(*) 还能这么用的更多相关文章
- python星号变量
python 元组 tupletup1 = ('physics', 'chemistry', 1998, 2000)tup2 = (1, 2, 3, 4, 5)tup3 = 'a', 'b', 'c' ...
- 万能的Python,还能用来制作高大上的进度条?
对于开发或者运维来说,使用Python去完成一些跑批任务,或者做一些监控事件是非常正常的情况.那么如何有效的监控任务的进度,除了在任务中加上log外,还能不能有另一种方式来了解任务进展到哪一步了呢? ...
- Python星号*与**用法分析 What does ** (double star/asterisk) and * (star/asterisk) do for parameters? 必选参数 默认参数 可变参数 关键字参数
python中*号**的区别 - CSDN博客 https://blog.csdn.net/qq_26815677/article/details/78091452 定义可变参数和定义 list 或 ...
- Python开发还在用virtualenv?不如了解下pipenv...#华为云·寻找黑马程序员#
又见 Kenneth Reitz 之前公众号写了一篇文章爬虫新宠requests_html 带你甄别2019虚假大学,其中主要是为了介绍模块**requests_html,这个模块的作者还开发了req ...
- python 星号*使用方法
1.乘号 2.表示倍数 def T(msg,time=1): print((msg+',,')*time) >>>T('hi',3) hi,,hi,,hi 3.单个星号* --1-- ...
- python (1) 还不是大全的小问题
1.pythone 获取系统时间 import datetime nowTime=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')#现在 pa ...
- Python星号表达式
有时候可能想分解出某些值然后丢弃它们,可以使用诸如 _ 或者 ign(ignored)等常用来表示待丢弃值的变量名: record = ('ACME', 50, 123.45, (12, 18, 20 ...
- Python绘图还在用Matplotlib?out了 !发现一款手绘可视化神器!
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. GitHub 地址:https://github.com/chenjian ...
- 发现一款手绘可视化神器!Python绘图还在用Matplotlib?out了 !
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...
- 给想学python但还没有接触过的你,python代码的书写规则,小白入门
Python 文件结构 变量命名 注释 单行注释 多行注释 缩进 Python 文件结构 #!/usr/bin/env python3 # 指定python解释器 # -*- coding: utf- ...
随机推荐
- IPv4已正式用尽
网际协议版本4 (英语:Internet Protocol version 4,缩写:IPv4,又称互联网通信协议第四版)是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署和使用的版本. ...
- 使用Kubernetes快速启用一个静态页面
使用Kubernetes快速启用一个静态页面 将html静态页面放置在nfs目录下,通过Deployment启动时挂在到nginx页面目录即可 查看yaml内容 root@hello:~# cat c ...
- [操作系统]记一次未尽的三星 Galaxy A6s(SM-G6200)刷机过程
给女王大人刷机,第一次刷机,很遗憾,遇到了三星的"锁三键"问题,没有搞成.记录一下这个过程所涉猎的一些刷机基本知识,不妨当作一次学习过程. 1 刷机过程 Step1 查看手机基本信 ...
- 如何训练个人的ChatGpt4
如何在自己的计算机上安装类似 ChatGPT 的个人 AI 并在没有互联网的情况下运行它 本文旨在为任何人安装此软件.最初它有一个视频,伴随着操作方法,但是事情变化很快,我的三次尝试只是推迟了我发表这 ...
- Linux 查看内存使用情况的几种方法
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/27UaVm5_FMhCnxB88pc0QA 在运行 Linux 系 ...
- 【Ubuntu】1. 创建虚拟机
这一篇主要写了虚拟机的创建,不包含操作系统的安装,中间有些步骤没有提到的根据默认操作即可,也可以根据个人情况设置. 点击创建新的虚拟机 这一步可以选择典型安装,过程更简单些,这里我选择自定义. 在安装 ...
- 消息推送平台的实时数仓?!flink消费kafka消息入到hive
大家好,3y啊.好些天没更新了,并没有偷懒,只不过一直在安装环境,差点都想放弃了. 上一次比较大的更新是做了austin的预览地址,把企业微信的应用和机器人消息各种的消息类型和功能给完善了.上一篇文章 ...
- springMVC中注解
其中常见注解: 1.@RequestMapping:用于请求url路径,可用于类和方法上,用于类上,则表示类中所有响应请求的方法都是以该路径作为父路径. 2.@RequestBody:注解实现接收 h ...
- JS中的纯函数
在JavaScript中,纯函数是指在相同的输入下,始终产生相同的输出,并且没有副作用的函数.纯函数不会修改或依赖于函数之外的状态,也不会对外部环境产生任何可观察的影响. 以下是纯函数的特点: 1. ...
- 又一个开源便斩获 7k star 的新模型「GitHub 热点速览」
Star 并不能代表什么,但是绝对能表示一个项目的受欢迎程度.就像刚开源一周就有 7k+ star 的新模型,输入文本 / 图像就能获得 3D 对象.除了这个新模型,本周还有一款新的 Web 3D 渲 ...