python经典面试题
基础部分
1.将列表按照下列规则排序,补全代码
1.整数在前,负数在后 2.正数从小到大 3.负数从大到小 lst = [7,-8,5,4,0,-2,-5] 补全代码: sorted(lst, key=lambda x:____)
答案:
lst = [7,-8,5,4,0,-2,-5] lst = sorted(lst, key=lambda x:(int(x<0), abs(x))) print(lst)
解析:
sorted语法: sorted(iterable[, cmp[, key[, reverse]]]) 参数说明: iterable -- 可迭代对象。 cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。 key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。 reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。 lambda表达式语法: python 使用 lambda 来创建匿名函数。 lambda只是一个表达式,函数体比def简单很多。 lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。 lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。 语法 lambda函数的语法只包含一个语句,如下: lambda [arg1 [,arg2,.....argn]]:expression 如下实例: # 可写函数说明 sum = lambda arg1, arg2: arg1 + arg2; # 调用sum函数 print "相加后的值为 : ", sum( 10, 20 ) print "相加后的值为 : ", sum( 20, 20 ) 以上实例输出结果: 相加后的值为 : 30 相加后的值为 : 40
2.将列表内的元素根据位数合并成字典
lst = [1,2,4,8,16,32,64,128,256,512,1024,32769,65536,4294967296] # 输出 { 1:[1,2,3,8], 2:[16,32,64], 3:[128,256,512], 4:[1024,], 5:[32769,65536], 10:[4294927692] }
答案:
# 方法一: li = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 32769, 65536, 4294967296] dic = {} for i in li: length = len(str(i)) dic.setdefault(length, []) dic[length].append(i) print(dic) # 方法二: dct2 = {} [dct2.setdefault(len(str(i)), []).append(i) for i in lst] print(dct2)
3.请尽量用简洁的方法将二维数组转换成一位数组
# 转换前 lst = [[1,2,3],[4,5,6],[7,8,9]] # 转换后 [1,2,3,4,5,6,7,8,9]
答案:
lst = [[1,2,3],[4,5,6],[7,8,9]] li = [i for j in lst for i in j ] print(li)
4.哈希冲突回避算法回避有哪几种,分别有什么特点?
答案:
1.开放地址法 2.链地址法 3.公共溢出区法 4.再哈希法
5.简述python的字符串驻留机制
答案:
''' 我们都知道python中的引用计数机制,相同对象引用其实都是内存中的同一个位置,这也叫作"python的字符串驻留机制" '''
6.以下代码输出的是什么?
ls = ["a","b","c","d","e"] print(ls[10:])
答案:
[]
7.如下代码段
import copy a = [1,2,3,[4,5],6] b = a c = copy.copy(a) d = copy.deepcopy(a) b.append(10) c[3].append(11) d[3].append(12) print(a,b,c,d)
答案:
''' [1, 2, 3, [4, 5, 11], 6, 10] [1, 2, 3, [4, 5, 11], 6, 10] [1, 2, 3, [4, 5, 11], 6] [1, 2, 3, [4, 5, 12], 6] '''
解析:
''' 直接赋值 对于list,set,dict,来说,直接赋值,其实是把内存地址交给变量,并不是赋值一份内容,所以,lst1的内存指向和lst2是一样的,lst1改变了,lst2也发生了改变 浅拷贝 浅拷贝,只会拷贝第一层,第二层的内容不会拷贝,所以称为浅拷贝 深拷贝 深度拷贝,把元素内部的元素完全进行拷贝复制,不会产生一个改变另一个跟着改变的问题 '''
8.有以下字典按照字典中的value进行排序
dic = {"a":26, "g":20, "e":20, "c":24, "d":23, "f":21, "b":25}
答案:
d = {"a":26, "g":20, "e":20, "c":24, "d":23, "f":21, "b":25} 方法一: sorted(d.items(),key = lambda x:x[1]) 方法二: import operator sorted(d.items(),key = operator.itemgetter(1))
9.给定两个list A, B,请用python找出,A,B中相同的元素,A,B中不同的元素
答案:见链接https://www.cnblogs.com/baijinshuo/p/10403448.html
10.下列叙述错误的是
A.栈是线性结构
B.队列是线性结构
C.线性列表是线性结构
D.二叉树是线性结构
答案:D
11.字典的item()和iteritems的区别是什么
答案:
''' 字典的items方法作用:是可以将字典中的所有项,以列表方式返回。因为字典是无序的,所以用items方法返回字典的所有项,也是没有顺序的。 字典的iteritems方法作用:与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器。 '''
12.阅读代码写出结果:
li = [2,4,5,6,7] for i in li: if i % 2 == 0: li.remove(i) print(li)
答案:
[4,5,7]
13.字典取值的三种方法
答案:
person = {'name':'xiaoming', 'age':18} # 第一种 若键不存在则会抛出KeyError异常 person['city'] # 第二种 不会抛出异常,不存在则返回None,也可以设置默认返回值 person.get('city',"上海") # 第三种 与第二种类似,区别在于setdefault方法会更新字典 person.setdefault('city', '上海')
14.请写一个函数,计算如下几个字母代表的数字
AB-CD=EF
EF-GH=PPP
答案 :
def fun(): li = [111,222,] for AB in range(10,100): for CD in range(10,100): for GH in range(10,100): PPP = AB-CD+GH if PPP in li and (AB-CD)>=10: yield [AB,CD,AB-CD,GH,PPP] for item in fun(): new_item = map(str,item) s = "".join(new_item) length = len(s) if len(set(s)) == length-2: # 其中A,B,C,D,E,F,G,H,P不能相等,(去重之后的长度如果与原来的长度相等,则A,B,C,D,E,F,G,H,P是不相等的) print(item)
解析:
AB-CD=EF EF+GH=PPP 可以换算为:AB-CD+GH=PPP
未完......