常见python面试题目整理(持续更新)

1.列举 Python2和Python3的区别?
1).输入输出不同
输出:
python2——print ‘对象’
python3(加括号)——print(‘对象’)
输入:
python2——输入整形:input();输入字符串类型:raw_input()
python3——只有一种方法输入字符串:input()
2).除法运算的区别
python2——运算符’/’:当被除数与除数都为整形时,取整(3/2=1);当为小数时,表示真除(3/2.0=1.5)
python3——运算符’/’:表示真除(3/2=1.5)
2. 简述Python的深浅拷贝以及应用场景?
浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层,若数据存储为列表中的列表,则不会拷贝成功第二层)(li.copy(), copy.copy())
在这里插入图片描述
深拷贝: 数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)(copy.deepcopy())

在这里插入图片描述

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

首先看一下代码实例

def  fun(*args,**kwargs):
     print ('args =', args)
     print ('kwargs = ', kwargs)
     print('*'*30)
fun(1,2,3,4)
fun(a=1, b=2, c=3)
fun(1,2,3,4, a=1, b=2, c=3)
fun('a', 1, None, a=1, b='2', c=3)

下面我们看一下输出结果:
在这里插入图片描述
总结:
从上面的例子我们可以看出,*args表示任何多个无名参数,它是一个tuple;kwargs表示关键字参数,它是一个 dict。若同时使用,*args必须在kwargs之前,python会根据输入的实参自动将参数组合为集合或者字典传入函数中。

4.简述 生成器、迭代器、可迭代对象 以及应用场景?
在Python中,一边循环一边计算的机制,称为生成器,创建生成器方法:第一种:列表生成式的改写,[]改成(), 第二种方法: yield关键字;
可直接作用于for循环的对象称可迭代对象;
可以被next()函数调用并不断返回下一个值的对象称为迭代器。(list、dict、str虽然是可迭代对象,却不是迭代器);
生成器总是迭代器,迭代器总是可迭代对象,可迭代对象不一定是迭代器。类如list,str等,但可以使用iter函数使之变为迭代器。

