介绍在Python中,星号除了用于乘法数值运算和幂运算外,还有一种特殊用法“在变量Asterisk前加一个或两个星号",实现多参数的输入或变量的反汇编。本文将详细介绍“星号参数”的用法。文章目录0×1。什么是星号变量0×2。单个星号变量实例0×3。双星号变量实例0×1。什么是星号变量最初,星号变量用于函数参数传递是的,在下面的示例中,单个星号表示该位置接受任意数量的非关键字参数,这些参数在函数的b位置转换为元组,而双星号表示该位置接受任意数量的关键字参数,在*b位置将其转换为字典:#!/usr/bin/envpython#coding=utf-8#------defone(a,*b):"""a为普通传入参数,*b为非关键字星号参数"""print(b)one(1,2,3,4,5,6)#-------deftwo(a=1,**b):"""a为普通关键字参数,**b为关键字双星号参数"""print(b)two(a=1,b=2,c=3,d=4,e=5,f=6)#程序输出(2,3,4,5,6){'b':2,'c':3,'e':5,'f':6,'d':4}#从输出可以看出,在第一个函数中,*b位置可以传入任意数量的不带关键字的参数,*b会将这些进行转换传入参数成元组,如下调用one(1,2,3,4,5,6)#传入one(a,*b)后,相当于one(1,(2,3,4,5,6))#Second在这个函数中,**b的位置可以接收任意数量的关键字参数,下面调用two(a=1,b=2,c=3,d=4,e=5,f=6)#传入one(a,*b)后,相当于two(a=1,{'b':2,'c':3,'e':5,'f':6,'d':4})了解了单星号和双星号的基本用法后,我们再来看看它们的扩展用法。0×2。单星号变量实例单星号变量不仅可以用在函数的参数传递中,实际上还可以使用单星号前缀作为一个普通变量将变量拆分成单个元素,请看下面的例子:#!/usr/bin/envpython#coding=utf-8#------defone(*x):"""输出传入的第一个参数"""print(x[0])#--------lst=["a","b","c","d"]stri="www.qingsword.com"one(stri,lst)one(*lst)one(*stri)#Program输出www.qingsword.comaw#第一次调用one(stri,lst),代入one(*x)后相当于one(("www.qingsword.com",["a","b","c","d"]))#第二次调用one(*lst),代入one(*x)后,相当于one(("a","b","c","d"))#第三次调用one(*stri),代入one(*x)后,相当于one(("w","w","w",".","q","i","n","g","s","w","o","r","d",".","c","o","m"))#如果在变量前面使用单个星号,其实就是对变量进行拆解操作,将变量中的各个元素拆解,然后依次传入one()函数,传入后one()函数,one()函数会将这些传入的单个元素保存到一个元组中,这就是我们print(x[0])可以提取第一个元素的原因。为了验证这一点,我们修改one()函数,如下:#!/usr/bin/envpython#coding=utf-8#------defone(*x):"""Awrong例如,尝试修改传入的第一个参数值,抛出异常"""print(x[0])x[0]="qingsword"lst=["a","b","c","d"]one(*lst)#weknowthelist它可以改变。我们拆分列表并将其传递给one()函数,尝试更改函数内部第一个元素的值,结果触发了“TypeError”异常。大家可以自己试试,这个结果的原因上面已经解释过了,不管传入参数的原始类型是什么,one(*x)都会保存为"元组”,并且元组不能改变看几个例子:#!/usr/bin/envpython#coding=utf-8#------defone(*x):"""打印出来传入参数"""forainx:print(a)lst=["abc",123,"www.qingsword.com"]stri="abcd"dect={1:"one",2:"two",3:"three"}one(*lst)one(*stri)one(*dect)#程序输出abc123www.qingsword.comabcd123#前面两个调用很好理解,最后我们传入一个Dictionary元素,发现只输出了字典元素的键,没有包含任何值。其实单星号是读不到字典中的值的,永远只会读字典中的键。如果你要读取字典中的值需要用到双星号0×3,双星号变量实例在第二节最后,我们用单星号拆分一个字典传给函数,但是我们只能获取字典的键,下面演示如何使用双星号获取字典的值:#!/usr/bin/envpython#coding=utf-8#--------defone(**x):"""将在关键字参数中传递将值保存为元组输出"""print(x)b=()forainx.values():b+=(a,)print(b)dect={"one":1,"two":2,"three":3}one(**dect)#程序输出{'three':3,'one':1,'two':2}(3,1,2)#对字典使用双星号前缀相当于拆分成关键字参数,**dect相当于把字典拆分成下面的one=1,two=2,three=3#传入上面的关键字参数one(**x),相当于(记得我前面说的,双星号会将接收到的关键字参数全部保存到一个字典中)one({"one":1,"two":2,"three":3})#既然是字典,那么字典中的所有方法都可以使用,使用for循环遍历字典的值,添加到一个元组中,最后打印出元组ps:注意,使用this这种方式将字典传入函数时,字典的键的命名必须符合python变量的命名规则。通过以上分析并不难可以看出,双星号会先把字典转换成关键字参数的形式,相当于把字典中的键作为变量名。如果键不符合变量命名规则,将抛出“TypeError”异常。你可以试试把上面字典中的键和值倒过来,用数字作为键,看看当函数的接收参数中出现“非关键字参数(位置参数)”和“关键字参数”时会发生什么,可以使用一个星号来分隔两个参数,例如:#!/usr/bin/envpython#coding=utf-8#------defmix(a,b,*,x,y):"""位置参数和关键字参数混合"""returna,b,x,y#星号前的a和b是位置参数,星号后的x和y是关键字参数,调用mix()函数和传入参数,关键字参数必须使用“变量名=值”的形式传入数据。如果按照位置参数的方式传递数据,会触发TypeError异常print(mix(1,2,x=3,y=4))#程序输出(1,2,3,4)#In上面的mix函数,如果position参数和keyword参数之间有一个单独的星号position参数,那么,这个参数后面的参数都是keyword参数,不需要用星号隔开,比如#!/usr/bin/envpython#coding=utf-8#------defmix(a,b,*c,x,y):"""位置参数和关键字参数的混合"""returna,b,c,x,y#可以在*c的位置输入任意个位置参数值print(mix(1,2,3,4,5,x=6,y=7))#programoutput(1,2,(3,4,5),6,7)如果我们要在一个函数中组合多个参数,必须依次遵循:位置参数(必填参数)、默认参数、单星号参数或星号分隔符、关键字参数、双星号参数;请参阅以下示例:#!/usr/bin/envpython#coding=utf-8#------defmix(a,b=0,*c,x,**y):"""位置参数和关键字参数Mix"""returna,b,c,x,yprint(mix(1,2,3,4,5,x=6,y=7,z=8))#程序输出(1,2,(3,4,5),6,{'y':7,'z':8})
