python常见/经典面试题集锦/汇总/大全附答案之基础篇

1、什么是Python?使用Python有什么好处?#Python知识分享#重在理解

Python是一种动态解释型编程语言,包含对象,模块,线程,异常和自动内存管理。Python可用于Web应用程序开发,自动化,数学建模,大数据应用程序等领域。也经常被用作“胶水”代码。

Python的好处在于它简单易用,可移植,可扩展,内置数据结构,并且它是一个开源的。

动态语言:在运行时确定数据类型的语言变量类型在运行期是可变的;当声明变量或类似变量时,不需要声明变量的类型。

解释型:与C语言等语言不同,Python不需要在运行之前进行编译。

2、什么是PEP 8

PEP 8是一个编码风格约定,关于如何编写Python代码更具可读性。

3、Python是如何解释语言的?

Python 代码在运行前,会先将.py 文件编译生成.pyc字节码文件(中间代码,与平台无关,不管放在 Windows 还是 Linux 平台都可以执行),运行时将由虚拟机逐行把字节码翻译成机器语言给CPU执行。

介绍Cython、Pypy、Cpython、Numba各有什么缺点

Cython是让Python脚本支持C语言扩展的编译器,Cython能够将Python+C混合编码的.pyx脚本转换为C代码,主要用于优化Python脚本性能或Python调用C函数库。

Pypy最重要的一点就是Pypy集成了JIT(一种混合了解释器和编译器好处的技术,将源代码编译成了本地机器码),通过编译技术提升脚本解释器系统的速度。同时针对CPython的缺点进行了各方面的改良,性能得到很大的提升。Pypy的优点是对纯Python项目兼容性极好,几乎可以直接运行并直接获得性能提升;缺点是对很多C语言库支持性不好,Pypy社区有相关讨论。

Numba是一个库,使用LLVM编译技术来解释字节码,可以在运行时将Python代码编译为本地机器码,而不会强制大幅度的改变普通的Python代码。

通用性:Cython和Numba的兼容性都非常好,而Pypy对于部分库的支持较差(如Numpy,Scipy)。

速度:这三种方案的速度相差不大,通常来说Cython要快于Pypy,尤其是对于部分C扩展。Pypy要快于Numba,但针对于纯数值计算的工作,Numba甚至还要快于Cython。

易用性:易用性最好的无疑是Pypy,Pypy是Python的解释器,我们针对纯Python使用Pypy,除了Pypy不支持的部分库外,不需要进行任何改动。然后是Numba,Numba的基本使用方法就是给函数加一个装饰器,易用性也很高,最后是Cython,因为Cython中需要使用Python+C混合编码,如果需要移植,代价会很大。

CPython是用C语言实现的Python解释器,也是官方的并且是最广泛使用的Python解释器。

4、Python是如何进行内存管理的及调优手段

主要有三个方面

一、对象的引用计数机制

使用引用计数来保持追踪内存中的对象,所有对象都有引用计数。

二、垃圾回收机制

对象的引用计数归零时,它将被垃圾收集机制处理掉

三、内存池机制

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

垃圾回收机制:

通过引用计数进行垃圾回收(对象创建时+1,销毁时-1,计数0时解释器适当的时候回收);

通过 “标记-清除” (使用 gc.collect() 立即回收)解决容器对象可能产生的循环引用问题(引用计数0时一直不能回收);

调优手段:
1.手动垃圾回收
2.调高垃圾回收阈值
3.避免循环引用(手动解循环引用和使用弱引用)

5、当Python退出时,为什么不清除所有分配的内存?

1)当Python退出时,没有被解除分配或释放(有些对其他对象具有循环引用的Python模块或从全局名称空间引用的对象)

2)无法解除分配C库保留的那些内存部分。

3)退出时,由于拥有自己的高效清理机制,Python会尝试取消分配/销毁其他所有对象。

内存泄露是什么?如何避免?

内存泄露指应该被清理却没有被清理的内存一直占据着系统资源造成浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

避免:1.手动垃圾回收 2.调高垃圾回收阈值 3.避免循环引用(手动解循环引用和使用弱引用)

哪些操作会导致Python内存溢出,怎么处理?

内存溢出:内存不够。

内存中加载的数据量过于庞大,如一次从数据库取出过多数据;处理:采用多次查询,边查询边处理边清除

存在死循环或递归调用; 处理:清除或优化

存在因循环而重复产生的新对象实体; 处理:优化

存在使用定义对象后未清空的现象; 处理:手动清除

6、什么是Python decorators?

Python decorators(装饰器),作用是改变其他函数的运作方式(嵌入或修改代码),这可以使得代码更加简洁和强大。

python新式类和经典类的区别?

在Python 2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于“新式类”,都会获得所有“新式类”的特性;反之,即不由任意内置类型派生出的类,则称之为“经典类”。

“新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”。

7、list和tuple有什么区别?

列表是可变的而元组不是。元组可以被散列,例如作为词典的关键。元组比列表快。

8、Python中的字典是什么?

一种可变容器模型,且可存储任意类型对象。字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {}

d = {key1 : value1, key2 : value2 }

9、Dict和List理解是什么?

它们是语法结构,可以根据现有的iterable轻松创建Dictionary或List。

10、Python数组和列表的区别?

Python中的数组和列表具有相同的存储数据方式。但是,数组只能包含单个数据类型元素,而列表可以包含任何数据类型元素。

11、列出python中可变数据类型和不可变数据类型有哪些,并简述原理

可变类型(mutable):改变了变量的值后不会新建一个对象,变量引用的对象的地址也不会变化,有List、Sets、Dictionaries

不可变类型(immutable):改变了变量的值后, 新建一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址),有Strings、Tuples、Numbers、bool

12、在Py

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值