本篇文章将对一些常见的python面试题目进行整理,并做简要的回答,可供参考,如果你有更好更全面的答案,那么请在评论区评论,一起交流学习^0^

1. 列举 Python2 和 Python3 的区别?

答:

默认编码不同:python2 采用ASCII码,python3 采用utf-8

input的区别:python2中有两个输入,一个是input(),等待用户输入表达式,然后返回结果;另一个是raw_input(),输入什么返回什么。python3中只有input替代了它们

print的区别:python2中print被视为语句,直接把要输出的内容放到print关键字后面即可。python3中print()视为一个函数,需要将输出的内容作为参数传给它

整数除法(/)的区别:python2中两个整数相除,得到的结果也会是一个整数,将会把小数部分去掉,比如输入3/2,将会得到1,而不是1.5;python3中则两整数相除,如果结果有小数的话将会默认返回一个浮点数,保留小数点后面的数字,比如3/2会返回1.5

字符串的类型:python2中字符串有两种类型:Unicode字符串和非Unicode字符串;python3中字符串中只有一种类型:Unicode字符串

int和long的区别:python2中将非浮点型分为int整型和long长整型,可以通过在数字的末尾附上一个L来定义长整型;而在python3中只有一种整数类型int

import导入模块的搜索路径不同:python2中import是采用相对路径方式进行搜索模块的;而Python3采用的是绝对路径的方式进行import的

对缩进要求不同:python2没有严格的缩进要求,而Python3使用更加严格的缩进

新式类和经典类的区别:python2中存在经典类和新式类的区别,而在python3中统一采用新式类

2. 简述 Python 的深浅拷贝以及应用场景?

答:

浅拷贝:对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值。(copy.copy())

公用一个值;

这两个变量的内存地址一样;

对其中一个变量的值改变,另外一个变量的值也会改变;

深拷贝:一个变量对另外一个变量的值拷贝。(copy.deepcopy())

两个变量的内存地址不同;

两个变量各有自己的值,且互不影响;

对其任意一个变量的值的改变不会影响另外一个

应用场景:深拷贝应用在需要对拷贝过来的变量进行修改,而不改变原被拷贝变量的情况

3. 能否解释一下 *args 和 **kwargs?

答:

当我们不知道向函数传递多少参数时,我们就使用*args,*args 用来将参数打包成tuple给函数体调用;

当我们不知道该传递多少关键字参数时,使用**kwargs来收集关键字参数,**kwargs 打包关键字参数成dict给函数体调用。

4. 简述 生成器、迭代器、可迭代对象 以及应用场景?

答:

可迭代对象就可以用for循环语句进行遍历的对象就是可迭代对象;

生成器写起来就像是正规的函数 ,只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置。

迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身,那么这个对象就是迭代器。

应用场景:比如我们使用python读取一 个10g的文件,如果一次性将10g的文件加载到内存处理的话(read方法),内存肯定会溢出;这里如果可以 使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间。

5. 请说明 yield 关键字的工作机制。

答:

如果函数里面有yield关键字, 这个函数的返回值是生成器。如果遇到yield, 函数停止执行, 当再次调用next方法时, 从停止的地方继续执行。默认next方法会把yield后面的值返回回来。

6. 请简单谈谈装饰器的作用和功能。

答:

装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。写代码要遵循 开放封闭 原则,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已实现的功能代码块 ,开放:对扩展开发

装饰器具体可以实现以下功能:

引入日志

函数执行时间统计

执行函数前预备处理

执行函数后清理功能

权限校验等场景

缓存

7. Python 中如何读取大数据的文件内容?

答:

使用python读取一 个大数据的文件时,如果一次性将特别大的数据文件加载到内存处理的话(read方法),内存肯定会溢出;这里可以 使用生成器把读写交叉处理进行,比如使用readline和readlines就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间。

8. Python 中的模块和包是什么?

答:

模块就是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块。模块是非常简单的Python文件,单个Python文件就是一个模块。

包就是将有联系的模块组织在一起的一个集和,有效避免模块名称冲突问题,让应用组织结构更加清晰。

9. python 是如何进行内存管理的(python 是如何实现垃圾回收机制的)?

答:

python的垃圾回收机制采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略。

10. 谈谈你对面向对象的理解?

答:

面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。面向对象编程可以将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程。

11. Python 面向对象中的继承有什么特点?

答:

Python同时支持单继承与多继承,当只有一个父类时为单继承,当存在多个父类时为多继承。并且子类会继承父类的所有的属性和方法,子类也可以覆盖父类同名的变量和方法。

12. 面向对象中 super 的作用?

答:

super用在子类中可以快速调用父类的方法,格式为: super(子类名称, self).父类的方法名()

13. 面向对象深度优先和广度优先是什么, 并说明应用场景?

答:

深度优先算法:它是经典类多继承搜索的顺序,先深入继承树左侧查找,然后再返回,开始查找右侧。

广度优先算法:它是新式类多继承搜索的顺序,先在水平方向查找,然后再向上查找。

14. 请简述__init__和__len__这两个魔术方法的作用

答:

构造方法__init__:当一个对象被创建后,会立即调用该构造方法,自动执行构造方法里面的内容。

构造方法__len__:该构造方法会返回元素的数量。