-
这是个简单的知识点,但有的同学并不理解
-
unpacking解包
-
解,对应的是*或者**,也有自动解包之说
-
包对应的可迭代对象
目录
- 一、自动解包
- 二、数据过多的解包*
- 三、星号在函数中的使用
- 四、两个星号的解包
- 五、场景的应用
一、自动解包
赋值的demo
a,b = [1,2]
print(a) # 1
print(b) # 2
将容器里面的元素逐个取出来分别赋值
不一定是列表,可以是元组、字典、字符串等一切可迭代的对象
比如这样
t1,t2 = (1,2)
s1,s2 = 'ab'
d1,d2 = {'name':'wuxianfeng','age':18} # d1 是 name, d2 是age
不过要注意的是字典的解包,只是个key
也可以这样
a, *b, c = range(5) # b 就是[1,2,3]
二、数据过多的解包*
有的时候数据可能会过多,那就要用到星号了
a,b,c = 1,2,3,4
# 报错了
ValueError Traceback (most recent call last)
<ipython-input-6-e6e12dfe99e4> in <module>
----> 1 a,b,c = 1,2,3,4
ValueError: too many values to unpack (expected 3)
怎么办?
a,*b,c = 1,2,3,4
# 此时的b的值为 [2, 3],是个列表
# 如果这样
a,b,*c = 1,2,3,4 # 那么c就是[3,4]
有点像这样
list1 = [1,2,3,4,5,6,7,8]
first , rest = list1[0],list1[1:]
first , *rest = list1 # 以上两种写法一样的,都能让rest是 [2,3,4,5,6,7,8]
三、星号在函数中的使用
代码演示
def fun(x,y):
print(f'x={x}')
print(f'y={y}')
fun(1,2)
# 输出如下..
# x=1
# y=2
那要是这样呢?
fun([1,2])
# 报错了
TypeError Traceback (most recent call last)
<ipython-input-8-6924a6444e6f> in <module>
----> 1 fun([1,2])
TypeError: fun() missing 1 required positional argument: 'y'
但可以这样
fun(*[1,2]) # x=1 y=2
fun(*'ab') # x=a y=b
fun(*(3,4)) # x=3 y=4
那要是这种情况呢?
fun(*{'name':'wuxianfeng','age':18})
# x=name
# y=age
那要是这种情况呢?
for a, *b in [(1, 2, 3), (4, 5, 6, 7)]:
print(b)
下面2个语句都对吗?对的话,a的值是啥
*a, = range(5)
*a = range(5)
四、两个星号的解包
换个函数
def fun(x=1,y=2):
print(f'x={x}')
print(f'y={y}')
之前的测试都ok
如果是字典,你要传value进去呢
def fun(x=1,y=2):
print(f'x={x}')
print(f'y={y}')
fun(**{'x':'wuxianfeng','y':18})
# 等价于
fun(x='wuxianfeng',y=18)
具体你可以去看看函数的不定参数的定义和应用,此处不做更多解释
五、场景的应用
合并字典
d1 = {'x':1}
d2 = {'y':2}
d3 = {**d1,**d2}
d3 # {'x': 1, 'y': 2}
同样的list的合并也可以这样做
li1 = [1,2]
li2 = [3,4]
li3 = [*li1,*li2]
li3
zip是个有趣的内置函数
比如这样
li1 = ['a','b']
li2 = [1,2]
li = list(zip(li1,li2))
li # [('a', 1), ('b', 2)]
di = dict(zip(li1,li2)) # {'a': 1, 'b': 2}
# 如果要逆向呢?
li1 = ['a','b']
li2 = [1,2]
result = zip(li1,li2)
print(list(zip(*result))) # [('a', 'b'), (1, 2)]
回到正题,在selenium课程中,有这样一段
def find_element(self, by=By.ID, value=None) -> WebElement:
pass
# 在后面项目课中的调用我们是这样做的
locator = 'id','ls_username'
driver.find_element(*locator)
# 如果这样driver.find_element(locator) 显然报错在上面已经提到了。