Python基础面试题
Posted ghylpb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础面试题相关的知识,希望对你有一定的参考价值。
python基础
-
列举你了解的python2和python3的区别
print#py2不加括号 py2中1/2返回0 py3中返回0.5 py2默认ASCII编码 py3默认utf-8编码 py2中unicode类型表示字符串序列,str类型表示字节序列 py3中str类型表示字符串序列,byte类型表示字节序列 py2中函数用global关键字声明某个变量为全局变量,无法实现在嵌套函数中给一个变量声明为局部变量 py3新增了nonlocal关键字
-
如何实现字符串的反转?如:name="张全蛋"请反转为name= "蛋全张"
name = "张全蛋" name[::-1]
-
文件操作时:xreadlines和readlines的区别?
readlines()把文件的全部内容读到内存,并解析成一个list,当文件的体积很大时要占用很多内存 xreadlines()返回一个iter(file)迭代器,在python2.3之后已经不再推荐使用这种表示方法了,直接使用for循环迭代文件
-
is和==的区别
is比较的是id,==比较的是值
-
现有字典 dict={‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按字典中的 value 值进行排序?
dic={‘a‘:24,‘g‘:52,‘i‘:12,‘k‘:33} a = sorted(dic.items(),key= lambda x:x[1]) print(dict(a)) ‘‘‘ 语法 sorted 语法: sorted(iterable, cmp=None, key=None, reverse=False) 参数说明: iterable -- 可迭代对象。 cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。 key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。 reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。 返回值 返回重新排序的列表。 ‘‘‘
-
什么是可变类型、不可变类型
可变不可变指的是内存中的值是否可以被改变。不可变类型指对象所在的内存块里面的值不可以被改变,有数字、字符串、元组;可变类型则是可以被改变的,有列表、字典。
-
请按list1中元素的age由大到小排序
list1 = [{‘name‘:‘a‘,‘age‘:20},{‘name‘:‘b‘,‘age‘:30},{‘name‘:‘c‘,‘age‘:25}] sorted(list1,key=lambda x:x[‘age‘],reverse=True)
-
下面代码数据的结果是什么?
list = [‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘] print(list[10:]) ‘‘‘ 下面的代码将输出[],不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index 来获取某个列表的成员。例如,尝试获取list[10]和之后的成员,会导致IndexError。‘‘‘
-
写一个列表生成式,产生一个公差为11的等差数列
a = [i*11 for i in range(10) ]
print(a)
-
给定两个列表,怎么找出他们相同的元素和不同的元素?
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)
-
请写出一段Python代码实现删除一个list里面的重复元素?
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 = [] 3. for i in l1: 4. if not i in l2: 5. l2.append(i) 6. print(l2)
-
有一个list["This","is","a","Boy","!"],所有元素都是字符串,对他进行大小写 无关的排序
l1 = [‘This‘,‘is‘,‘a‘,‘Boy‘,‘!‘] print(sorted(l1))
-
列举字符串、列表、元组、字典每个常用的5个方法?
字符串:replace、strip、split、rsplit、upper、lower、join、reverse。。。 列表:append、pop、insert、remove、sort、count、index 元组:len、index、count、dir 字典:get、keys、items、pop、values、popitems、clear、update。。。
-
什么是反射?以及应用场景?
在绝大多数语言当中都有反射机制的存在,可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用反射
-
简述深拷贝浅拷贝
copy():浅拷贝指仅仅拷贝数据集合的第一层数据 deepcopy():深拷贝指拷贝数据集合的所有层
-
1 < (2 == 2)
和1 < 2 == 2
的结果分别是什么, 为什么
print(1 < (2 == 2)) --> False
print(1 < 2 == 2) --> True
```
-
filter、map、reduce的作用
# 答案 filter(func, iterable) : 通过判断函数fun,筛选符合条件的元素。 filter(lambda x: x>3, [1,2,3,4,5,6]) >>> <filter object at 0x0000000003813828> map(func, *iterable) : 将func用于每个iterable对象。 map(lambda a,b: a+b, map(lambda a,b: a+b, [1,2,3,4], [5,6,7]) >>> [6,8,10] reduce(): 函数会对参数序列中元素进行累积。 reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数 >>> 15
-
什么是闭包?
闭包函数(closure function)指的是定义在一个函数内部的函数,被外层函数包裹着,其特点是可以访问到外层函数中的名字,如inner函数就是一个闭包函数。 def outer(): num = 1 def inner(): print(num) # 内层函数中不存在num 但可以访问到外层的num return inner # 基于函数对象的概念我们可以将内层函数返回到外界使用,从而打破函数调用的层级限制,但无论在何处调用,作用域的嵌套关系都是以定义阶段为准的,所以外界得到的不仅仅是一个函数对象(inner),在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,都是访问自己外层包裹的作用域中的名字num func = outer() # func == inner func指向的是inner的内存地址,但是func本身确实一个全局变量,可以在任意位置调用func,但无论在何处调用func,都需要按照定义阶段作用域的嵌套关系去查找名字 num=1000 func() #输出结果:1
-
请实现一个装饰器,限制该函数被调用的频率,如10秒一次
import time def time_pay(func): def inner(*args,**kwargs): for line in range(10): print(line + 1) time.sleep(1) res = func(*args,**kwargs) return res return inner
-
解释生成器与函数的不同,并实现和简单使用generator
‘‘‘ 生成器和函数的主要区别在于函数return a value,生成器yield a value,同时标记或记忆point of the yield以便在下次调用时从标记点恢复执行,yield使函数转换成生成器,而生成器反过来返回迭代器。 ‘‘‘
-
给出下面代码片段的输出
def say_hi(func): def wrapper(*args, **kwargs): print("HI") ret = func(*args, **kwargs) print("BYE") return re return wrapper def say_yo(func): def wrapper(*args, **kwargs): print("YO") return func(*args, **kwargs) return wrapper @say_hi @say_yo def func(): print("ROCK & ROLL") func() # 答案 ‘‘‘ HI YO ROCK & ROLL BYE ‘‘‘
-
谈谈你对闭包的理解
‘‘‘闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。 当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包. 总结一下,创建一个闭包必须满足以下几点: 必须有一个内嵌函数 内嵌函数必须引用外部函数中的变量 外部函数的返回值必须是内嵌函数‘‘‘
-
为什么函数名字可以当参数使用?
python中一切皆对象,函数名在内存中的空间,也是一个对象。
-
递归函数停止的条件?
递归函数终止的条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身还是return,终止递归。
终止递归的条件:
1)判断递归的次数是否达到某一限定值
2)判断运算的结果是否达到某个范围,根据设计的目的来选择
-
getattr(object, name[,default]) 函数:
获取对象object的属性或者方法,如果存在则打印出来,如果不存在,打印默认值,默认值可选。
注意:如果返回的是对象的方法,则打印结果是:方法的内存地址,如果需要运行这个方法,可以在后
面添加括号()。1. functiondemo = function_demo() 2. getattr(functiondemo, ‘name‘) #获取name属性,存在就打印出来--- demo 3. getattr(functiondemo, "run") #获取run方法,存在打印出 方法的内存地址---<bound method function_demo.run of <__main__.function_demo object at 0x10244f320>> 4. getattr(functiondemo, "age") #获取不存在的属性,报错如下: 5. Traceback (most recent call last): 6. File "/Users/liuhuiling/Desktop/MT_code/OpAPIDemo/conf/OPCommUtil.py", line 39, in <module> 7. res = getattr(functiondemo, "age") 8. AttributeError: ‘function_demo‘ object has no attribute ‘age‘ 9. getattr(functiondemo, "age", 18) #获取不存在的属性,返回一个默认值
-
setattr(object,name,values)函数:
给对象的属性赋值,若属性不存在,先创建再赋值
1.class function_demo(object): 2. name = ‘demo‘ 3. def run(self): 4. return "hello function" 5.functiondemo = function_demo() 6.res = hasattr(functiondemo, ‘age‘) # 判断age属性是否存在,False 7.print(res) 8.setattr(functiondemo, ‘age‘, 18 ) #对age属性进行赋值,无返回值 9.res1 = hasattr(functiondemo, ‘age‘) #再次判断属性是否存在,True
-
综合使用:
1.class function_demo(object): 2. name = ‘demo‘ 3. def run(self): 4. return "hello function" 5.functiondemo = function_demo() 6.res = hasattr(functiondemo, ‘addr‘) # 先判断是否存在if res: 7. addr = getattr(functiondemo, ‘addr‘) 8. print(addr)else: 9. addr = getattr(functiondemo, ‘addr‘, setattr(functiondemo, ‘addr‘, ‘北京首都‘)) 10. #addr = getattr(functiondemo, ‘addr‘, ‘美国纽约‘) 11. print(addr)
-
什么是lambda函数? 有什么好处?
lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数
1、lambda 函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,
连名字都很随意的情况下;
2、匿名函数,一般用来给 filter, map 这样的函数式编程服务;
3、作为回调函数,传递给某些应用,比如消息处理 -
请简述标准库中functools.wraps的作用
# 答案 ‘‘‘ Python装饰器(decorator)在实现的时候,有一些细节需要被注意。例如,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变)。这样有时候会对程序造成一些不便,例如笔者想对flask框架中的一些函数添加自定义的decorator,添加后由于函数名和函数的doc发生了改变,对测试结果有一些影响。 所以,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。 ‘‘‘
-
说说python中装饰器、迭代器的用法;描述下dict的items()方法与iteritems()方法的不同;
# 答案 ‘‘‘ 装饰器是指对函数执行过程,做一些扩展,甚至可以更改本身函数的执行迭代器是指遵循迭代器协议的对象,这类对象在被for循环时,每次迭代生成下一个项,不用一开始就生成整个列表在python3中不存在iteritems,items方法返回可迭代对象在python2中items()返回[(key,value)]的列表对象,iteritems()返回迭代器对象,iteritems()循环时不可以增删dict的内容 ‘‘‘
?
?
设计模型:单例模式、工厂模式
面试的时候原理性的东西,非常重要
以上是关于Python基础面试题的主要内容,如果未能解决你的问题,请参考以下文章