Python常见面试题

总结一下最近面试Python岗位遇到的面试题

1.列表和元组的区别和性能对比

1.元组和列表数据类似,都是线性表。唯一不同的是,元组赋值后所存储的数据不能被程序修改,可以将元组看作是只能读取数据不能修改数据的列表;
2.当元组只有一个元素时,需要在元素的后面加一个英文逗号分隔符,以防止与表达式中的小括号混淆;
3.性能

>>> l = [1, 2, 3]
>>> l.__sizeof__()
64
>>> tup = (1, 2, 3)
>>> tup.__sizeof__()
48

上面的例子中,元组和列表都放置了相同的元素,但是元素的存储空间却比列表要少16字节。这是因为列表是动态的,所以它需要存储指针,来指向对应的元素,对上例子中,因为存的是int型,所以这个值是8字节。
另外,由于列表是可变的,所以需要额外存储已经分配的长度大小(8字节),这样子才可以实时追踪列表空间的使用情况,当空间不足时,及时分配额外空间。
元组要比列表更加轻量级一些,所以总体上来说,元组的性能速度要略优于列表。

2.异常处理机制和异常类型

异常处理机制

(1) try…except…
最常用的异常捕捉,尝试执行try的语句,发生异常,则进入except
(2) try…except…finally
finally语句表示无论异常是否发生,finally中的语句都要执行。
(3) assert
assert语句先判断assert后面紧跟的语句是True还是False,如果是True则继续往下执行语句,如果是False则中断程序,调用默认的异常处理器,
同时输出assert False语句逗号后面的提示信息。
(4) with…as
使用类似文件的流对象时,使用完毕后要调用close方法关闭,很麻烦,这里with…as语句提供了一个非常方便的替代方法,with语句块完毕之后,会自动关闭文件

常用异常类型

Exception 常规错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
SyntaxError 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
TypeError 对类型无效的操作
UnicodeError Unicode 相关的错误

3.哪些常用的魔术方法

__new__(cls[, ...])
在一个对象实例化的时候所调用的第一个方法

__init__(self[, ...])
构造器,当一个实例被创建的时候调用的初始化方法

__del__(self)
析构器,当一个实例被销毁的时候调用的方法

__call__(self[, args...])
允许一个类的实例像函数一样被调用:x(a, b) 调用 x.__call__(a, b)

4.set()函数的用法

1.set() 函数创建一个无序不重复元素的集合,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等,返回新的集合对象
2.列表最简单的去重方法就是直接调用set函数,利用集合元素的唯一性,就可以做到去重。

5.python之禅

交互式解释器中输入 import this 就会显示 Tim Peters 的 The Zen of Python

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
>>>

翻译
Python之禅 by Tim Peters

优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)

不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)

当存在多种可能,不要尝试去猜测,而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )

做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)

如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)

命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值