首页 > 编程语言 >Python中的*(星号)和**(双星号)详解 通俗易懂

Python中的*(星号)和**(双星号)详解 通俗易懂

时间:2023-06-14 11:12:13浏览次数:40  
标签:定义 收集 Python print 通俗易懂 星号 参数 myprint params

Python和C++不同,并没有指针,因此python中的*号作用和C++中不同。网上对于这方面的教程写的啰啰嗦嗦,一点不简明扼要。看的让人找不到重点。我这里快速的讲解一下。

1.最简单的不用细说,是一个乘法运算符号
a=1
b=2
c=a*b
输出c当然是1×2=2。相信这并非是大家关心的重点。

2.收集列表中多余的值
这样无需确保值与变量的个数相同。举例来说:

a,b,*c=[1,2,3,4]
c前面的*号主要是为了收集参数。这样输出a,是1;输出b,是2,输出c,是[3,4]。注意这里收集的是列表。

3.涉及到函数了,*号的作用在于收集参数或者分配参数。
具体用途,是看用*号的场合是在函数定义时还是函数调用时。(这句话至关重要!)

3.1 如果在定义函数时,*代表收集参数,**代表收集关键字参数。
3.1.1定义函数时,一个*的情况:
def myprint(*params):
print(params)
这时候如果以如下方式调用myprint

>>> myprint(1,2,3)
则会输出:

(1,2,3)
因此作用是将调用时提供的所有值,放在一个元组里。

跟上面2里的有所区别,2里是收集列表中多余的参数,而这里是收集好参数,一起放进元组里面。

这种情况下,在函数定义时的形参里的*params后面,就最好不要再加入别的形参了,比如你定义成 def myprint(*params,x) ,调用的时候myprint(1,2,3),就会报错。因为这样python分不清哪个数据是给params的。如果你非要这么定义也行,不过在调用的时候,必须显示的指出哪个值是给x的。比如myprint(1,2,x=3),通过这种方式调用才不会出错。

3.1.2 定义函数时,两个**的情况:
对于之前参数是*params的情况,myprint并不能传入关键字参数。啥意思呢,就是仍然采取这种方式定义时:

def myprint1(*params):
print(params)
这样是错误的:

>>> myprint1(x=1,y=2,z=3) #会报错
因为*号并不会收集关键字参数。所以需要如下方式修改,采用两个星号:

def myprint2(**params):
print(params)
这样调用myprint2就不会有问题:

>>> myprint2(x=1,y=2,z=3)
会输出如下结果:

{'z':3,'x':1,'y':2}
得到一个字典。字典中元素的先后顺序取决于你的环境。

3.2 如果在调用函数时,*和**都是分配参数用的
3.2.1 调用函数时,一个*的情况:
例如,还是刚刚那个print函数

def myprint(x,y):
print(x)
print(y)
这下形参有两个了,但是我能不能只传入一个形参?

对,“调用函数时分配参数”跟“定义函数时收集参数”,反过来了!

假设你还有一个元组:

params=(1,2)
可以通过如下方式调用myprint函数:

>>> myprint(*params)
就可以输出:

1
2
3.2.2 调用函数时,两个**的情况:
和上面3.1.2很像,是分配字典的。

这回params是一个字典了:

params={'x':1,'y':2}
可以通过如下方式调用myprint函数:

>>> myprint(**params)
就可以输出:

1
2
3.3 如果在定义和调用函数时,都使用*号呢?
这样将值传递元组或字典,没有实际意义,不发挥收集参数或者分配参数的意义,不如不用。

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树首页概览304630 人正在系统学习中:https://edu.csdn.net/skill/python/?utm_source=csdn_ai_skill_tree_blog&category=7
————————————————

原文链接:https://blog.csdn.net/zkk9527/article/details/88675129

标签:定义,收集,Python,print,通俗易懂,星号,参数,myprint,params
From: https://www.cnblogs.com/ling7/p/17479649.html

相关文章

  • 对python迭代器的理解
    迭代器的接口迭代器的用法自定义迭代器迭代器的意义1迭代器的接口可迭代对象计算对象之间的共同属性得到可迭代对象的共同属性上述对象都是容器类型,都有长度加入文件对象再次求交集得到可迭代对象的唯一共同接口:_iter_生成了迭代器同样方法计算迭代器的共同......
  • Python:packaging包解析语义化版本(Semantic Versioning)
    参考文章语义化版本2.0.0语义化版本与其在Python中的使用packaging是python的pip自带包,不需要额外安装#-*-coding:utf-8-*-"""@File:demo.py@Date:2023-06-09"""frompackagingimportversioncurrent_version='1.3.4'parsed_versio......
  • python基础
    第1课初识Python程序设计语言_哔哩哔哩_bilibili主流语言介绍:编译器与解释器:python特点:......
  • 【python】关键字global
    关键字global1.局部变量和全局变量重名:定义了一个全局变量site,接着,我们定义了一个函数func,同时,在函数func里面,我们首先打印变量site的值,接着再次给变量site赋值。最后,调用函数func,此时程序报错,理论上我们在func函数里面第一次打印使用的应该是全局变量site,但实际上程......
  • python: read excel
     """Insurance。pyedit:geovindu,GeovinDu,涂聚文date2023-06-13保险类"""importsysimportosclassInsurance:"""保险类"""def__init__(self,InsuranceName,InsuranceCost,IMo......
  • python+uiautomator2判断app是否进入到闪屏广告页面
    前提背景:app内部存在多处广告,需要进行进行自动化:1.查看app是否成功跳转了页面2.页面是否空白3.大致经历的耗时主要思路如下:点击前进行截图操作,点击后进行判断判断图片是否空白defis_blank(image_path,gray_value=250,threshold=0.9):"""函数会计算一幅图像中......
  • Python调用C/C++动态库
    一、编译C++代码并封装成动态库1、创建编译dll文件的项目,在上面的官网介绍的更详细,这里就不多做介绍了。注意在vs之中新建一个项目,项目选择动态链接库(DLL)2、2.在源文件中添加cpp文件并写好函数#include<iostream>#defineMATHLIBRARY_APIextern"C"__declspec(dllexport)......
  • Python基础之subprocess模块、hashlib模块、日志模块
    subprocess模块tasklist:列举出来文件进程命令"""1.以后我们可以用自己的电脑连接上别人的电脑(socket)2.通过subprocess可以在别人的计算机上执行我们想要执行的命令3.把在别人计算机上执行的结果给返回过来"""importsubprocessimportsubprocessres=subprocess.P......
  • python 之logging 模块
    一、日志的简单使用1、什么是日志记录你的代码在执行过程中的一些变化(记录的是一些有意义的变化)2、日志的5个等级importlogginglogging.debug('debugmessage')#10logging.info('infomessage')#20logging.warning('warningmessage')#30logging.error('errorm......
  • python 3.11.4 安装教程
    python官网 WelcometoPython.org.1.下载python进入官网点击Downloads找到3.11.4版本 点击Download  找到对应的电脑版本进行下载 2.安装python(1)双击下载好的python-3.11.4-amd64.exe(2)勾选AddPython3.7toPATH,再点击CustomizeinstallationInstallno......