龙空技术网

每日一点,带你入门Python-星号拆包

外星人玩Python 422

前言:

目前姐妹们对“python一个星号”大体比较注意,姐妹们都想要知道一些“python一个星号”的相关知识。那么小编也在网络上汇集了一些关于“python一个星号””的相关内容,希望我们能喜欢,朋友们快快来学习一下吧!

星号(*)解包

今天我们来说说在python中经常使用的解包语法,这是python简洁语法的体现之一。在日常处理集合数据时非常有用。按照惯例,我们使用一个个尽可能小的例子来说明。

序列解包到变量

nums=[1,2,3,4]a,b,c,d=nums
nums是(指向)一个列表在等号左边分别用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一个星号