Python 面试题

记一次Python面试被问到的题

1

a={1:2,2:3}
b=a
b.pop(1)
print(a)

问:a的输出是什么?

答:{2:3}

2

b=[[]]*2; b[0].append(1); print(b)
a=[]; b=[a]*2; b[0].append(1); print(b)
a=[]; b=[a, a]; b[0].append(1); print(b)
b=[[], []]; b[0].append(1); print(b)

问:这四个b​的输出是什么?

答:

[[1], [1]]
[[1], [1]]
[[1], [1]]
[[1], []]

3

a="123"; b=a; b=b[:-1]; 
print(a, b)

问:输出?

答:123 12

4

比较以下两段代码的执行效率和内存开销

res = 1
for num in [1,2,3,4]+[6,7,8,9]:
    res *= num
import itertools
res = 1
for num in itertools.chain([1,2,3,4], [6,7,8,9]):
    res *= num

https://docs.python.org/3/library/itertools.html

答:首先第一个代码需要将两个列表和并为一个列表,而第二段代码是直接遍历两个列表,其次itertools.chain返回的是一个生成器,所以第二个代码的执行效率高,内存开销小。

5

What is the difference between tuple() and list[]?loop over tuple and list,which one is more effective?

if var in ["xxx", "yyy"]:
if var in ("xxx", "yyy"):
if var in {"xxx", "yyy"}:

Which one above is more efficitive? Note: The value after ‘in’ is a constant.

时间复杂度:tuple O(?) list O(?) set O(?)

答:tuple是不可变对象,list是可变对象。由于tuple不可变,所以申请内存为连续定长内存,而list类似于一个链表。

所以在loop中,tuple is more effective.

if var in {"xxx", "yyy"}​ is more effective. 因为集合查询时间复杂度为O(1),tuple和list为O(N)

6

Python class中变量名和函数名前缀单下划线和双下划线(后缀没有下划线)分别是什么?For example,

class A:
def _method1(): pass // What's the meaning of _
def __method2(): pass // What's the meaning of __

What’s the difference among the concepts protected, public, and private?

答:变量前没有下划线的为public
变量前有单下划线为protected,这种变量只能在本类或者其子类中调用(如果你想在其他地方调用也可以,但是会有警告)
变量前有双下划线为private,这种变量只能在本类中调用(在其他地方调用会报错)

7

在用mongo等非关系型数据库的时候,我们不希望把脏数据、空数据存进数据库,造成后面的混乱。写一个函数(Python3),删除json dict里面的空数据,包括空dict,空list,空string,None。假设输入的Python dict从合法json读取, 即key必为string, value可以是number/string/list/dict。例如:

{"a": [1,0,"c", {"x":1}]} -> {"a": [1,0,"c", {"x":1}]}
{"a":[1,None]} -> {"a": [1]}
{"a": {"a":[None, "", {},{"x":None}]}} -> None

答:

def clean_json(data: (dict,list,int,float,str,None)):
# put your code here
if data is None or data == '' or data == dict() or data == []:
return None
if type(data) == list:
data1 = [item for item in data if clean_json(item) is not None] # 复制一份出来
if not data1:
return None
return data1
if type(data) == dict:
data1 = {k: clean_json(v) for k, v in data.items() if clean_json(v) is not None} # 复制一份出来
if not data1:
return None
return data1
return data

注意:不能直接对原数组or字典作删除操作,会报错!

例如

l = [1,2,3]
for i in l:
if l[i] == 2:
del l[i] # do not do this

文章作者: Met Guo
文章链接: https://guoyujian.github.io/2023/10/07/Python-%E9%9D%A2%E8%AF%95%E9%A2%98/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Gmet's Blog