Python常见面试题008. 谈谈python中的解包

python,常见,面试题,谈谈,解包 · 浏览次数 : 111

小编点评

**解包**是指将多个可迭代对象的元素依次赋值给多个变量的操作。在 Python 中,可以使用三个主要方法实现解包: 1. **星号** (`*`):使用星号可以将解包的所有元素提取到一个列表中。例如,`a, b, c = 1, 2, 3, 4` 等同于 `a, b, c = range(5)`. 2. **元组** (`*`):使用元组可以将解包的所有元素一起赋值给一个变量。例如,`a, b, c = (1, 2, 3), (4, 5, 6, 7)` 等同于 `a, b, c = list(zip(*iter(a, b, c)))`. 3. **字典** (`**`):使用字典可以将解包的所有键值对作为一个字典返回。例如,`d1 = {'x': 1, 'y': 2}` 等同于 `d1 = dict(zip('x,y', (1, 2)))`. **注意**:在使用星号、元组或字典解包时,确保所有元素类型一致。如果解包的元素类型不同,可能会引发 `ValueError` 错误。 **一些示例**: ```python # 使用星号解包 a, b, c = 1, 2, 3, 4 # 使用元组解包 a, b, c = (1, 2, 3), (4, 5, 6, 7) # 使用字典解包 d1 = {'x': 1, 'y': 2} d2 = {'y': 2} d3 = {**d1,**d2} ``` 希望这些解释能帮助您理解 Python 中解包的用法。

正文

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)  显然报错在上面已经提到了。
    
    

与Python常见面试题008. 谈谈python中的解包相似的内容:

Python常见面试题008. 谈谈python中的解包

008. 谈谈python中的解包 这是个简单的知识点,但有的学员并不理解 unpacking解包 解,对应的是*或者**,也有自动解包之说 包对应的可迭代对象 自动解包 赋值的demo a,b = [1,2] print(a) # 1 print(b) # 2 将容器里面的元素逐个取出来分别赋值

Python常见面试题001-005,涉及深浅拷贝、MRO、函数可变参数、作用域、is和==的区别等

Python常见面试题001-005 参考资料 https://github.com/taizilongxu/interview_python https://github.com/hantmac/Python-Interview-Customs-Collection https://github.

Python常见面试题006 类方法、类实例方法、静态方法有何区别?

006. Python中类方法、类实例方法、静态方法有何区别? 全部放一个里面篇幅过大了,就拆分成1个个发布 示例代码 class Human: def __init__(self, name): self.name = name def say(self): print(f'我的名字是{self.

Python常见面试题007. 谈谈Python中__init__和__new__的区别

007. 谈谈Python中__init__和__new__的区别 python中关于dunder method双下方法,或magic method魔术方法的描述多在 https://docs.python.org/zh-cn/3.9/reference/datamodel.html#special

Python常见面试题011. 如何在Python中动态创建类?

011. 如何在Python中动态创建类? 说在前面 答案是type 你印象中的type是用来查看对象的类型的 li = [] type(li) # 得到list 对自定义的类是这样的 class Person: pass wuxianfeng = Person() type(wuxianfeng)

Python常见面试题009. 元组和列表有什么区别

009. 元组和列表有什么区别 这个题是简单的,但要拿满分或者说高分不容易 相同点 | 共性 | 说明 | | | | | 可以存放任意元素 | 一般都放同类型 | | 支持索引访问 | 甚至是负数 | | 支持切片操作 | | | 逗号分隔元素 | | | 都是有序集合(容器) | | | 可以随

Python常见面试题010. Python的int占多大内存?

010. Python的int占多大内存? 示例代码 import sys a = 0 print(a.__sizeof__()) # 24 print(sys.getsizeof(a)) # 24 所以答案是24?并不是!看下面 import sys b = 1 print(b.__sizeof_

Python常见面试题012. 可迭代对象和迭代器有啥区别?

012. 可迭代对象和迭代器有啥区别? 2者不是一回事(废话) 比如 from collections.abc import Iterable,Iterator print(isinstance([1, 2], Iterable)) # True 列表是可迭代对象 print(isinstance(

Python常见面试题013.请说出下面的代码返回结果是什么?

013.请说出下面的代码返回结果是什么? *的坑;简单题 参考:https://docs.python.org/zh-cn/3.9/library/stdtypes.html#typesseq 示例代码 lists = [[]] * 3 lists[0].append(1) 请问lists此时是什么

Python常见面试题014.请说出下面的代码返回结果是什么?

示例代码 def fun(a, b, c, d): nums = [] for num in range(a, b): nums.append(lambda: num ** c) return nums[d]() print(fun(1, 5, 2, 0)) print(fun(1, 5, 2, 1