python相关知识点
1. enumerate用于将可迭代对象拆包成元组
比如list、dic、range
list = [0,1,2,3]
dic = {'a':1,'b':2,'c':3} for a in enumerate(list): print(a) # 输出为 (0,0) (1,1) (2,2) (3,3)
for a in enumerate(dic):
print(a)
# 输出为 (0,'a') (1,'c') (2,'f') 这就与键值无关了
2. is 表示两个对象之间地址是否相同,==表示两个对象里的数据是否相同
3. 赋值 = 浅拷贝 copy 深拷贝 deepcopy
- 赋值相当于把对象的地址赋给变量,没有生成新的对象 id不变
- 浅拷贝相当于对原对象打上新标签,仅拷贝对象本身,不会对对象中的子对象进行拷贝,浅拷贝没有生成新的对象 id改变
- 深拷贝是真正意义上的复制,会新开辟一块空间,生成新的对象 id改变
对于不可变类型,如元组、数值、字符串等,怎么拷贝id都不变,且修改原对象,拷贝的对象内容不改变,因为原对象修改后地址变了,但拷贝对象地址还是原先的
4. python的内存管理机制
python不需要像c、c++语言需要手动释放内存,会自动进行垃圾回收
这样的优点是不需要手动释放、不会出现内存泄漏、空指针等问题
缺点是垃圾回收机制是作为一个线程存在的,需要占用资源,且不具有实时性,什么时候调用是不确定的,需要垃圾回收线程获得CPU资源时再回收
python的垃圾回收机制以计数法为主,分代回收为辅
其中计数法就是对于一个对象,有一个计数器,建立时计数器+1,具体操作时对计数器进行+-,当计数器归0了就回收
5. python的 *args 和 **kwargs
*args 和 **kwargs是python中的可变参数,当参数不确定的时候,可以使用
*args (arguments)表示位置参数,是一个元组,可以表示任意多个参数 相当于把输入的多个位置参数打包成元组
*kwargs (keywords arguments)表示关键字参数,是一个字典,同时使用args和kwargs时,保证args在kwargs前 相当于把输入的多个关键词参数打包成字典
这里说一下* 和 ** 的作用,*可以把元组拆分,**可以把字典拆分
6. python平行赋值的原理
a,b = b,a
将等号左侧打包成元组,再赋给右边
7. python中pop的时间复杂度
pop()的时间复杂度是O(1)
pop(i)的时间复杂度是O(n)

9. python中的魔法函数
魔法函数是python中的一种高级语法,允许在类中自定义函数,并绑定到类的特殊方法中;python中以双下划线开头和结尾的函数为魔法函数。
魔法函数可以帮助类增强一些功能,这样在特定情况下可以被python直接调用,不需要直接调用。
魔法函数可以写到任意一个类中,与继承无关
常用的魔法函数:
(1)构造函数 __init__(self)
用于对象初始化,不能return,写了也没用
(2)字符串表示 __str__和__repr__
二者都是用于输出实例对象的,都可以使用print调用,其中__str__是面向用户的,__repr__是面向程序员的? 实际上不是print调用了__str__,而是print调用了str,str调用了__str__
当类中同时有__str__和__repr__时,print输出的是__str__中返回的
在命令行中,__repr__直接输出对象或print输出相同,都按类中定义的来,__str__直接输出对象输出的是类的地址,print输出的是类中定义的东西
(3)集合序列相关
__len__:通过len()函数调用,获取实例对象的长度
__getitem__: 让对象实现迭代功能,可以把他看作for i in range()
class aa(): def __init__(self, *arg): self.list = arg def __getitem__(self, index): img = cv2.imread(self.list[index]) return img
__contains__:通过in来调用,判断数据是否在类中
class aa(): def __init__(self, *arg): self.list = arg def __contains__(self, x): return x in self.list
__setitem__(self, key, value): 将键值对存进类中指定的地方 aa['s'] = 1
__deliten__(self, key):删除键值对 del调用
(4)可调用 __call__ 可以将类变成函数直接调用 即aa()直接调用__call__里的东西
10. python的异常处理
11. python抛出异常raise
在指定位置人为主动抛出异常,因为有些时候程序正常运行也有异常,就需要认为设置,通常与try一起用
python常见的异常:
- AttributeError : 当试图访问的对象属性不存在时引发的异常
- IndexError : 索引超出序列范围引发的异常
- KeyError : 字典中不存在该关键字时的异常
- NameError : 访问一个未声明变量时,引发的异常
- TypeEError : 不同类型数据之间的无效操作
- ZeroDivisionError : 除法中除数为0引发的异常
- ValueError : 传入无效的参数
12. 上下文管理器with
with .. as 是简化版的try finally
with语句中包含__enter__()和__exit__()两种方法
with后面的语句执行后,将进入__enter__,返回值被as后的值继承,with后面的代码块全部执行完或者出现错误时,进去__exit__
如在打开文件时,使用 f = open() 和 with open() as f,第一种方法需要自己关,f.close(),释放内存,而with as 可以帮你关
13. python的装饰器
函数里可以定义函数,函数也可以作为返回值
装饰器本质上是一个python的函数(其实就是闭包,可以访问其他函数的内部变量),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
使用装饰器的时候就在定义函数前 @装饰器的名称
当使用多个装饰器的时候,装饰器按先后顺序来,内外部 外外部 内内部 外内部
带参数的装饰器
类装饰器
类装饰器就是返回了一个具有函数功能的实例对象,类中必须实现__call__方法
参数会被传到__call__,再由__call__传给类内的其他函数
14. map的作用
map(function, iterable)
map函数会将指定的函数作用于指定的序列中的元素,并返回一个迭代器对象
可用的函数如 int、str等自带的,也可以自己定义,如
dic = {'a':1, 'b':2, 'c':3, 'd':4}
l1 = list( map( lambda x: x * x , dic.values()) )
print(l1)
>>> [1,4,9,16]
15. zip的作用
将可迭代的对象作为参数,将对象中的元素打包成一个个元组,然后返回对象(python2返回的是列表,python3返回的是对象,需要自己动手改成想要的格式)
如
list1 = [1,2,3,4] print(list(zip(list1))) >>> [(1,),(2,),(3,),(4,)] list1 = [1,2,3,4] list2 = [5,6,7,8] print(list(zip(list1,list2))) >>> [(1,5),(2,6),(3,7),(4,8)] print(dict(zip(list1,list2))) >>> {1:5,2:6,3:7,4:8}
16. 判断是否为指定类型
isinstance(object, type)
17. python中,所有异常类的父类是 BaseException
18. numpy.minimum的广播机制
当两个矩阵维度不一致的时候,np会自动将矩阵进行广播,但是需要矩阵a能广播到矩阵b
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人