转载鸣谢: python面试题汇总(史上最全)_编程ID的博客-CSDN博客
转载鸣谢: Python常考基础面试题_python面试题_袁袁袁袁满的博客-CSDN博客
目录
1.什么是猴子补丁
2.列表和元素的不同之处
3.python的负索引?
4.随机打乱表中元素
5.python是否区分大小写
6.exec,nonlocal,print是python关键词吗?
7.print可以输出到文件吗?
8.python中istitle函数
9.阐述一下闭包
10.python中的幂运算怎么表达
11.python中的逻辑运算符
12.python中的成员运算符
13.python中如何实现多线程?
14.python继承关系
15.python2和3的继承不同点?
16.Python中的内存管理
17.详细描述一下python的垃圾回收机制
18.python退出时是否会释放所有的内存分配?
19.dir()函数都返回对象中的哪些成员/python的魔法函数?
20.简单聊一聊python的变量
21.嵌套函数和闭包函数有什么不同
1.什么是猴子补丁
在运行python代码时动态修改类和模块的元素,使其在源代码不变的情况下能够达到强加的输出效果
详情请参考:python的猴子补丁(Monkey Patching)_phoenix_wangxd的博客-CSDN博客
2.列表和元素的不同之处
列表可变,元祖不可变
详情请阅读:Python元组和列表的区别
3.python的负索引?
从右边开始查询的索引,常用语列表的切片
4.随机打乱表中元素
shuffle() 方法将序列的所有元素随机排序 , shuffle 洗牌的意思
import random
random.shuffle(lst)
5.python是否区分大小写
区分
6.exec,nonlocal,print是python关键词吗?
是的
nonlocal :非局部声明变量 详解请跳转:【python】nonlocal的详解_Zack1st_diu的博客-CSDN博客
exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。exec 返回值永远为 None。详情请跳转:Python3 exec 函数 | 菜鸟教程
7.print可以输出到文件吗?
可以:print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
默认是标准输出,可以修改到指定文件
8.python中istitle函数
Python istitle() 方法检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。
9.阐述一下闭包
闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。详情请见:什么是闭包,Python闭包(初学者必读)
10.python中的幂运算怎么表达
**
11.python中的逻辑运算符
and 、or、 not
12.python中的成员运算符
in 、 not in
13.python中如何实现多线程?
线程是轻量级的进程,多线程允许一次执行多个线程,
但是python有GIL(全局解释锁),确保一次只运行单个线程
GIL锁会在线程之间传递,会增加额外的执行开销。
与线程相关的概念包括不限于:
计算密集型程序、IO密集型程序、单核处理器、多核处理器、调度、进程、资源、全局变量,死锁,并行,并发、解释器、内存管理,同步,数据混乱
详情跳转:
python实现多线程_python多线程实现_youthlost的博客-CSDN博客
python全局解释器GIL锁(-死锁)
JAVA——死锁详解_java 死锁_一个小菜只因的博客-CSDN博客
哲学家就餐问题:所有的哲学家都只会在思考和进餐两种行为间交替。哲学家只有同时拿到左边和右边的叉子才能吃到面,而同一根叉子在同一时间只能被一个哲学家使用。每个哲学家吃完面后都需要把叉子放回桌面以供其他哲学家吃面。只要条件允许,哲学家可以拿起左边或者右边的叉子,但在没有同时拿到左右叉子时不能进食。
14.python继承关系
单继承:继承单个类,
多重继承:继承自多个基类
多级继承:基类继承自另一个基类
分层继承:多个子类继承自同一个基类
混合继承:两种或两种以上继承类型的组合
15.python2和3的继承不同点?
经典类和新式类
super是否直接使用
PEP8规范:新式类的跨环境,都需要加上object这个继承
可参考:
python2和python3中的继承的不同之处 - 爱码网
python2和python3的继承方式的不同,广度优先和深度有限_weixin_33704591的博客-CSDN博客
16.Python中的内存管理
私有堆内存空间来放置所有对象和数据结构,我们无法访问,只有解释器来管理它
可以通过一些工具控制内存分配,创建对象(变量、函数、对象)之后,cpython会在内存中为其分配地址,python有一个id()函数,他可以返回对象的身份,也就是内存地址,是一个唯一的整数表示。
在定义变量时,其名字和变量值都是需要存储的,分别对应内存的两块区域:堆区和栈区
定义变量:
1.变量名与变量值的的内存地址的关联关系存在于栈区
2.变量值存在于堆区,内存管理回收的则是堆区的内容
图片来源于:python的内存划分_python内存分配_佐杰的博客-CSDN博客
直接引用、间接引用、循环引用请参考:python的内存划分_python内存分配_佐杰的博客-CSDN博客
跟踪内存:tracemalloc工具是一个用于对python已申请内存块进行debug的工具
1.回溯对象内存分配的位置
2.按文件、按行统计python的内存块分配情况:内存块总大小,数量以及块平均大小
3.对比两个内存快照的差异,以便排查内存泄漏
关于tracemalloc请跳转:tracemalloc --- 跟踪内存分配 — Python 3.12.0a7 文档
详情跳转:
python的内存划分_python内存分配_佐杰的博客-CSDN博客
详解python的内存分配机制_python_脚本之家
tracemalloc --- 跟踪内存分配 — Python 3.12.0a7 文档
17.详细描述一下python的垃圾回收机制
对象的引用计数(需要考虑循环引用问题)、标记清除、隔代回收
引用计数获取测试:Python: 问题(1)--getrefcount在不同环境中的引用计数表现_千码君2016的博客-CSDN博客
1.堆内存:存放变量和内存地址
2.栈内存:存放值
3.内存溢出:当内存中存在大量的相互引用计数时,会占用大部分的内存,当新的变量申请时不会再开辟新的内存
4.GC效率:在垃圾回收时,python不会执行其他的任务,频繁的垃圾回收会大大降低python的工作效率,原因是GIL的存在,当GC运行时,会抢占python解释器,其他线程处于阻塞状态,会降低python的工作效率,几个小时运行一次就可以了
5.GC的启动:当运行python时,会记录分配对象和取消对象的次数,当两者的差值到达某个阈值(默认700)时,垃圾回收才会启动
6.GC的触发:主动调用gc.collect(),gc达到阈值自动触发,程序退出时(一次性全部退出)
7.标记清除:当程序可用的内存空间被耗尽时,就会停止整个程序,但后进行两项工作标记和清除
标记清除算法就是一种基于追踪回收技术引用的垃圾回收算法,它分为两个阶段标记和清除
标记:GC会把所有对象(活动且有引用的)打上标记
回收:把没有标记的对象(非活动对象)进行回收
8.分代回收:因为标记清除的效率不高,清除非活动对象前它必须顺序扫描整个内存,为了解决这个问题,引入了隔代回收,分代回收解决了python什么时候进行扫描的问题,将扫描任务分为三级降低扫描的工作量,提高效率
0代:0代中的对象个数达到700个(默认阈值),扫描一次
1代:0代扫描10次,则1代扫描1次
2代:1代扫描10次,则2代扫描1次
9.Python的内存池
python提供了对内存的垃圾回收机制,但是它将不用的内存放到内存池而不是返回给操作系统
对于python对象,python存在独立内存池的情况
字符串长度为0或者1,符合标识符的字符串(只包含字符数字下划线),字符串只在编译时进行驻留,而非运行时,【-5,256之间的整数数字】
10.优化内存管理
1.手动垃圾回收,先调用del a,再调用gc.collect()嵌套的循环引用删除不了
2.调高垃圾回收的阈值,gc.set_threshold(800,20,20)
3.避免循环引用
首先什么是循环引用?
ImportError: cannot import name 'A' from partially initialized module 'memory.A' (most likely due to a circular import)
详情参考:python 循环引用的解决方法_loveysuxin的博客-CSDN博客
以上出自:Python是如何进行内存管理的?(图文讲解)_python 内存管理_敲代码敲到头发茂密的博客-CSDN博客
18.python退出时是否会释放所有的内存分配?
具有对象循环引用或者全局命名空间引用的变量,退出时不会释放
不会释放C库保留的部分内容
19.dir()函数都返回对象中的哪些成员/python的魔法函数?
__annotations__ 了解请跳转:详解Python中函数和模块的特殊属性__annotations___dongfuguo的博客-CSDN博客
Python annotation特性解析___annotations___求知向道的博客-CSDN博客
__radd__了解请跳转:
Python中 __radd__ 等运算符的变更 - 简书
Python中的__radd__函数和return语句(__radd__ function in python and return statement)_电脑培训
__closure__请跳转:https://www.cnblogs.com/cc-world/p/14008323.html
参考:
Python中的魔法函数总结整理_51CTO博客_python魔法函数
python内置魔法方法 - 百度文库
20.简单聊一聊python的变量
变量类型:
python是一个动态类型的语言,也是强类型语言。使用变量之前不需要声明变量类型,直接赋值即可,变量的初始化类型取决于等号右侧表达式的值的类型。创建之后变量的类型也可以随时发生变化,但在任何时刻,每一个变量都有一个确定类型。
同理,在定义函数和类的方法时,也不需要声明形参类型,完全取决于实参类型
标注形参类型、标注返回值类型、在实际调用函数时,即使实参不符合形参的类型标注,一样能够正常传递
以上参考鸣谢:https://www.cnblogs.com/missarain/articles/16071053.html
变量赋值特殊形式:
a = b = c = "11111"
a, b, c = "aaa", "bbb", "ccc"
以上参考:详解python的变量_python变量_程序员秃秃的博客-CSDN博客
a,b = b,a
是不是很简洁?不得不想起那句:人生苦短,我用python
python中变量值交换的三种方法_python交换a和b的值_诗酒趁年华~的博客-CSDN博客
其余可参考: Python变量 - Python教程 - C语言网
21.嵌套函数和闭包函数有什么不同
闭包函数返回的是一个函数,且只能返回一个函数
也可跳转继续了解:理解Python闭包 - 知乎
嵌套函数:python-嵌套函数讲解_python 嵌套函数_愈努力俞幸运的博客-CSDN博客