Python基础面试题
2021-02-19 18:17
标签:递归 停止 error 阶段 设计模型 基于 列表生成式 编程 结构 is比较的是id,==比较的是值 可变不可变指的是内存中的值是否可以被改变。不可变类型指对象所在的内存块里面的值不可以被改变,有数字、字符串、元组;可变类型则是可以被改变的,有列表、字典。 如果想要保持他们原来的顺序用list类的sort方法: 还可以用遍历 print(1 False python中一切皆对象,函数名在内存中的空间,也是一个对象。 递归函数终止的条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身还是return,终止递归。 终止递归的条件: 1)判断递归的次数是否达到某一限定值 2)判断运算的结果是否达到某个范围,根据设计的目的来选择 获取对象object的属性或者方法,如果存在则打印出来,如果不存在,打印默认值,默认值可选。 给对象的属性赋值,若属性不存在,先创建再赋值 lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数 ? ? 设计模型:单例模式、工厂模式 面试的时候原理性的东西,非常重要 Python基础面试题 标签:递归 停止 error 阶段 设计模型 基于 列表生成式 编程 结构 原文地址:https://www.cnblogs.com/ghylpb/p/12684434.htmlpython基础
列举你了解的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和==的区别
现有字典 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))
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 和
1 的结果分别是什么, 为什么
print(1 True
```
filter、map、reduce的作用
# 答案
filter(func, iterable) : 通过判断函数fun,筛选符合条件的元素。
filter(lambda x: x>3, [1,2,3,4,5,6])
>>>
什么是闭包?
闭包函数(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)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。
当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包. 总结一下,创建一个闭包必须满足以下几点:
必须有一个内嵌函数
内嵌函数必须引用外部函数中的变量
外部函数的返回值必须是内嵌函数‘‘‘
为什么函数名字可以当参数使用?
递归函数停止的条件?
getattr(object, name[,default]) 函数:
注意:如果返回的是对象的方法,则打印结果是:方法的内存地址,如果需要运行这个方法,可以在后
面添加括号()。1. functiondemo = function_demo()
2. getattr(functiondemo, ‘name‘) #获取name属性,存在就打印出来--- demo
3. getattr(functiondemo, "run") #获取run方法,存在打印出 方法的内存地址---
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函数? 有什么好处?
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进程和线程