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方法用法和上面一样,只是从字符串的末尾开始查找
posted @ 2018-04-12 15:19  JasonJi  阅读(405)  评论(0编辑  收藏  举报