python基础面试题02
26、请反转字符串“aStr”?
print("aStr"[::-1])
27、请按list1中元素的age由大到小排序
list1 = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}]
sorted(list1,key=lambda x:x['age'],reverse=True)
28、常用的字符串格式化哪几种?
'''
name = '张三'
1)占位符
s1 = "%s DSB 你好"%name
2)format
s2 = '{} DSB 你好'.format(name)
3)f-string(python3.6之后才有的特性)
s3 = f'{name} DSB 你好'
'''
29、简述字符串驻留机制
'''
对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副
本。长字符串不遵守驻留机制。
驻留适用范围: 由数字,字符和下划线(_)组成的python标识符以及整数[-5,256]。
'''
30、下面代码的输出结果将是什么?
list = ['a', 'b', 'c', 'd', 'e']
print(list[10:])
'''
下面的代码将输出[],不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index
来获取某个列表的成员。例如,尝试获取list[10]和之后的成员,会导致IndexError。
'''
31、写一个列表生成式,产生一个公差为11的等差数列
1.print([x*11 for x in range(10)])
32、给定两个列表,怎么找出他们相同的元素和不同的元素?
1. list1 = [1,2,3]
2. list2 = [3,4,5]
3. set1 = set(list1)
4. set2 = set(list2)
5. print(set1&set2)
6. print(set1^set2)
33、请写出一段Python代码实现删除一个list里面的重复元素?
比较容易记忆的是用内置的set:
1. l1 = ['b','c','d','b','c','a','a']
2. l2 = list(set(l1))
如果想要保持他们原来的排序:
用list类的sort方法:
1. l1 = ['b','c','d','b','c','a','a']
2. l2 = list(set(l1))
3. l2.sort(key=l1.index)
4. print(l2)
也可以这样写:
1. l1 = ['b','c','d','b','c','a','a']
2. l2 = sorted(set(l1),key=l1.index)
3. print(l2)
也可以用遍历:
1. l1 = ['b', 'c', 'd', 'b', 'c', 'a', 'a']
2. l2 = []
3. for i in l1:
4. if not i in l2:
5. l2.append(i)
6. print(l2)
34、下面这段代码的输出结果是什么?请解释?
1. def extendlist(val, list=[]):
2. list.append(val)
3. return list
4. list1 = extendlist(10)
5. list2 = extendlist(123, []
6. list3 = extendlist('a')
7. print("list1 = %s" %list1)
8. print("list2 = %s" %list2)
9. print("list3 = %s" %list3)
10. 输出结果:
11. list1 = [10, 'a']
12. list2 = [123]
13. list3 = [10, 'a']
新的默认列表只在函数被定义的那一刻创建一次。当extendList被没有指定特定参数list调用时,这组list的值
随后将被使用。这是因为带有默认参数的表达式在函数被定义的时候被计算,不是在调用的时候被计算。
35、将以下3 个函数按照执行效率高低排序
1. def f1(lIn):
2. l1 = sorted(lIn)
3. l2 = [i for i in l1 if i<0.5]
4. return [i*i for i in l2]
5. def f2(lIn):
6. l1 = [i for i in l1 if i<0.5]
7. l2 = sorted(l1)
8. return [i*i for i in l2]
9. def f3(lIn):
10. l1 = [i*i for i in lIn]
11. l2 = sorted(l1)
12. return [i for i in l1 if i<(0.5*0.5)]
按执行效率从高到低排列:f2、f1和f3。
要证明这个答案是正确的,你应该知道如何分析自己代码的性能。
Python中有一个很好的程序分析包,可以满足这个需求。
1. import random
2. import cProfile
3. lIn = [random.random() for i in range(100000)]
4. cProfile.run('f1(lIn)')
5. cProfile.run('f2(lIn)')
6. cProfile.run('f3(lIn)')
36、有一个list["This","is","a","Boy","!"],所有元素都是字符串,对他进行大小写 无关的排序
l1 = ['This','is','a','Boy','!']
print(sorted(l1))
37、列举字符串、列表、元组、字典每个常用的5个方法?
字符串:repleace,strip,split,reverse,upper,lower,join.....
列表:append,pop,insert,remove,sort,count,index.....
元组:index,count,len(),dir()
字典:get,keys,values,pop,popitems,clear,update,items.....
38、什么是反射?以及应用场景?
在绝大多数语言当中都有反射机制的存在, 可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python中一切皆对象,都可以使用反射
1)、反射机制是很多框架的基石。
2)、
39、简述Python的深浅拷贝?
copy():浅copy,浅拷贝指仅仅拷贝数据集合的第一层数据
deepcopy():深copy,深拷贝指拷贝数据集合的所有层
40、Python 垃圾回收机制?
垃圾回收机制是自动帮助我们管理内存,清理垃圾的一种工具
1)、引用计数
当一个对象的引用被创建或者复制时,对象的引用计数加1;
当一个对象的引用被销毁时,对象的引用计数减1;
当对象的引用计数减少为0时,就意味着对象已经没有被任何人使用了,可以将其所占用的内存释放了。
优点:
简单、直观
实时性,只要没有了引用就释放资源。
缺点:
维护引用计数需要消耗一定的资源
循环应用时,无法回收。也正是因为这个原因,才需要通过标记-清理和分代收集机制来辅助引用计数机制。
2)、标记-清除
“标记-清除”不改动真实的引用计数,而是将
集合中对象的引用计数复制一份副本,改动该对象引用的副本。对于副
本做任何的改动,都不会影响到对象生命走起的维护。
3)、分代回收
将系统中的所有内存块根据其存活时间划分为不同的集合,
每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。
也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。
那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,
如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。
41、获取 Python 解释器版本的方法是
import sys
print(sys.version)
42、Python 中, 哪个语句能直接显示的释放内存资源
import gc
gc.collect()
43、lambda表达式格式以及应用场景?
'''
匿名就是没有名字
def func(x,y,z=1):
return x+y+z
匿名
lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字
func=lambda x,y,z=1:x+y+z
func(1,2,3)
'''
44、*arg和**kwarg作用
*args用来接收溢出的位置参数,将接收的参数组织成元祖
**kwargs用来接收溢出的关键字参数,将接受的参数组织成字典
45、求结果
v = dict.fromkeys(['k1','k2'],[])
v['k1'].append(666)
print(v) #{'k1': [666], 'k2': [666]}
v['k1'] = 777
print(v)#{'k1': 777, 'k2': [666]}
#第一次字典的两个k指向的是同一块内存地址,所以k1的内存地址追加666,
k2的值也同样会是666,
而当给k1赋值时,改变了k1指向的内存地址,所以这个时候,k2不会随之发生变化
46、一行代码实现9*9乘法表
print("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y in range(1, x+1)])
# 递归
def f(i):
if i>=1:
f(i-1)
print(['%dx%d=%d'%(j,i,i*j) for j in range(1,i+1)])
if __name__=='__main__':
f(9)
47、比较 a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 c = [(1,),(2,),(3,) ] 的区别?
a与b两者值相等,而c中列表的每个元素是一个个的元祖形式
a,b元素均为数字,b中括号内没加逗号,所以仍然是数字
48、1 <(22)和 1 <22 的结果分别是什么, 为什么
print(1 < (2 == 2)) --> False
print(1 < 2 == 2) --> True
49、如何打乱一个排好序的 list 对象 alist
import random
random.shuffle(alist)
50、如何查找一个字符串中特定的字符?find 和 index 的差异?
1)、find()方法:查找子字符串,若找到返回从0开始的下标值,若找不到返回-1
2)、index()方法:在字符串里查找子串第一次出现的位置,类似字符串的find方法,不过比find方法更好的是,如果查找不到子串,会抛出异常,而不是返回-1
3)、rfind和rindex方法用法和上面一样,只是从字符串的末尾开始查找