python基础知识的重点面试题
1、解释型和编译型
"""
- 编译型(需要编译器,相当于用谷歌翻译):编译型语言执行速度快,不依赖语言环境运行,跨平台差,如C,C++执行速度快,调试麻烦
- 解释型(需要解释器,相当于同声传译):解释型跨平台好,一份代码,到处使用,缺点是执行速度慢,依赖解释器运行,如python,JAVA执行速度慢,调试方便
"""
2、python2和python3的区别(重点)
"""
1、python2有长整型long,python3没有长整型全为int
2、python3中的input全是str类型,而python2得声明你输入的类型
3、python2的str本质是8个bit的序列,python3本质是Unicode
4、python2的默认编码是ascll,python3默认编码是utf-8
5、python2中没有nonlocal,python3中新增了nonlocal使得非局部变量变得可能
"""
3、实现字符串的反转(重点)
"""
name='张全蛋'
name[::-1]
"""
4、文件操作时:xreadlines和readlines的区别?(重点)
"""
readlines()是把文件的全部内容读到内存,并解析成一个list,单文件的体积很大的时候,需占用很大的内存
xreadlines()则是直接返回一个iter迭代器,在python2.3之后就不推荐使用这种写法,直接for循环迭代文件对象
"""
5、is和==的区别?(重点)
"""
is比较的是id(id相同值一定相同)
==比较的是值(值相同id不一定相同)
"""
6、dict={'a':24, 'g':52, 'i':12, 'k':33},按字典中的value值进行排序(重点)
"""
sorted(dict.items(), key=lambda x:x[1])
"""
7、什么是可变,不可变类型?()
"""
可变不可变指的是内存中的值能否被改变
不可变类型指的是对象所在的内存中的值是不可以被改变的,有数字类型(int、float),字符串,元祖
可变类型主要有:列表,字典,集合
"""
8、请将list1中的元素按照age由大到小排序(重点)
"""
list1 = [{'name':'a','age':20}, {'name':'b','age':30}, {'name':'c','age':25}]
sorted(list1,key=lambda x:x['age'],reverse=True) # reverse默认是false
"""
9、下面代码的输出结果是什么?(重点)
"""
list = ['a', 'b', 'c', 'd', 'e']
print(list[10:]) # []
print(list[10]) # IndexError
'''
下面的代码将输出[],不会产生IndexError错误。
不像所期望的那样,尝试用超出成员的个数的index
来获取某个列表的成员。例如,尝试获取list[10]和之后的成员,会导致IndexError。
'''
"""
10、写一个列表生成式,产生一个公差为11的等差数列(重点)
"""
print([x*11 for x in range(10)])
"""
11、给定两个列表,找出相同的元素和不同的元素?
"""
1. list1 = [1,2,3]
2. list2 = [3,4,5]
3. set1 = set(list1)
4. set2 = set(list2)
5. print(set1&set2) # 或者 print(set1.intersection(set2)) 交集
6. print(set1^set2) # 或者 print(set1.difference(set2)) 差集
"""
12、请写一段python代码实现list去重(重点)
"""
l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
"""
如果还想要保持原来的排序
用list的sort方法
"""
l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
l2.sort(key=l1.index)
print(l2)
"""
13、下面的这段代码的输出结果是什么?请解释?(重点)
"""
def extendlist(val, list=[]):
list.append(val)
return list
list1 = extendlist(10)
list2 = extendlist(123, []
list3 = extendlist('a')
print("list1 = %s" %list1)
print("list2 = %s" %list2)
print("list3 = %s" %list3) # 其实用的还是第一次默认的那个列表
# 输出结果:
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']
"""
14、有一个list['This', 'is', 'a', 'Boy', '!'],所有的元素都是字符串,对他进行大小写无关的排序
"""
l1 = ['This','is','a','Boy','!']
print(sorted(l1))
"""
15、列举字符串,列表,元祖,字典每个常用的5个方法?
"""
字符串:strip, split, len, index, replace,join,upper,lower...
列表:append, pop,insert, extend, remove,sort,count...
元祖:index,count, len, dir,in,
字典:get,keys,values, pop, items,update,popitem,setdefault
"""
16、什么是反射?以及反射的应用场景?(重点)
"""
反射指的是可以通过字符串对对象的属性或方法进行操作
-hasattr:通过字符串判断对象的属性或方法是否存在
-getattr:通过字符串获取对象的属性或方法
-setattr:通过字符串设置对象的属性或方法
-delattr:通过字符串删除对象的属性或方法
应用场景:
反射在很多框架中都被大量使用,比如django的高级文件配置,以及flask的源码中
"""
17、python的深浅拷贝?(重点)
"""
copy():浅copy,浅拷贝指仅仅拷贝数据集合的第一层数据
deepcopy():深copy,深拷贝指拷贝数据集合的所有层
"""
18、python垃圾回收机制(GC)(重点)
"""
1)引用计数
当一个对象的引用被创建或者复制时,对象的引用计数加一
当一个对象的引用被销毁时,对象的引用计数减一
当对象的引用计数减少为0时,就意味着对象没有被任何人引用,就可以将所占用的内存释放了
优点:简单直观,实时性:没有引用就释放资源
缺点:循环引用时,无法回收,也正是因为这个原因才需要通过标记清除,分代回收来辅助引用计数
2)标记清除
标记清除是一种基于追踪回收技术实现的一种垃圾回收的算法,该算法分为两个阶段:第一阶段是标记阶段,GC会把所有的活动对象打上标记,第二个阶段:就是把那些没有别标记的非活动对象进行回收
活动对象:对象之间通过引用连在一起,构成一个有向的图,对象构成这个图的节点,引用关系构成这个图的边。从根节点出发,沿着有向边遍历对象,可达的对象称之为活动对象
非活动对象:对象之间通过引用连在一起,构成一个有向的图,对象构成这个图的节点,引用关系构成这个图的边。从根节点出发,沿着有向边遍历对象,不可达的对象称之为非活动对象
优点:解决循环引用
缺点:清除非活动对象前,必须先扫描整个内存,哪怕只剩下小部分的活动对象也要扫描所有的对象
3)分代回收
将系统中的所有内存根据其存活时间的不同划分为不同的集合
每一个集合就是一个“代”,垃圾的收集频率会随着代的存活时间而减少,活的时间越长的对象,就越不可能是垃圾
"""
19、*args和**kwargs
"""
*args是用来接收所有的溢出的位置参数,将接收的参数组织成元祖
**kwargs是用来接收所有的溢出的关键字参数,将接收的参数组织成字典
"""
20、enumerate的作用(重点)
"""
enumerate函数是将一个可迭代对象中的每一个元素,在每一个元素的前面给它增加一个索引值,将其组成一个索引序列,利用它就可以同时获取索引以及索引对应的值,这样做的目的就是为了便于操作
"""
21、列表推导式(重点)
"""
[i for i in range(10)] 列表推导式是用[]表示,得到的是一个新的列表
(i for i in range(10)) 生成器表达式使用()表示,得到的是一个生成器对象,可通过list 将其打印出来
"""
22、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
map: 映射
map(函数地址, 可迭代对象) ---> map对象
map会将可迭代对象中的每一个值进行修改,然后映射一个map对象中,
可以再将map对象转换成列表/元组。(以第一次要转的类型为主)
注意: 只能转一次。
reduce: 合并
reduce(函数地址, 可迭代对象, 初始值默认为0)
reduce(函数地址, 可迭代对象, 初始值)
filter: 过滤
filter(函数地址, 可迭代对象) --> filter 对象
"""
23、什么是闭包?(重点)
"""
闭包函数指的是定义在一个函数内部的函数,被外层函数包裹着,其特点是可以引用外层函数的名字,列如下面的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
"""
24、请写一个装饰器,限制该函数被调用的频率如10秒一次(重点)
"""
import time
def time_wrapper(func):
def inner(*args, **kwargs):
for line in range(10):
print(line+1)
time.sleep(1)
res = func(*args,**kwargs)
return res
return inner
@time_wrapper
def func1():
print('from func1...')
func1()
"""
25、生成器迭代器的区别(重要)
"""
生成器:但凡在函数内部调用了yield关键字,在调用函数的时候,函数体代码是不会执行的,会返回一个结果,该结果就是一个生成器,生成器的本质其实也是一个迭代器
迭代器:要想知道什么是迭代器以及迭代器对象,我们得先知道什么是可迭代对象;
可迭代对象:在python中内置有__iter__方法的都是可迭代对象
迭代器对象: 执行该方法会得到一个返回值,该返回值就是迭代器对象
有两个方法__next__,__iter__,所以说迭代器对象一定是可迭代对象,反过来不行
迭代器: 迭代取值的工具
装饰器:装饰器必须遵循开放封闭的原则
开放:对函数功能的添加是开放的
封闭:对函数功能的修改是封闭的
装饰器的作用:在不修改被装饰对象源代码以及调用方式的情况下,添加新的功能
"""
26、请把以下函数转化成python的lambda匿名函数
"""
def add(x,y):
return x+y
# 答:
print(lambda x,y: x+y)
"""
27、日志加装饰器(待考察)
"""
"""
28、谈谈你对闭包的理解
"""
闭包是一个函数式编程的一个重要的语法结构。当一个内嵌函数引用其外部的作用域的变量,我们就会得到一个闭包
创建闭包必须满足一下几点:
- 必须有一个内嵌函数
- 内嵌函数必须引用外部函数的变量
- 外部函数的返回值必须是内嵌函数
"""
29、python函数调用的时候参数传递到底是值传递还是引用传递
"""
函数的传递到底是值传递还是引用传递要分情况:
不可变的参数用值传递:像整数和字符串
可变参数是引用传递:像列表字典这些对象是引用传递的
"""
30、为什么函数名可以当做参数用?
"""
python一切皆对象,函数名是函数在内存中的空间,也是一个对象
"""
31、递归函数的停止条件
"""
递归的终止条件一般定义在递归函数的内部
1、判断递归的次数是否达到某一个限定值
2、判断运算的结果是否达到某个范围
"""
Only you can control your future
You're not alone. You still have family,peopel who care for you and want to save you.