python 知识点/面试题目总结(八股文)算法工程师必备

python 知识点/面试题目总结(八股文)算法工程师必备

  • 1. python的内存管理以及垃圾回收机制
  • 2. python中的pass有什么作用
  • 3. python的strip
  • 4. python多线程中的IO型操作
  • 5. python如何进行数据类型转换的
  • 6. python中的单下划线_和双下划线__
  • 7. python中的self、cls、@staticmethod、@classmethod
  • 8. python中的super函数
  • 9. python中的特殊方法(魔法函数)
  • 10. python中的**__new__()和__init__()和__call__()**
  • 11. UTF-8和GBK的区别
  • 12. python中的zip()函数

本文是本人面试过或者复习时遇到过的python知识点/面试题总结,将网上的各种博客或者自己的理解进行总结。

如果知识点有对应的博客的话,小节里会给上链接,链接下面是我学习后的总结,可能更方便理解、记忆或者面试的回答。
持续更新,欢迎收藏~

1. python的内存管理以及垃圾回收机制

https://weihuang.blog.csdn.net/article/details/124527828
refchain:在python中维护了一个名为refchain的环状双向链表,这个链表存储了python程序中创建的所有对象。
obrefcnt:每种类型的对象中都有一个名为ob_refcnt的引用计数器,它用于计数当前对象被引用的次数,变量被引用一次就+1,删除一次就-1。

循环引用问题:但是在python中对于那些可以有很多个元素组成的对象,比如list、dict、tuple等,可能会存在循环引用的问题,这会导致应该被销毁的对象,引用次数却不为0,从而无法销毁。为了解决这个问题,python进一步引入了标记清除机制,通过创建一个新的链表来扫描可能存在循环引用的对象,如果存在循环引用,则将引用计数-1。

分代回收机制:为了优化标记清除,进一步提出了分代回收机制,在refchain的基础上,再另外维护3个链表,这三个链表代表有着不同的扫描阈值,当达到这个阈值之后,将链表进行扫描,检查循环引用并销毁对象。

内存池和free_list数组频繁的内存申请和销毁是很消耗时间的,为了进一步提升效率,避免频繁的内存申请和销毁,python内部维护了一个内存池和一个free_list数组。池的做法是预先缓存一些常见的对象比如-5到256的整型对象,和ASCII字符表等。当程序中定义了一个小的整型对象时,不需要从内存中申请内存,直接从池中获取即可。free_list的做法是将程序本来删除的对象,没有直接销毁而是放在一个名为free_list的数组中。后面当程序中重新创建一个相同类型的对象时,不必新开辟空间而是直接从free_list中获取对象,重新进行初始化并放入到refchain中去。

2. python中的pass有什么作用

pass是空语句,表示什么事也不做,一般用于保持程序结构的完成性。
比如你定义一个函数,但是什么都不想做,如果不写函数体代码结构就会报错,这个时候加个pass即可。

3. python的strip

str.strip()用于一处字符串头尾制定的字符(默认为空格或者换行符)str.strip(“123”)收尾所有有1或者2或者3都删掉

4. python多线程中的IO型操作

https://zhuanlan.zhihu.com/p/392496297
IO型操作在操作系统中有:

  • 网络IO:本质上是socket读取
  • 磁盘IO:DMA操作读取

而这些操作分异步/同步(同步就是调用者等待被调用者返回信息才能继续执行),还分阻塞/非阻塞(线程挂起)。假设代码中所进行的IO操作都是同步阻塞型,那么CPU的利用率就很低,这个时候写多线程可以提高python代码的CPU利用率

5. python如何进行数据类型转换的

https://www.jb51.net/article/226784.htm
先列举python中的数据类型:string, int, float, complex(复数), bool, list, tuple, dict, set
可变数据类型:list, dict, set
不可变数据类型:str, int, float, complex, bool, tuple
容器类型数据:str, list, tuple, dict, set
非容器数据类型:int, float, complex, bool

在类型转换中,可以分为两类:① 自动类型转换;② 强制类型转换
自动类型转换
当两个不同类型的数据进行计算时,结果会向更高精读进行计算,精读等级:bool < int < float < complex
强制类型转换
公式:要转换的数据类型(待转换的数据类型),如int(val)

  • 其他转字符串:都可以原封不动的转
  • 其他转数字:容器类型只有字符串可以转,且必须为纯数字str.isdigit()
  • 其他转布尔
    • 容器转bool:容器为空返回false,容器有元素返回true
    • 数字转bool:0返回false,其他为true
  • 。。。

