Python之旅(二)面试题总结

1.简述函数式编程                                                                                                                                                                              在函数式编程中,函数是基本单位,变量只是一个名称,而不是一个存储单元。除了匿名函数外,Python还使用fliter(),map(),reduce(),apply()函数来支持函数式编程。

2.Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)                                                                                            赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。                                                            浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}                                                                            深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}

3.Python是怎么管理内存的?                                                                                                                                                            Python的内存管理是由私有head空间管理的。所有的python对象和数据结构都在一个私有heap中。程序员没有访问该heap的权限,只有解释器才能对它进行操作。为python的heap空间分配内存是由python内存管理模块进行的,其核心API会提供一些访问该模块的方法拱程序员使用。Python有自带的垃圾回收机制,它回收并释放没有被使用的内存,让它们能够被其他程序使用。

4.Python的垃圾回收机制                                                                                                                                                          Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。
(1).引用计数
PyObject是每个对象必有的内容,其中ob_refcnt就是作为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少。引用计数为0时,该对象的生命就结合了。
优点:简单,实时性
缺点:维护引用计数消耗资源,循环引用
(2).标记-清除机制
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点,以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一边内存空间,把所有没有标记的对象释放。
(3).分代技术
分代回收的整体思想是:将系统中的所有内存根据其存活时间划分不同的集合,每个集合就成为一个“代”,垃圾收集频率随着代的存活时间的增大而减小,存活时间通常利用几次垃圾回收来度量。
python默认定义了三代对象集合,索引数越大,对象存活时间越长。
举例:
当某些内存块M经过了3次垃圾收集的清洗之后还存活时,我们就将内存块M划到一个集合A中去,而新分配的内存都划分到集合B中去。当垃圾收集开始工作时,大多数情况都只对集合B进行垃圾回收,而对集合A进行垃圾回收要隔相当长一段时间后才进行,这就使得垃圾收集机制需要处理的内存少了,效率自然就提高了。在这个过程中,集合B中的某些内存块由于存活时间长而会被转移到集合A中,当然,集合A中实际上也存在一些垃圾,这些垃圾的回收会因为这种分代的机制而被延迟。

5.什么是python装饰器?                                                                                                                                                            Python装饰器是python中特有变动,可以使修改函数变得更容易。
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,比较经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。
概括的讲,装饰器的作用就是为了已经存在的对象添加额外的功能。

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

7.数组和元组之间的区别是什么?                                                                                                                                                   数组内容是可以被修改的,而元组内容是只读的。另外,元组可以被哈希,比如作为字典的关键字。
数组在python中叫做列表。列表可以修改,如果元组中仅有一个元素,则要在元素后加上逗号。元组和列表的查询方式一样。元组只可读不可修改,如果程序中的数据不允许修改可用元组。Python直接使用tuple和list函数将列表和元祖类型转换。

8.字符串格式化:%和.format的区别?

字符串的format函数非常灵活,很强大,可以接受的参数不限个数,并且位置可以不按顺序,而且有较为强大的格式限定符(比如:填充,对齐,精度等)

9.__new__和__init__的区别?

  • __init__为初始化方法,__new__方法是真正的构造函数。
  • __new__是实例创建之前被调用,它的任务是创建并返回该实例,是静态方法
  • __init__是实例创建之后被调用的,然后设置对象属性的一些初始值。 

总结:__new__方法在__init__方法之前被调用,并且__new__方法的返回值将传递给__init__方法作为第一个参数,最后__init__给这个实例设置一些参数。

10.Python中单下划线和双下划线分别是什么?

  • __name__:一种约定,Python内部的名字,用来与用户自定义的名字区分开,防止冲突
  • _name:一种约定,用来指定变量私有
  • __name:解释器用_classname__name来代替这个名字用以区别和其他类相同的命名


 

猜你喜欢

转载自blog.csdn.net/qq_36086861/article/details/85555531
今日推荐