Python常见面试题

1
2
3
4
5
6
7
列表推导式:
优化一下下面的程序
result = []
for x in range(10):
result.append(x ** 2)
print(result)
print([(x ** 2) for x in range(10)])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
深浅拷贝:
写出下面a,b,c,d四个变量的值
import copy
a = [1,2,3,4,['a','b']] # 原始对象
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append('c')
print('a的值是',a)
print('b的值是',b)
print('c的值是',c)
print('d的值是',d)
答案:
a的值是 [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b的值是 [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c的值是 [1, 2, 3, 4, ['a', 'b', 'c']]
d的值是 [1, 2, 3, 4, ['a', 'b']]
1
2
3
4
5
6
7
字符串特性:
a = 'abc'
print(a[1])
a[1]='a'
print(a[1])
答案:
'b'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
面向对象继承:
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
print(Parent.x,Child1.x, Child2.x)
Child1.x = 3
print(Parent.x,Child1.x, Child2.x)
Parent.x = 'a'
print(Parent.x,Child1.x, Child2.x)
答案: 1 1 1
1 3 1
a 3 a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
闭包和延迟绑定:
def count():
fs = []
for i in range(1, 4):
def f():
return i * i
fs.append(f)
return fs

for f in count():
print(f())

答案:
9
9
9
闭包函数,外函数 count() 再调用结束时会将在内部函数 f() 使用到的临时变量的最终结果值,也传给内部函数。所以此处的 i 都是 3 。
for f in count(): 遍历是因为 count() 函数的返回值是 内部函数本身 。
1
2
3
4
5
6
7
8
9
10
11
12
13
下面的代码会输入什么?
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)

f(2)
f(3,[3,2,1])
f(3)
答案:
[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
1
2
3
4
5
输出结果是什么?
lists = ['a','b','c','d','e']
print(lists[10:])
输出结果:
[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A0-A6的值是什么?
A0=dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))
A1=range(10)
A2=sorted([i for i in A l if i in A0])
A3=sorted([A0[s] for s in A0 ])
A4=[i for i in A l if i in A3]
A5={i:i*i for i in A1}
A6=[[i,i*i] for i in A1]

A0:{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
A1:range(0,10)
A2:[]
A3:[1,2,3,4,5]
A4:[1,2,3,4,5]
A5:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
A6:[[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
有一个列表,[1,2,3,4,5,6,5,6,7,7,8],请写出列表去重的三种方式

#利用集合,直接将列表转化为集合,自动去重后转回列表。有一个问题,转换为集合的同时,数据无序了。
li = [11,22,22,33,44,44]
set = set(li)
li = list(set)
print(li) #[33, 11, 44, 22]

# 第二种运用新建字典的方式,去除重复的键
list = [11,22,33,22,44,33]
dic = {}
list = dic.fromkeys(list).keys()#字典在创建新的字典时,有重复key则覆盖
print(list) #dict_keys([11, 22, 33, 44])

#第三种是用列表的推导
list = [11,22,33,22,44,33]
lis = [] #创建一个新列表
for i in list: #循环list里的每一个元素
if i not in lis: #判断元素是否存在新列表中,不存在则添加,存在则跳过,以此去重
lis.append(i)
print(lis) #[11, 22, 33, 44]
1
2
3
4
5
range 	  xrange     的区别
答案:
range :range会直接生成一个list对象
xrange:并不会直接生成一个list对象,会在每一个调用时返回其中的一个值。
在 python3 中,去除了 range 函数,将 xrange 函数更名为 range 函数
1
2
3
4
5
6
7
考察闭包的延迟绑定:
如下代码输出的是什么
def multipliers():
return [lambda x:i * x for i in range(4)]
print [m(2) for m in multipliers()]

结果 [6, 6, 6, 6]
1
2
3
4
5
6
7
8
如何用python生成一个指定长度的斐波那契数列?
def fib(n):
a,b = 0,1
for i in range(n):
a,b =b,a+b
print(a)
f = fib(10)
print(f)
1
2
3
4
var1 = "8"
var2 = "3"
var1 += var2,var1等于几?
答:var1="83"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
如下代码输出的是什么?
def extendList(val,list=[]):
list.append(val)
return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print("list1 = %s" % list1)
print("list2 = %s" % list2)
print("list3 = %s" % list3)
答案:
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']