5.请说明yield关键字的工作机制。 (详见:Python高级特性(生成式与生成器)
下面我们用代码实例说明yield关键字的工作机制:

def fun():
    print('step1')
    while 1:
         obj = yield 'step2'
         print('obj:',obj)
         print('step3')
         obj1 = yield 'step4'
         print('obj1:',obj)
g=fun()

print(next(g))
print('-'*10)
print(next(g))
print('-'*20)
print(next(g))

#######运行结果######
step1
step2
----------
obj: None
step3
step4
--------------------
obj1: None
step2

我们逐步分析yield关键字函数是怎么运行的:
1.程序开始执行,因为fun()中含有yield关键字,所以fun并不会真正执行,而是得到一个生成器。
2.直到调用next方法,fun函数开始执行,第一个print(next(g))语句先执行的是fun中print(‘step1’),接着继续进入while循环,程序遇到yield关键字,返回一个step2,然后程序停止(等到再次调用next才会继续执行),所以第一个print(next(g))运行得到的结果是step1和step(运行结果前两行)。
3.程序继续执行print(’-’*10),运行结果输出10个‘-’。
4.程序再次执行下面的print(next(g)),这个时候fun函数从上一个next方法停止的地方(yield关键字)执行,也就是先执行obj赋值操作,此时是没有值赋给obj的,因为obj后面的参数在上一次执行的时候已经return出去了,所以此时obj的值为None,再接着执行print(‘step3’),再次遇到yield,返回’step4’,然后程序再次停止。在这期间程序输出obj: None,step3 ,step4
5.程序继续执行print(’-’*20),运行结果输出20个‘-’。
6.程序接着执行最后一个print(next(g)),fun函数从上一个next方法停止的地方执行,同样obj1的值为None,此时虽然已经执行到fun函数的最后一行,但由于函数中有while循环,所以程序继续执行while循环,再次遇到yiele ‘step2’,返回’step2’,程序停止。在这期间程序输出 obj1: None , step2
7.程序执行结束,直到调用下一个next方法。

6.请简单谈谈装饰器的作用和功能。
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的
前提下增加额外的功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,
比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。
7.Python中如何读取大数据的文件内容?
read(size)方法
8.Python中的模块和包是什么?
模块模块就是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块.
模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模块
我们通常说导入模块,就是导入封装好的python文件,例如:

import copy
import  time
import  itchat

就是从指定路径中寻找到“copy.py,time.py,itchat.py”这样的python文件,然后我们就可以使用这些文件中定义的函数。
包将有联系的模块组织在一起,有效避免模块名称冲突问题,让应用组织结构更加清晰。
官方文档中的例子:
在这里插入图片描述
9.python是如何进行内存管理的(python是如何实现垃圾回收机制 的)?
python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略。
1.引用计数
引用计数法的原理是每个对象维护一个ob_ref,用来记录当前对象被引用的次数,也就是来追踪到底有多少引用指向了这个对象。
当发生以下四种情况的时候,该对象的引用计数器+1:
1). 对象被创建,例如a=23
2). 对象被引用,例如b=a
3). 对象被作为参数,传入到一个函数中,例如func(a)
4). 对象作为一个元素,存储在容器中,例如list1=[a,a]
与上述情况相对应,当发生以下四种情况时,该对象的引用计数器-1:
1). 对象的别名被显式销毁,例如del a
2). 对象的别名被赋予新的对象,例如a=24
3). 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的 局部变量(全局变量不会)
4). 对象所在的容器被销毁,或从容器中删除对象
2.标记清除
如它的字面意思一样,GC 标记 - 清除算法由标记阶段和清除阶段构成。标记阶段是把所有活动对象都做上标记的阶段。清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。通过这两个阶段,就可以令不能利用的内存空间重新得到利用。
3.分代收集
分代垃圾回收(Generational GC)在对象中导入了“年龄”的概念,通过优先回收容易成为垃圾的对象,提高垃圾回收的效率。
1). 分代垃圾回收中把对象分类成几代,针对不同的代使用不同的 GC 算法,我们把刚生成的对象称为新生代对象,到达一定年龄的对象则称为老年代对象。
2). 新生代 GC 将存活了一定次数的新生代对象当作老年代对象来处理。我们把类似于这样的新生代对象上升为老年代对象的情况称为晋升(promotion)。
3). 老年代对象很难成为垃圾,所以我们对老年代对象减少执行 GC 的频率, 从而提高效率。
10.谈谈你对面向对象的理解?

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

12.面向对象中super的作用?
super() 函数是用于调用父类(超类)的一个方法。
13.面向对象深度优先和广度优先是什么, 并说明应用场景?
深度优先和广度优先说的是继承搜索的顺序
经典类多继承搜索顺序(深度优先算法):先深入继承树左侧查找,然后再返回,开始查找右侧。
新式类多继承搜索顺序(广度优先算法):先在水平方向查找,然后再向上查找。
例如:

class D:
	a = 'd'

class B(D):
	pass

class C(D):
	a = 'c'

class A(B, C):
	pass
obj = A()
print(obj.a)

此段程序在python2版本中运行时,因为是深度优先,运行结果为d
此段程序在python3版本中运行时,因为是广度优先,运行结果为c
14.请简述__init__和__len__这两个魔术方法的作用(待补充)

15.python内置数据list类型函数时间复杂度

在这里插入图片描述如图,切片的时间复杂度为O(k)

16.python2/3差异常见问题
1.print成为函数
2.python3不再由Unicode对象,默认str就是unicode
3.python3出号返回浮点数
4.python3改进
(1)类型注解(type hint)
(2)优化的super()方法方便调用父类函数
(3)高级解包操作。把1赋值给a,2赋值给b,其他的赋值给rest-----> a,b,*rest = range(10)
(4).一切返回迭代器 range,zip,map,dic.values
5.python3新增
(1)yield from 链接子生成器
(2)asyncio内置库,async/await原生携程支持异步编程
(3)新的内置库(例如enum,mock等)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值