【算法工程师】Python面试问题总结

算法工程师的语言要求是一大一小,大的我选择的是java,但是我java学的并不好,emmm,难过。。。
所以就把python当作我最熟悉的语言,准备一点问题,防止他问到我的时候怪尴尬的,就比如去年京东就问我GC是怎么回事,两眼发懵。。。
以下鸣谢的文章都是面向Python开发的会涉及到一些Django和爬虫的,有兴趣可以看看,我的时间比较紧张,就放弃了。。。

鸣谢:
https://www.cnblogs.com/shunge/p/8120047.html
https://www.cnblogs.com/xuechaojun/archive/2018/12/13/10112001.html
https://blog.csdn.net/t8116189520/article/details/80165589


Python是如何进行内存管理的(重要)

  1. Python利用内存池机制用于管理小块内存的申请和释放;
  2. 当创建大量占用内存小的对象时,即频繁调用new/malloc,会导致大量内存碎片,致使效率降低,所以需要内存池机制。
  3. 内存池机制需要在内存中预先申请一定数量的、大小相同的内存块留作备用,当有新的内存需求时,先从内存池中,给这个需求分配内存,如果不够了,就在重新申请。

Python垃圾回收机制(重要)

https://www.cnblogs.com/George1994/p/7349871.html

python利用引用计数实现跟踪和回收垃圾,并在引用计数的基础上,使用“标记-删除”解决容器内部对象的循环引用问题,利用分代回收以空间换取时间进一步提高垃圾回收的效率。

  1. 引用计数
    当一个对象的引用被创建或者复制时,对象的引用计数+1;
    当一个对象的引用被销毁时,对象的引用计数+1;
    当对象的引用计数为0时,表明这个对象不会再被使用,将其内存释放掉。
  2. 标记-删除
    寻找根对象的集合来作为垃圾检测动作的起点,根对象的集合是全局变量的引用或者函数栈的引用,这些引用所指向的对象不可能被删除;从根对象出发,沿着根对象集合的每个引用,如果某个对象能够到达,就说明这个对象是可达的,可达对象是不会被删除的,这个过程就是垃圾检测阶段;垃圾检测结束之后,所有对象被分为可达和不可达,可达对象被保留,释放所有不可达对象的内存,这就是垃圾回收阶段。
  3. 分代回收
    将系统中所有内存快按其存活时间划分为多个集合,也就是“代”,python默认定义了三代对象集合,活得越久的对象越不可能是垃圾,应该减少对它的垃圾收集频率。
    如何衡量“活得越久”:这个对象经过的垃圾收集次数。

迭代器和列表的区别

  1. 迭代器生成,被迭代一遍之后,里面的元素就被取光了,如果想在用,还得重新生成;list可以反复遍历。
  2. 迭代器从集合的第一个元素来开始访问,直到访问完所有的元素,只能向前,不能后退;list可以从任意位置开始向前向后进行访问。

谈谈装饰器(重要)

  1. 本质:闭包函数;
  2. 作用:使其他函数在不修改代码的前提下增加额外功能;
  3. 返回值:函数对象;
  4. 优点:少写很多重复性代码,提高工作效率。

Python如何定义一个私有变量

https://www.cnblogs.com/lijunjiang2015/p/7802410.html

  1. _xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入 。
  2. __xx 双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)

为什么使用装饰器(重要)

http://python.jobbole.com/85393/

init.py文件的作用

  1. init.py可以使其所在文件夹变为一个模块;
  2. python中倒入模块时,实际上就是导入__init__.py。通常这个文件为空,但是我们也可以在它中导入我们需要的模块,而不用一个个导入;
  3. 全部导入。当使用from packageName import *时,import会将注册在包__init__.py文件中__all__列表中的所有子模块和子包导入到当前作用域来。

map,filter,reduce函数

  1. map
    map(function, iterable, ...): 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
  2. filter
    filter(function, iterable): 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
  3. reduce
    reduce(function, iterable[, initializer]): 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

迭代器和生成器(重要)

  1. 迭代器:
    1. 是Python最强大的功能之一,是访问集合元素的一种方式;
    2. 迭代器是一个可以记住遍历位置的对象;
    3. 迭代器从集合的第一个元素来开始访问,直到访问完所有的元素,只能向前,不能后退;
    4. 迭代器有两个方法:next()iter()
  2. 生成器:
    1. python中,使用了yield的函数,被称为生成器;
    2. 与普通函数不同,生成器返回的是一个迭代器对象,用于迭代;
    3. 在调用生成器运行过程中,每次遇到yield就暂停,并保存当前所有的运行信息,返回yield值,并在下一次执行next()时从当前位置继续执行;
    4. 调用一个生成器,返回迭代器对象。

Python如何实现单例模式?(重要)

https://www.cnblogs.com/huchong/p/8244279.html

python实现多线程

