Python常見面試題008. 談談python中的解包

松勤吳老師發表於2023-03-08

008. 談談python中的解包

  • 這是個簡單的知識點,但有的學員並不理解
  • 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)  顯然報錯在上面已經提到了。
    
    

相關文章