Python面试基础

1. with的用法?
答:with语句常常用于文件处理,异常处理
(1)为什么with语句能够使文件正确关闭
答:with既有自动管理文件对象,不需要调用close()
参考:https://blog.csdn.net/realDonaldTrump/article/details/77924573

2.简述函数式编程
答:函数本身也可以作为变量被返回、传递给高阶函数
除了匿名函数外,Python还使用fliter(),map(),reduce(),apply()函数来支持函数式编程。
参考:http://python.jobbole.com/84577/

3.什么是匿名函数,匿名函数有什么局限性
答:匿名函数,也就是lambda函数,通常用在函数体比较简单的函数上。匿名函数顾名思义就是函数没有名字,因此不用担心函数名冲突。不过Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。
参考:https://www.cnblogs.com/yangliguo/p/7921338.html
https://blog.csdn.net/ialexanderi/article/details/65035857

4. copy()与deepcopy()的区别
答:deepcopy:深拷贝,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
copy:浅拷贝,复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。
参考:https://www.cnblogs.com/hokky/p/8476698.html

5.函数装饰器有什么作用(常考)
答:函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

装饰器,其满足:

(1)不能修改被装饰的函数的源代码
(2)不能修改被装饰的函数的调用方式
(3)满足1、2的情况下给程序增添功能

参考:https://blog.csdn.net/u013471155/article/details/68960244

6. 简述Python的作用域以及Python搜索变量的顺序
答:(1)Python作用域简单说就是一个变量的命名空间。代码中变量被赋值的位置,就决定了哪些范围的对象可以访问这个变量,这个范围就是变量的作用域。在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域。
(2)Python的变量名解析机制也称为 LEGB 法则:
(2.1)什么是LEGB?
L:local 函数内部作用域
E:enclosing 函数内部与内嵌函数之间
G:global 全局作用域
B:build-in 内置作用域
(2.2)3.顺序是什么
跟名字一样,Python在函数里面的查找分为4种,称之为LEGB,也正是按照这种顺序来查找的。
首先,是local,先查找函数内部
然后,是enclosing,再查找函数内部与嵌入函数之间(是指在函数内部再次定义一个函数)
其次,是global,查找全局
最后,是build-in,内置作用域

参考:https://www.cnblogs.com/cenyu/archive/2016/05/14/5492674.html
https://blog.csdn.net/ialexanderi/article/details/65035857

7.新式类和旧式类的区别,如何确保使用的类是新式类
答:为了统一类(class)和类型(type),python在2.2版本引进来新式类。在2.1版本中,类和类型是不同的。

为了确保使用的是新式类,有以下方法:
放在类模块代码的最前面 metaclass = type
从内建类object直接或者间接地继承
在python3版本中,默认所有的类都是新式类。
参考:https://blog.csdn.net/zkq_1986/article/details/78957917
https://blog.csdn.net/ialexanderi/article/details/65035857

8.简述__new__和__init__的区别
答:(1)创建一个新实例时调用__new__,初始化一个实例时用__init__,这是它们最本质的区别。
(2)new方法会返回所构造的对象,init则不会.
(3)new函数必须以cls作为第一个参数,而init则以self作为其第一个参数.
参考:https://blog.csdn.net/ialexanderi/article/details/65035857
https://blog.csdn.net/liuweiyuxiang/article/details/81203166

9.Python垃圾回收机制(常考)
答:Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。
(1)引用计数
答:『引用计数法』的原理是:每个对象维护一个ob_ref字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放。它的缺点是需要额外的空间维护引用计数,这个问题是其次的,不过最主要的问题是它不能解决对象的“循环引用”,因此,也有很多语言比如Java并没有采用该算法做来垃圾的收集机制。
(2)标记-清除
答:『标记清除(Mark—Sweep)』算法是一种基于追踪回收(tracing GC)技术实现的垃圾回收算法。它分为两个阶段:第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。那么GC又是如何判断哪些是活动对象哪些是非活动对象的呢?

对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象。根对象就是全局变量、调用栈、寄存器。

(3)分代回收
答:分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象。
参考:http://python.jobbole.com/87843/
https://blog.csdn.net/ialexanderi/article/details/65035857

10.Python中的@property有什么作用?如何实现成员变量的只读属性?
答:@property装饰器就是负责把一个方法变成属性调用,通常用在属性的get方法和set方法,通过设置@property可以实现实例成员变量的直接访问,又保留了参数的检查。另外通过设置get方法而不定义set方法可以实现成员变量的只读属性。
参考:https://blog.csdn.net/u013205877/article/details/77804137
https://blog.csdn.net/ialexanderi/article/details/65035857

**11.*args and kwargs
答:*args代表位置参数,它会接收任意多个参数并把这些参数作为元组传递给函数。**kwargs代表的关键字参数,允许你使用没有事先定义的参数名,另外,位置参数一定要放在关键字参数的前面。
参考:https://blog.csdn.net/qq_37816453/article/details/79929675
https://blog.csdn.net/ialexanderi/article/details/65035857

12.有用过with statement吗?它的好处是什么?具体如何实现?
答:
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

猜你喜欢

转载自blog.csdn.net/weixin_42631192/article/details/88385876
今日推荐