python数据类型相关面试题

3 数据类型相关

3.1 字典如何删除键和合并两个字典

难度指数: ★
重要指数: ★

这种题并不难,但也不简单,他考察的是你对python掌握的深度

3.1.1 字典删除键

你可以使用del 关键删除字典的键,也可以使用字典的pop方法

dic = {
    'name': 'lili',
    'age': 14,
    'tel': '123456'
}

del dic['age']
dic.pop('tel')
print(dic)

他们的区别是什么呢?
del 只是完成删除的动作,如果键不存在,会引发KeyError异常。

字典的pop方法要复杂一点点,pop方法会返回被删除键所对应的value

print(dic.pop('tel'))   # 123456

如果当被删除的键不存在时,是否引发KeyError异常,取决于如何使用该方法

print(dic.pop('phone', '98765'))   # 98765
print(dic.pop('phone'))            # KeyError异常

如果pop方法设置第二个参数,那么当键不存在时,则返回这个值,如果键不存在,也没有设置第二个参数,和del一样,会引发KeyError异常。

3.1.2 合并两个字典

最简单的办法是用update

dict_1 = {'name': 'lili', 'tel': '1234'}
dict_2 = {'age': 14, 'tel': '5678'}

dict_1.update(dict_2)
print(dict_1)

这种合并方法,是将dict_2里的key-value对整合到dict_1中,如果有键重复的情况,则value以dict_2中的value为最终结果,字典dict_1发生改变。

如果在合并的过程中,不希望这两个字典发生改变,那么可以使用下面的方法

dict_3 = {**dict_1, **dict_2}
print(dict_3)

利用解包,实现两个字典的合并,如果有键重复,以表达式中靠后的字典里的value为准,在上面的例子中,两个字典里都有tel,以dcit_2中tel所对应的value为最终结果

3.2 python实现列表去重的方法

难度指数: ★
重要指数: ★

这个题目考察的是对列表,集合,以及类型转换方法的运用

lst = [3, 1, 1, 4, 5, 4]
lst = list(set(lst))
print(lst)

set(lst) 返回一个集合,集合中不存在重复的元素,再使用list方法,将集合转换为列表。

3.3 a="hello"和b="你好"编码成bytes类型

难度指数: ★
重要指数: ★

这个题目考察的是字符串和bytes之间的转换

字符串转bytes类型使用encode方法,如果字符串包含中文,一定要加上encoding参数,并设置为utf-8

a = "hello"
b = "你好"

print(a.encode())
print(b.encode(encoding='utf-8'))

bytes类型转字符串,使用decode方法

str_value = "学习"
bytes_value = str_value.encode(encoding='utf-8')
print(bytes_value)

str_value = bytes_value.decode(encoding='utf-8')
print(str_value)

3.4 Python中的列表和元组有什么区别?

难度指数: ★★
重要指数: ★

列表是可变对象,元组是不可变对象,这已经是一个合格的答案,但还不够好,如果面试官问了这个问题,他想听到的,不止这些。

元组看上去和列表几乎相同,只是不能修改,那么它存在的意义是什么?

3.4.1 函数返回多个结果时,元组可以作为返回值

函数如果返回多个值,这些值最终将被包装成元组,而非列表。

def test():
    return 3, 2

res = test()
print(res, type(res))

函数返回多个值,res的类型是元组,这样设计,可以确保没人有可以对函数的返回值进行恶意修改,这是一种保护机制,必要时,你也可以将元组作为参数传入函数,以防止函数对这个参数进行修改。

3.4.2 元组作为函数的可变参数

def func(*args):
    print(args, type(args))

func(3, 4, 5)

定义一个支持可变参数的函数时,args的类型是元组,在函数内可以从args中依次取出传入的参数,那么同样的问题,为什么不是列表呢?还是从程序设计的角度出发,如果args被设计成列表,由于列表可以被修改,保不齐某个程序员在实现函数的时候修改了args,传入的参数被修改了,或是增加,或是减少,这样就会引发不可预知的错误。

但现在,python将其设计成元组,元组无法修改,你在函数内部无法修改传入的参数,这就保证了函数入参的安全性。

3.4.3 元组可以作为字典的key,可以存储到集合中

想要成为字典的key,或是存储到集合中,必须满足可hash这个条件,所有的可变对象,诸如列表,集合,字典都不能做key,但元组可以,在一些特定情境下,用元组做key,非常实用,实用场景,可以参考文章酷python---元组

3.5 表达式 bool('False') 的返回值是什么

难度指数: ★
重要指数: ★

这是一个非常容易回答错误的题目,给人的感觉是bool函数会将字符串False转换为bool值False, 似乎这样做更加合理,但真实的结果是True。

bool函数换换的规则非常简单,如果传入的对象等价于空,则返回False, 反之返回True。

如何理解对象等价于空呢?就是空列表,空字符串,空字节串,空集合,空元组,空字典,0, None, False,这些都等价于空,当他们作为表达式时,其结果都是False, bool函数对他们的转换结果都是False。

3.6 python是如何做类型转换

难度指数: ★
重要指数: ★

以下是常用的数据类型转换

函数 说明
int(x [,base ]) 将x转换为一个整数
long(x [,base ]) 将x转换为一个长整数(注意python3中没有long了,2里有)
float(x ) 将x转换到一个浮点数
complex(real [,imag ]) 创建一个复数
str(x ) 将对象 x 转换为字符串
repr(x ) 将对象 x 转换为表达式字符串
eval(str ) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s ) 将序列 s 转换为一个元组
list(s ) 将序列 s 转换为一个列表
chr(x ) 将一个整数转换为一个字符
unichr(x ) 将一个整数转换为Unicode字符
ord(x ) 将一个字符转换为它的整数值
hex(x ) 将一个整数转换为一个十六进制字符串
oct(x ) 将一个整数转换为一个八进制字符串

最常用的,是int, float, str, list, tuple, dict, set, bool 这8个,他们是最最基础的,因此,你至少需要回答出这8个数据类型转换的函数。

3.7 什么是负索引(反向索引)?

难度指数: ★
重要指数: ★

负索引,也称反向索引,注意和倒排索引区分开。

正向索引从左至右开始计数,从0开始递增;反向索引从右向左开始计数,从-1开始递减。

反向索引,可以简化一些操作,比如你现在想要获取列表中倒数第二个元素,如果使用正向索引,你需要这样操作

lst = [1, 2, 3, 4, 5]
print(lst[len(lst)-2])      # 4

为了获取倒数第二个元素,你不得不先计算列表的长度,然后计算出倒数第二个元素所在的索引,如果使用反向索引,事情就变得简单了

print(lst[-2])      # 4

3.8 python内建数据类型有哪些

难度指数: ★
重要指数: ★

这是妥妥的送分题,也是妥妥的送命题,如果这个题都答不出来,基本也就被pass了
内建数据类型包括

  1. int 整型
  2. float 浮点型
  3. bool 布尔类型
  4. list 列表
  5. tuple 元组
  6. set 集合
  7. dict 字典

除此以外,还有complex, 复数类型,不过几乎用不到

3.9 如何在字符串里表示出转义字符\n

难度指数: ★
重要指数: ★

\n 在字符串里是换行符

print("转义\n字符")

输出的结果是

转义
字符

如果想在字符串里表示\n, 输出结果为 转义\n字符 ,该如何处理呢?有两种方法,一种是用\再次进行转义,即用另一个\ 来转义\

print("转义\\n字符")

第二种方法是在字符串前面加r, 表示原始字符串

print(r"转义\n字符")

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案