常见python面试题

常见 python 面试题目整理

1. 列举 Python2 和 Python3 的区别?

1.Python3采用的是绝对路径的方式import,python2采用相对路径
2.Python2存在新式类和经典类的区别,Python3统一采用新式类(广度优先算法)
3.Python2中1个tab和8个space等价,在缩进中允许tab和space共存。在Python3中使用更
严格的缩进,tab和space共存会报错。
4.print语句被Python3废弃,统一使用print函数
5.不相等操作符‘<>’被Python3废弃,统一使用‘!=’
6.long长整型被Python3废弃,统一使用int
7.xrange被Python3废弃,统一使用range,Python3中range的机制也进行了修改。
8.Python3 中这些方法再不再返回 list 对象:dictionary 关联的 keys()、values()、
items(),zip(),map(),filter(),但是可以通过 list 强行转换
9.迭代器 iterator 的 next()函数被 Python3 废弃,统一使用 next(iterator)
10. raw_input 函数被 Python3 废弃,统一使用 input 函数
11. 字典变量的 has_key 函数被 Python 废弃,统一使用 in 关键词
12. file 函数被 Python3 废弃,统一使用 open 来处理文件,可以通过 io.IOBase 检查
文件类型
13. 异常 StandardError 被 Python3 废弃,统一使用 Exception
14. python2中‘/’,被除数为小数为真除,结果带小数,如果被除数为整数,则结果为取整
     Python3中‘/’为真除,如果整数部分没除完则带小数。'//'都为取整,'%'都为取余。
15.Python3中只有同一数据类型的对象才可以比较,Python2中任意俩个对象都可以比较。
16.Python2和Python3中有的模块位置发生改变
17.windows环境中:Python2 无法安装 mysqlclient。Python3 无法安装 
MySQL-python、 flup、functools32、Gooey、Pywin32、 webencodings。

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

深浅拷贝用法来自copy模块,浅拷贝:copy.copy;深拷贝:copy.deepcopy
浅拷贝值仅仅拷贝数据集合的第一层数据,第一层的原数据实现真正拷贝,就算原数据第一层发生改变,浅拷贝里的
内容也不会发生改变。但里面嵌套层的数据没有拷贝,只是用一个指针指向原来的嵌套层,如果原嵌套层数据发生改变,
那么浅拷贝里的数据也会发生改变;
深拷贝是完全的拷贝,不管原数据如何改变,在多少层改变,都不会影响深拷贝里面的内容。

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

在函数传递参数时,我们有时候不知道要传递多少个参数,就用 *args,它会以元组方式传入函数
当我们不知道该传递多少关键字参数时,就用 **kwargs来收集关键字参数,它会以字典方式传入

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

在Python中,一边循环一边计算的机制,称为生成器:Generator。可以把列表生成式外的中括号改成小括号就变成了
生成器,或在函数里用yield关键字。生成器肯定是迭代器。如果想打印里面的元素可以(1)通过for循环, 依次计算
并生成每一个元素。(2)如果要一个一个打印出来,可以通过next()函数获得生成器的下一个返回值。
迭代是访问容器元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器肯定是可迭代对象。
通俗的讲能使用next()方法的就是迭代器,能用for循环的就是可迭代对象,可迭代对象不一定是迭代器,
可以用iter()方法转换为迭代器。
生成器 --(都是)—> 迭代器(next) ----(都是)—> <–(不一定是iter)---- 可迭代对象(for)
应用场景:
生成器:一般情况下我们不需要使用生成器,只有当我们因为性能限制才需要用到,比如我们使用python读取一个10g
的文件,如果一次性将10g的文件加载到内存处理的话(read方法),内存肯定会溢出;这里如果可以使用生成器把读写交叉
处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.

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

当程序执行时遇到了yield关键字,则停止往下执行,并返回之后的值,当再次运行时就在停的地方继续往下
执行直到结束。

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

装饰器是在不改变原有代码的基础上增加新的功能,遵循'开放封闭原则',有了装饰器,我们就可以抽离
出大量与函数功能本身无关的雷同代码并继续重用作用有:
    (1)引入日志 (2)函数执行时间统计 (3)执行函数钱预备处理 (4)执行函数后的清理功能 
    (5)权限校验等场景 (6)缓存

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

因为内存有限,所以直接读取会占用大量内存,为例避免这种尴尬,我们可以用readline或readlines方法,
每次读取一行或多行,直到读完。

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

在Python中,模块是搭建程序的一种方式。每一个Python代码文件都是一个模块,并可以引用其他的模块,
比如对象和属性。
包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。
通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件
和其它模块或子包。

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

垃圾回收机制由引用计数为主,标记清除和分代收集为辅组成。

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

面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分
析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。这是种
'一切皆对象'的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。
面向对象有三大特性:封装,继承,多态。
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合 的系统,
使系统更加灵活、更加易于维护。
缺点:性能比面向过程低

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

子类继承于父类,提升代码的复用程度。
(1)在继承中基类的构造(__ init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
(2)在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数
时并不需要带上self参数
(3)Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。

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

  super() 函数是用于调用父类(超类)的一个方法。
  super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果
  使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
  如果用父类名字调用父类的方法时,当父类名字发生改变,那么子类中就会涉及多处修改,显得累赘,
  用super()就可以解决这种问题。
  在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,
  是按照MRO(Method Resolution Order):方法解析顺序进行的。
  super其实不是调用父类,在多继承中就可以体现出来,它是调用mro顺序里面下一个类里面的函数。

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

在面向对象中,深度优先时指在子类在找父类的内容时会一直往上找,找不到了才会在父类的兄弟类例找,
以此类推。广度优先是指在找父类例的内容时,如果找不到就在父类的兄弟类例找,再找不到就回到父类的
父类里找,以此类推。

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

__init__ :构造器,当一个实例被创建的时候调用的初始化方法
__len__ :定义当被 len() 调用时的行为,返回元素的数量
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值