本文是本人面试过或者复习时遇到过的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中去。
pass
是空语句,表示什么事也不做,一般用于保持程序结构的完成性。
比如你定义一个函数,但是什么都不想做,如果不写函数体代码结构就会报错,这个时候加个pass即可。
str.strip()
用于一处字符串头尾制定的字符(默认为空格或者换行符)str.strip(“123”)收尾所有有1或者2或者3都删掉
https://zhuanlan.zhihu.com/p/392496297
IO型操作在操作系统中有:
网络IO
:本质上是socket读取磁盘IO
:DMA操作读取而这些操作分异步/同步(同步就是调用者等待被调用者返回信息才能继续执行),还分阻塞/非阻塞(线程挂起)。假设代码中所进行的IO操作都是同步阻塞型,那么CPU的利用率就很低,这个时候写多线程可以提高python代码的CPU利用率。
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()其他转布尔
:
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语言定义的特殊方法。自己不要这样命名 |
下下划线 | _ | 标识临时或者无意义的变量名称 |
https://www.jb51.net/article/189135.htm
简单来说,self
表示实例对象本身,cls
表示类本身
被staticmethod静态方法装饰器和classmethod类方法装饰器装饰的函数都可以用类名.方法名()来调用,区别是:
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
https://blog.csdn.net/heibuliuqiu_gk/article/details/113772368
https://blog.csdn.net/nightwatchmans/article/details/123744805
特殊方法的名字格式为__name__,万物皆对象,即使不是类也会默认的实现一些特殊方法,比如list(回忆list有__getitem__)
https://zhuanlan.zhihu.com/p/261579683
先执行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()相同的效果。
UTF-8和GBK都是一种编码标准。
GB即“国标”的首字母,即国际标准
GBK是在国家标准GB2312基础上扩展的一个标准,K就是“扩”的意思。专门用来解决中文编码的,不管中英文都是双字节的,包含了全部的中文字符。
UTF-8是一种国际化的编码方式,包括了世界上大部分的语种文字(简体、繁体、英文、日文、韩文等),也兼容ASCII码,包含了全世界所有国家需要用到的字符。
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)
如果序列长度不一样,会选择最短的序列的长度进行限制。