共计 3642 个字符,预计需要花费 10 分钟才能阅读完成。
引言
在 Python 中,星号除了用于乘法数值运算和幂运算外,还有一种非凡的用法 ” 在变量前增加单个星号或两个星号 ”,实现多参数的传入或变量的拆解,本文将具体介绍 ” 星号参数 ” 的用法。
文章目录
0×1. 什么是星号变量
0×2. 单星号变量实例
0×3. 双星号变量实例
0×1. 什么是星号变量
最后,星号变量是用在函数的参数传递上的,在上面的实例中,单个星号代表这个地位接管任意多个非关键字参数,在函数的 b 地位上将其转化成元组,而双星号代表这个地位接管任意多个关键字参数,在 * b 地位上将其转化成字典:
#!/usr/bin/env python
#coding=utf-8
#--------
def one(a,*b):
"""a 是一个一般传入参数,* b 是一个非关键字星号参数"""
print(b)
one(1,2,3,4,5,6)
#--------
def two(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))
#第二个函数中,** 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/env python
#coding=utf-8
#--------
def one(*x):
"""输入传入的第一个参数"""
print(x[0])
#--------
lst=["a","b","c","d"]
stri="www.qingsword.com"
one(stri,lst)
one(*lst)
one(*stri)
#程序输入
www.qingsword.com
a
w
#第一次调用 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/env python
#coding=utf-8
#--------
def one(*x):
"""一个谬误的实例,尝试批改传入的第一个参数值,引发异样"""
print(x[0])
x[0]="qingsword"
lst=["a","b","c","d"]
one(*lst)
#咱们晓得列表是能够更改的,咱们将列表拆分后传入 one() 函数,尝试在函数外部更改第一个元素的值,后果触发了 "TypeError" 异样,大家能够本人尝试下,呈现这种后果的起因下面曾经阐明,不管传入的参数的原始类型是什么,one(*x) 在 * x 的地位接管这些传入的参数后,都会将其保留成 "元组",而元组是不能扭转的
再来看几个实例:
#!/usr/bin/env python
#coding=utf-8
#--------
def one(*x):
"""打印出传入参数"""
for a in x:
print(a)
lst=["abc",123,"www.qingsword.com"]
stri="abcd"
dect={1:"one",2:"two",3:"three"}
one(*lst)
one(*stri)
one(*dect)
#程序输入
abc
123
www.qingsword.com
a
b
c
d
1
2
3
#后面两次调用都很好了解,最初咱们传入了一个字典元素,发现仅输入了字典元素的键,并没有蕴含值,实际上,单星号是无奈读取到字典中的值的,永远只会读取到字典中的键,如果想读取到字典中的值,须要应用双星号
0×3. 双星号变量实例
在第 2 大节的最初,咱们应用单星号拆分了一个字典传递给函数,却只能失去字典的键,上面演示如何应用双星号来取得字典的值:
#!/usr/bin/env python
#coding=utf-8
#--------
def one(**x):
"""将传入的关键字参数的值保留成元组输入"""
print(x)
b=()
for a in x.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:留神,应用这种办法将字典传入函数的时候,字典的键的命名要合乎 python 变量的命名规定,通过下面的剖析也不难看出,双星号会将字典首先转换成关键字参数的模式,就相当于应用字典中的键作为变量名,如果键不合乎变量命名规定,则会抛出一个 ”TypeError” 异样,大家能够尝试着颠倒一下下面字典中的键和值,应用数字作为键,看看会呈现什么问题。
在一个函数的接管参数中,同时呈现 ” 非关键字参数(地位参数)” 和 ” 关键字参数 ” 时,能够应用一个单星号来分隔这两种参数,例如:
#!/usr/bin/env python
#coding=utf-8
#--------
def mix(a,b,*,x,y):
"""地位参数与关键字参数混合"""
return a,b,x,y
#星号后面的 a 和 b 是地位参数,星号前面的 x 和 y 是关键字参数,调用 mix() 函数并传入参数时,关键字参数肯定要应用 "变量名 = 值" 的模式传入数据,如果同地位参数一样传入数据,就会引发一个 TypeError 异样
print(mix(1,2,x=3,y=4))
#程序输入
(1, 2, 3, 4)
#在下面的 mix 函数中,如果地位参数与关键字参数之间曾经存在了一个单星号地位参数,那么,这个参数前面的就都是关键字参数,也不须要再应用星号来分隔他们了,例如
#!/usr/bin/env python
#coding=utf-8
#--------
def mix(a,b,*c,x,y):
"""地位参数与关键字参数混合"""
return a,b,c,x,y
#在 * c 的地位能够输出任意多个地位参数值
print(mix(1,2,3,4,5,x=6,y=7))
#程序输入
(1, 2, (3, 4, 5), 6, 7)
如果咱们要在一个函数中蕴含多种参数的组合,必须恪守这样的程序:地位参数(必选参数),默认参数,单星号参数或星号分隔符,关键字参数,双星号参数;请看上面的实例:
#!/usr/bin/env python
#coding=utf-8
#--------
def mix(a,b=0,*c,x,**y):
"""地位参数与关键字参数混合"""
return a,b,c,x,y
print(mix(1,2,3,4,5,x=6,y=7,z=8))
#程序输入
(1, 2, (3, 4, 5), 6, {'y': 7, 'z': 8})