为了账号安全,请及时绑定邮箱和手机立即绑定
慕课专栏

目录

索引目录

高薪之路--Python 面试题精选集

原价 ¥ 68.00

立即订阅
03 什么是元组拆包?
更新时间:2020-02-17 19:23:47
耐心和恒心总会得到报酬的。

——爱因斯坦

这个问题考察的其实是面试人对于元组的具体使用方法的一个掌握程度。我们要知道元组并不单单只是一个不可变的列表而已。我们还需要掌握元组更深层次的使用方法,而且这道题也不只是单问你什么是元组拆包还会涉及到 * 和占位符 _ 的用法。

答案

这个拆包可不是穿越火线游戏里面的拆炸弹一样,摁一下 E 键就可以的。元组拆包其实是从元组中提取出不同端的信息,我们可以将这一操作理解为平行赋值。也就是说拆包会把一个可迭代对象中的元素一并赋值到对应变量中去。这样做可以让我们把注意力集中在我们所需要关注的元素上面。先来看下元组到底是怎么拆包的:

>>> tuple = ('beijing','2019','8.7')
>>> city,year,date = tuple
>>> city
'beijing'
>>> year
'2019'
>>> date
'8.7'

以上操作即为元组拆包。

Tips: 元组拆包可以应用到任何可迭代对象上,唯一的硬性要求是,被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致。

拆包时我们还可以用 * 来处理剩下的元素,在 python 里常用这种方法来代表不确定数量参数

a, b, *rest = range(5)
print(a) # 0
print(b) # 1
print(rest) # [2,3,4]

使用占位符 _ 去忽略不需要关注的元素,相当于一个占位符,抵消掉了我们不需要关注的元素。

x, _, y = (1, 2, 3)
print(x) # 1
print(y) # 3

同时使用 * 和占位符 _ 来看看:

x, *_, y = (1, 2, 3, 4, 5)
print(x) # 1
print(y) # 5

面试官追问:*args 和 **kwargs 的用法

当函数的参数不确定时候可以用 *args**kwargs*args 是用于接收多余的未命名参数,**kwargs 用于接收实参中的命名参数,其中 args 是一个元组类型,而 kwargs 是一个字典类型的数据。形参中的 *args 把传进来的数据放在了 args 这个元组中。把 **kwargs 传进来的数据放在了 kwargs 这个字典中。

*args 其实就是把元组中的数据进行拆包,也就是把元组中的数据拆成单个数据。

def print_everything(*args):
    for count, thing in enumerate(args):
    print( '{0}. {1}'.format(count, thing))
print_everything('apple', 'banana', 'cabbage')

# print_everything()函数调用结果为:
# 1. apple
# 2. banana
# 3. cabbage

**kwargs 就是把字典中的数据进行拆包,传进的命名数据可以从 kwargs 按键进行索引获得。

def table_things(**kwargs):
    for name, value in kwargs.items():
    print( '{0} = {1}'.format(name, value))
table_things(apple = 'fruit', cabbage = 'vegetable')

# table_things()函数调用结果为:
# cabbage = vegetable
# apple = fruit

如果同时使用 *args**kwargs 呢?

def func(required_arg, *args, **kwargs):
    # required_arg是一个常规参数
    print (required_arg)

    # args是一个元组
    if args:
        print (args)

    # kwargs是一个字典,里面的键值就是传进来的参数变量名
    if kwargs:
        print (kwargs)

我们来看看调用这个函数的结果:

>>> func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes at least 1 argument (0 given)

## 直接调用 func() 函数会报错:func()至少需要1个参数(给定0)

>>> func("required argument")
required argument

## 调用 func() 函数的时候给定了一个参数,所以只会打印一个参数。

>>> func("required argument", 1, 2, '3')
required argument
(1, 2, '3')

## **args 接受了剩余的参数并放到了元组中


>>> func("required argument", 1, 2, '3', keyword1=4, keyword2="foo")
required argument
(1, 2, '3')
{'keyword2': 'foo', 'keyword1': 4}

## **args接受了无 Key 值的参数并放到元组中,**kwargs 接收了有 key 值的参数并放到了字典中。

小结

1.1 和 1.2 这两节内容选取了两个初级问题,主要考察的是 Python 的一些基本的 python 数据类型和基本特性:

  1. 可变序列(列表)和不可变序列(元组,字符串);
  2. 对象引用;
  3. 不可变序列元组的特殊之处:拆包;
  4. 函数参数的一些特殊用法:argskwargs 的拆包。

这两个问题虽然都是很简单的问题,但是每个问题如果稍微变动下就可能会踩雷,所以从根本上去掌握语言特性和其相关知识点远比死记硬背各种具体解法要更加实用的多。毕竟,万变不离其宗嘛。

}
立即订阅 ¥ 68.00

你正在阅读课程试读内容,订阅后解锁课程全部内容

千学不如一看,千看不如一练

手机
阅读

扫一扫 手机阅读

高薪之路--Python 面试题精选集
立即订阅 ¥ 68.00

举报

0/150
提交
取消