6. python中的单下划线_和双下划线__

https://blog.csdn.net/u014612521/article/details/122298168?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-122298168-blog-110624269.pc_relevant_multi_platform_whitelistv5&spm=1001.2101.3001.4242.1&utm_relevant_index=3
简单总结:

mode example 含义
单前导下划线 _var 命名约定,标识private变量
单末尾下划线 var_ 命名约定,若重复则加末尾下划线避免命名冲突
双前导下划线 __var 当在类中使用时,强制触发“名称修饰“,__var变成_ClassName__var,如果调用m_class.__var会报错
双前导和双末尾 var 表示python语言定义的特殊方法。自己不要这样命名
下下划线 _ 标识临时或者无意义的变量名称

7. python中的self、cls、@staticmethod、@classmethod

https://www.jb51.net/article/189135.htm
简单来说,self表示实例对象本身cls表示类本身
被staticmethod静态方法装饰器和classmethod类方法装饰器装饰的函数都可以用类名.方法名()来调用,区别是:

  • staticmethod不需要传入self或者cls,是完完全全的static函数(可以用C++中的static成员函数来理解)
  • classmethod需要传入cls(定义的时候)
  • staticmethod如果要调用类的成员变量或者方法,因为没有self(this),所以只能用类名.变量或者方法

8. python中的super函数

https://blog.csdn.net/wanzew/article/details/106993425
简单来说:super()方法和父类初始化没有实质性的关联,而是根据 __mro__ 属性(method resolution order,方法解析顺序),逐个进行方法的调用。比如super().init()根据__mro__列表顺序进行初始化

class B(A):
	def __init__(self):
    	super(B, self).__init__()
    	# super().__init__() 两个是等价的,默认参数就是该类和self

9. python中的特殊方法(魔法函数)

https://blog.csdn.net/heibuliuqiu_gk/article/details/113772368
https://blog.csdn.net/nightwatchmans/article/details/123744805
特殊方法的名字格式为__name__,万物皆对象,即使不是类也会默认的实现一些特殊方法,比如list(回忆list有__getitem__)

10. python中的**new()和__init__()和__call__()**

https://zhuanlan.zhihu.com/p/261579683

  • new()和__init__()都是python中的特殊方法(魔法函数),在我的理解里他们是相辅相成的。
  • new()用于控制生成一个新实例的过程。它是类级别的方法
  • init()用于控制一个新实例的初始化,给新实例添加一些属性、做一些额外的操作。它是实例级别的方法
  • new()至少有一个参数cls,代表要实例化的类
  • init()至少有一个参数self,代表要初始化的实例

先执行new,再执行init,如果new执行失败,则不会执行init,或者说new失败了程序会报错

在类有继承的情况下,通常会用到super()方法,new()和__init__()都是,python中所有类的最后的父类都是object,可以通过ClassName.__mro__查看。它会根据mro(method resolution order方法解析顺序)来进行new和init的调用

call()方法也是特殊方法,该方法类似于类中重载()运算符的功能,它可以允许实例对象可以像调用普通函数那样,以"instance_name()"的形式调用

在python中,凡是可以将()直接应用到自身并执行,都成为可调用对象,一个类写了__call__()它的实例就变成了可调用对象。任何普通的函数都是可调用对象,可以通过func_name.call()的方式达到和func_name()相同的效果。

11. UTF-8和GBK的区别

UTF-8和GBK都是一种编码标准。
GB即“国标”的首字母,即国际标准
GBK是在国家标准GB2312基础上扩展的一个标准,K就是“扩”的意思。专门用来解决中文编码的,不管中英文都是双字节的,包含了全部的中文字符。
UTF-8是一种国际化的编码方式,包括了世界上大部分的语种文字(简体、繁体、英文、日文、韩文等),也兼容ASCII码,包含了全世界所有国家需要用到的字符。

12. python中的zip()函数

https://blog.csdn.net/weixin_47906106/article/details/121702241
zip()函数是python内置函数之一,可以将多个序列(列表、元组、字典、字符串)压缩成一个zip对象,是一个可迭代对象,将每个序列对应位置的元素重新组合成一个一个新的元组。

a = [1,2,3]
b = (2,3,4,5)
for i in zip(a,b):
    print(i)
# (1, 2)
# (2, 3)
# (3, 4)

如果序列长度不一样,会选择最短的序列的长度进行限制。

你可能感兴趣的:(python,learning,面试,python,算法)