前言:
目前姐妹们对“python一个星号”大体比较注意,姐妹们都想要知道一些“python一个星号”的相关知识。那么小编也在网络上汇集了一些关于“python一个星号””的相关内容,希望我们能喜欢,朋友们快快来学习一下吧!星号(*)解包
今天我们来说说在python中经常使用的解包语法,这是python简洁语法的体现之一。在日常处理集合数据时非常有用。按照惯例,我们使用一个个尽可能小的例子来说明。
序列解包到变量
nums=[1,2,3,4]a,b,c,d=numsnums是(指向)一个列表在等号左边分别用4个变量,即可让列表中的4个值拆解到4个变量中注意,列表的元素个数与变量的个数必须刚好相等
上面我们分析了最简单的解包,但注意条件"元素数量刚好与变量数量相等",这个条件太坑爹了吧。看下面例子
nums=[1,2,3,4]a,*b=nums如果我们不希望定义这么多变量来保存拆解的元素,那么我们需要在其中的某个变量前加*,表示这个变量是一个序列看上图可知,变量b是一个新的list整个过程相当于,把nums的第一个值给a,然后剩余的以一个list的形式给b
继续更多的例子
nums=[1,2,3,4]*a,b=numsa,b,*c=numsa,*b,c=nums
我就不上示意图了,我想你已经可以看懂了
在方法中定义任意个数的参数
相信大家都知道怎么定义方法,比如
def my_sum(a,b): return a+b
问题是这个方法只能接受2个参数,如果希望可以输入任意个数的参数呢?毕竟有时候需要对多个数字求和。
def my_sum(*arg): return sum(arg)my_sum(1)my_sum(1,2,5,4)又是星号*,其实这里与上一个例子是一个道理,* + 变量,表示这个变量是一个序列注意,在上一个例子中,变量的拆包,序列变量得到的是一个list。而这个例子中,序列参数变量得到的是一个元组。
题外话:拆包变量之所以是list,是因为变量后续一般是为了操作他,list是可变的对象。但参数却相反,尽可能包装参数是一个不可变的类型会更安全,至于为什么,请留意后续文章。
到这里已经解决了定义方法的参数个数限制问题,但调用方法的时候还有个不便之处。看下面例子
def my_sum(*arg): return sum(arg)nums=[1,2,3,4]my_sum(nums)方法的定义没有变化,但现在我们手上直接有一个list调用my_sum的时候,如果像上面的代码那样直接把nums传给my_sum,那么在my_sum里面的参数arg还是一个元组,那我们给他的list就作为了arg的第一个参数arg是一个元组,里面有一个元素,这个元素是一个指向list的引用(示意图中的下方右边的箭头)。如果真要访问我们传入的list,那就需要arg[0]注意,现在我们期望的是,传入后,arg是一个包含4个数值的元组,比如(1,2,3,4)
但这个不是定义方法出问题,而是调用方法的时候不对。先来一个坑爹解法。
def my_sum(*arg): return sum(arg)nums=[1,2,3,4]a,b,c,d=numsmy_sum(a,b,c,d)
上面的代码不需要解释了,因为只是用了本文一开始说的原理去做,但太麻烦了,python提供了一种方便的写法,如下
def my_sum(*arg): return sum(arg)nums=[1,2,3,4]my_sum(*nums)在调用方法,传入参数时,在传入的参数变量前加*,表示拆包。你可以把这种语法当作是python帮你实现坑爹解法。总结
本文重点说了3点
a,*b,c=nums 变量解包def func(*arg): 任意个数参数func(*nums) 调用方法时解包
标签: #python一个星号