http://www.runoob.com/python3/python3-multithreading.html

Python多线程的限制?多进程中如何传递参数?

  1. Python多线程中有GIL(全局解释锁),意味着任何一个时间只能一个线程使用解释器;
  2. 多进程中共享数据,可以使用multiprocessing.Value 和multiprocessing.Array

Python中赋值,浅拷贝,深拷贝的区别

http://www.cnblogs.com/xueli/p/4952063.html

  1. 赋值:浅拷贝对象的引用,对象发生改变,被赋值的也会作出同样的改变;
  2. 浅拷贝(copy):没有拷贝子对象,所以原始数据发生改变,子对象也会改变;
  3. 深拷贝(deepcopy):包含对象中子对象的拷贝,原始数据发生改变不会造成深拷贝里任何子元素的改变。

解释继承

  1. 一个类继承自另外一个类,也可是说子类继承自父类;
  2. 作用:可以使我们重用代码,还有更方便的创建和维护代码;
  3. 单继承、多重继承、多级继承、分层继承、混合继承。

解释以下dir() 和 help()

dir(): 返回对象中的所有成员;
hepl: 返回帮助文档和参数说明。

退出python时是否会释放所有内存分配?

否。哪些具有对象循环引用全局命名空间引用的变量在python退出时,往往不会被释放。

Python的应用场景?遇到IO密集型和计算密集型任务该如何处理?

  1. 应用场景:运维、爬虫、数据分析、自然语言处理;
  2. IO密集型:使用多线程;计算密集型:使用Cpython编写代码。

python区分大小写吗?

区分。

解释以下python的闭包

如果在一个内部函数中,对外部作用域(而非全局作用域)中的变量进行引用,那么内部函数就是一个闭包。

如何提高Python的运行效率?

  1. 使用生成器;
  2. 关键代码使用外部功能包:CPython之类的;
  3. 循环优化:尽量避免在循环中访问变量的属性。

六个标准数据类型

  1. 不可变:number,string,tuple
  2. 可变:list,dict,set

Python如何定义一个函数(去年曾经问过我,恨!!!)

  1. def
  2. lambda(去年把这个忘了)

什么是lambda函数?它有什么好处?

详细介绍:https://www.cnblogs.com/lmh001/p/9790378.html

  1. 接收任意多个参数(>=0个),并且返回单个表达式值的匿名函数
  2. 很轻便,即用即删除,很适合需要完成一项功能,并且只在此处使用的功能。

介绍一下except的用法和作用

  1. 作用:捕获异常 - 执行try下的语句,如果引发异常,则执行过程会跳到except语句。
  2. 用法:
 try:
<语句>        #运行别的代码
except <名字><语句>        #如果在try部份引发了'name'异常
except <名字><数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

list和tuple的区别,如何实现二者的转换

  1. list是可变长数据结构,tuple是定长的(即一旦初始化不可改变);
  2. list->tuple : tuple(list)
    tuple->list : list(tuple)

三元表达式

python中是不需要?的,而是使用: [on true] if [expression]else [on false]

如何在一个function里面设置一个全局的变量?

在function开始的地方插入一个global声明

python程序中文输出问题怎么解决

  1. decode + encode

python 编码问题:Python中字符串是以unicode编码的,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

  1. 开头加上:
reload(sys)
sys.setdefaultencoding(‘utf8′)

Python中pass语句的作用是什么

空语句占位符,为了保持程序结构的完整性。

*arg 与 **kwarg的作用

  1. *arg会把多出来的位置参数转化为tuple
  2. **kwarg会把关键字参数转化为dict。

is和==的区别

python对象中包含三个基本要素:id、type、value,

  1. is比较的是id是否相同,同一性运算符;
  2. ==比较的是value是否相同。

如何用Python来进行查询和替换一个文本字符串

  1. 可以使用re模块中的sub()函数来进行查询和替换;
  2. 格式:sub(replacement, string[,count=0])
    (replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)

Python里面match()和search()的区别?

  1. re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配;
  2. re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。

用Python匹配HTML tag的时候,<.>和<.?>有什么区别?

贪婪匹配( <.> )和非贪婪匹配(<.?> )

Python里面如何生成随机数

  1. random模块
  2. 具体:
random.randint(a,b):返回随机整数x,a<=x<=b
random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数
random.random( ):返回01之间的浮点数
random.uniform(a,b):返回指定范围内的浮点数。

有没有一个工具可以帮助查找python的bug和进行静态的代码分析?

VS code 中Pylint包

单引号,双引号,三引号的区别

  1. 单引号和双引号没有区别;
  2. 三引号则可以直接换行,并且可以包含注释。

如何用Python删除一个文件?Python如何copy一个文件?

  1. os.remove(filename)
  2. shutil模块中的copyfile函数

你可能感兴趣的:(python基础知识,求职)