参数、解包与变量
一、python参数变量
python命令行运行程序命令:python test.py arg1 arg2 arg3
Python 中可以使用 sys 的 sys.argv 来获取命令行参数:
- sys.argv 是命令行参数列表。
- len(sys.argv) 是命令行参数个数。
注:sys.argv[0] 表示脚本名。
如下图所示:
二、pytho表达式解包
解包在英文里叫做 Unpacking,就是将容器(容器内元素可变)里面的元素逐个取出来放在其它地方,好比你去菜市场买了一袋苹果回来分别发给家里的每个成员,这个过程就是解包。Python 中的解包是自动完成的。
我们通过argv获取到命令行的所有参数(包括脚本名),它是一个参数列表,然后我们可以把获取到的参数列表传递给其他变量,如下图
解包:如下图所示,scriptname,firstParam,secondParam=argv 就是在解包,将得到的参数分给不同的变量并打印出变量内容
*任何可迭代对象都支持解包,除了上面的列表,可迭代对象包括元组、字典、集合、字符串、生成器等实现了__next__方法的一切对象
-
元祖解包
-
字符串解包
-
字典解包
注意:字典解包后,只会把字典的 key 取出来,value 则丢掉了
如果要把key和value都获取到可以如下:
另外。常见的多变量赋值其实也是一个自动解包的过程,如下图所示,等号右边其实是一个元组对象(3, 4)
有时候我们给变量赋值时代码不小心多了一个逗号 ,,就变成了元组对象
如果在解包过程中,遇到左边变量个数小于右边可迭代对象中元素的个数时该怎么办? 好比你们家有3口人,你却买了4个苹果,怎么分配呢?
Python2 中,如果等号左边变量的个数不等于右边可迭代对象中元素的个数,是不允许解包的。但Python3 中可以进行解包,怎么做呢?
就是在某个变量面前加一个星号,而且这个星号可以放在任意变量上,每个变量都分配一个元素后,剩下的元素都分配给这个带星号的变量就是,如下图
三、pytho函数调用解包
函数调用时,有时你可能会用到两个符号:星号*和 双星号**。
如下图所示定义了有a,b,c三个参数的函数,然后我们调用的时候就必须向里面传入三个参数
调用时除了直接传入三个参数外,我们也可以传入一个包含有3个元素的可迭代对象,使用星号 * 解包一个可迭代对象作为函数的参数,如下图所示
另外对于字典对象,可以使用两个星号,它会自动解包成关键字参数 key=value 的格式并传递给函数:如下图
func(**{"a":1,"b":2,"c":3})会自动解包成func(a=1,b=2,c=3)的形式进行参数传递
所以此时要注意:关键字a,b,c,也就是字典的key一定要与func这个函数中定义的参数一致,如果不一样,就会出现错误
总结:
- 自动解包支持一切可迭代对象
- python3中,支持更高级的解包操作,用星号操作使得等号左边的变量个数可以少于右边迭代对象中元素的个数。
- 函数调用时,可以用 * 或者 ** 解包可迭代对象,作为参数传递,一个星号可作用于所有的可迭代对象作为位置参数传递给函数,两个星号只能作用于字典对象,作为关键字参数传递给函数