python面经

  1. Python2和python3的区别,共存
  2. Python装饰器
    修饰器(https://www.jianshu.com/p/ab702e4d4ba7)
    概念:本质上是一种函数,可以让其他函数不做任何修改的前提下增加额外的功能。装饰器的参数是函数,返回值也是函数,调用被装饰函数可以达到新增功能的效果
    用法:
    1) 单层装饰时。被装饰函数不存在内嵌函数时,简单处理;若被装饰的函数存在内嵌函数,不执行内嵌函数,但是若存在对装器进行调用时,会执行内嵌函数。|| 被装饰函数带有参数时,
    2) 和无参数时的区别是执行内嵌函数,并且最后需要执行带参数的被装饰函数。|| 被装饰的函数有返回值,不仅要执行带参数的被装饰的函数,还要返回被装饰的函数的返回值。||对带有参数的装饰器调用时,所有函数正常执行,全都输出。
    3) 层装饰时,由内往外做装饰,然后再按照引用由外往内执行内嵌函数,最后执行被装饰的函数。
    4) 类装饰器和函数装饰器差不多
    优势:应用于解决插入日志,性能测试,事务处理等。可以抽离出大量函数中与函数功能本身无关的雷同代码进行复用。
  3. Python列表和元组的区别,字符串的属性属于列表还是元组,详细介绍元组,:元组
  4. Python的深浅拷贝
    深拷贝和浅拷贝:(不可变对象【数值,字符串,元组】,可变对象【列表,字典,集合】)
  1. 数字和字符串的内存都指向同一个地址,深拷贝和浅拷贝无区别,
  2. 对于字典,元组,列表来讲,深拷贝和浅拷贝的的内存地址是不同的。浅拷贝只会拷贝第一层数据,深拷贝会将所有的数据重新创建。
  1. 垃圾回收机制: 引用计数,标记-清除【追踪回收技术实现】,分代回收
    详情:运用引用计数跟踪和回收垃圾,在引用计数的基础上,通过标记-清除解决容器对象可能产生的循环引用的问题,并通过分代回收以空间换取时间进一步提高垃圾回收的效率。
    1)引用计数阶段
    引用+1:对象被创建,对象被引用,对象被作为参数传到函数中,对象作为一个元素存储在容器中【比如变量作为列表的元素】
    引用-1:对象的别名被显示销毁,对象的引别名被赋予新的对象,对象离开他的作用域【局部变量】,元素从容器中删除或者容器被销毁
    引用计数的评价:优点【高效,实时性,对象有确定的生命周期,易于实现】,缺点【维护引用计数耗费资源,无法解决循环引用的问题】
    2)标记清除:标记阶段【GC把所有活动对象打上标记】,删除阶段【将非活动对象进行回收】
    应用场景:主要用于处理一些容器对象,字符串和数值对象不可能造成循环引用问题
    区别活动对象和非活动对象的方法:基于对象之间的引用关系构造有向图,从根对象出发,沿着有向边遍历,可达的对象标记为活动对象,不可达的对象即为非活动对象。其中,根对象是去全局变量,调用栈,寄存器。
  2. python的继承,面向对象的三个特性,python的多态
    面向对象的三个特性:封装【隐藏对象的属性和细节,仅对外提供公开的访问方式】,继承【单继承和多继承,多继承即多个父类,如果没有指定基类,python的类会默认继承object类,object是所有python类的基类。原则为避免抽象类的多继承,提倡接口的多继承】,多态
    python继承
    概念:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。两个类之间的关系应该是“属于”关系
    实现方式:实现继承【指使用基类的属性和方法而无需额外编码的能力】,接口继承【仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)】
    Python的多态
    多态含义:针对不同的对象,都实现了同一个接口【具有不同功能的函数可以使用相同的函数名,向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为】。即一个抽象类有多个子类,多态的概念依赖于继承
    实现多态的步骤:定义新的子类;重写父类对应的方法;使用子类方法直接处理,不调用父类
  3. flask和django有啥区别
    1) django有完善的ORM模型和模型引擎,适合企业级开发,开发文档比较完善;flask有各种第三方插件的支持,可拓展性强,适合小型网站开发。
    2) Django框架固定,但flask比较灵活,代码框架可以自己设定。
    3) Flask与关系型数据库的结合与使用与django相当,并且nosql数据库的配合远远由于django。
  4. python读文件
  1. read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。
  2. readlines() 自动将文件内容分析成一个行的列表,一般建议用这个可迭
  3. readline() 每次读一行但读到的是str对象,速度较readlines() 慢
    这三种方法都会把结尾的\n 读进来,因此要使用strip() 方法去掉末尾的换行符
  1. python的内存管理机制
    内存管理机制:引入计数【 查看对象的引用计数:sys.getrefcount()】,垃圾回收【记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数。当两者的差值高于某个阈值时,垃圾回收才会启动。Python将所有的对象分为0,1,2三代,新建对象都是0代对象,当某一代对象经历过垃圾回收,依然存活,就被归入下一代对象。】,内存池机制【Python中有分为大内存和小内存:(256K为界限分大小内存),大内存使用malloc进行分配,小内存使用内存池进行分配。内存池为金字塔形状,最上层为用户对对象的直接操作;1和2层为内存池,通过接口函数接口函数PyMem_Malloc实现;0层为使用malloc函数分配内存,free函数释放内存处理大内存申请;-1和-2为操作系统操作】
    调优手段:手动回收垃圾,调高垃圾回收阈值,避免循环引用(手动解引用或者使用若引用)
  2. python迭代器和生成器, yield
    1)可迭代对象包含迭代器。
    2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
    3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。
  3. Python中的lambda:匿名函数,与map函数结合实现对两个(单个)列表的每个元素操作【new_list = map(lambda a, b: a + b, li, sl)】,与reduce函数结合实现对列表的元素操作后累计【result = reduce(lambda a,b:a+b,li)】,与filter函数结合实现对列表的元素筛选出符合条件的序列【new_list = filter(lambda a:a>22,li)】
  4. If后面哪些类型的数据是false:None;False;数值中的零,包括0,0.0,0j(虚数);空序列,包括空字符串(”),空元组(()),空列表([]);空的字典{};自定义的对象的实例,该对象的__bool__方法返回False或者__len__方法返回0
  5. python self
    基本:非关键字,表示类的实例对象,由__new__创建后作为__init__的参数
    与cls对比:
    1) self表示一个具体的实例本身。如果用了staticmethod,那么就可以无视这个self,将这个方法当成一个普通的函数使用
    2) cls 表示这个类本身
    3) 类先调用__new__方法,返回该类的实例对象,这个实例对象就是__init__方法的第一个参数self,即self是__new__的返回值
  6. python魔术方法(带__)
  1. __del__方法:销毁对象时自动执行
  2. __call__方法:使类可以向函数一样被调用,对象后面加括号触发。
  3. repr__方法:找不到__str()方法时调用,改变对象的字符串显示
  4. new__方法:实例化时触发,返回实例对象,调用__init
  5. __str__方法:使用print(对象)和str(对象)的时候会触发
  1. Python的协程线程进程:
    综述:进程是资源分配的单位;线程是操作系统调度的单位;协程,又称微线程,纤程,协程的切换只是单纯的操作CPU的上下文,资源很小,效率高;进程切换需要的资源很最大,效率很低;一个程序至少有一个进程,一个进程至少有一个线程;线程执行开销小,但不利于资源的管理和保护;而进程正相反
    1) Python多进程通过mutiprocessing实现(跨平台),对于Linux,可以使用os.fork()创建多进程。
    2) Python多线程通过threading模块实现,使用GIL(全局解释器锁)锁解决数据完全问题(控制虚拟机上同一时刻只有一个线程运行)
    3) Python多协程使用gevent模块实现,当一个greenlet遇到IO操作时就自动切换到其他的greenlet。greenlet实现了协程,但是这个还的人工切换。
    多线程和多进程的区别:多线程比多进程的开销大;通过全局变量来实现线程间通信,通过管道,信号,报文队列,共享内存信号量,套接口实现进程之间的通信。
  2. Range和xrange的区别:python2同时拥有两种,其中,range会生成一个list对象,但xrange返回类似生成器的xrange对象,用法与range一致,但只在取值时占用内存空间;python3统一换成range,返回生成器
  3. Python跟其他语言的区别
    Java相比:Python比Java要简单.Python是函数为一等公民的语言,而Java是类为一等公民的语言.Python是弱类型语言,而Java是强类型语言.
    C相比:Python的类库齐全并且使用简洁,很少代码实现的功能用C可能要很复杂;Python的运行速度相较于C,绝对是很慢了.Python和CPython解释器都是C语言编写的
    Python的优缺点:优点【语言简洁,省略大括号和分号;调试方便,开发效率高(解释性语言);有丰富的第三方库】;缺点【执行速度不快,可以嵌入c解决;GIL全局解释器锁限制了多核下使用多线程,可以使用多进程代替】
  4. 常用的模块:jieba,nltk,matplotlib,目前再学习测试框架相关的库,用于我自己的算法代码中,比如unittest单元测试
  5. 做数据处理用了哪些包,数据处理一般怎么做的
    常用的数据包:numpy【数值计算】,scipy【科学计算】,pandas【数据清洗,整理,以numpy为基础】,matplotlib【数据的可视化,基于numpy】
    Pandas:处理各种类型的文件,比如csv,excel,html,xml,json,数据库等,主要用于重复值处理【利用DataFrame中的duplicated方法返回一个布尔型的Series,显示是否有重复行】,缺失值的处理【df.isnull()查看是否存在缺失值】
  6. Python反射:通过字符串的形式操作对象相关属性,比如获取属性(getattr),设置属性(setattr),检查是否存在属性(hasattr),删除属性(delattr)
    反射机制的应用场景:1)根据不同的输入串访问不同的函数;1)import(字符串参数)动态导入模块

你可能感兴趣的:(学python)