Set是无序集合类型,注意在访问时无序,不要放在有序的应用当中,如机器分类标签记录。
continue, break只跳出一层循环
shutil.copy出现Permission denied。原因是没有dstPath只定位到文件夹而不是文件。
使用IDE开发注意,os.getcwd()是获取工作目录,与打开的方式有关。(如用vscode则是打开的文件夹,用cmd则是当前命令路径)。sys.path[0]是执行文件的文件绝对路径
两张二值图不能直接相减,要用cv2.subtract
图片拷贝使用用浅拷贝copy就可以了,深拷贝耗内存
判断对象是否为None,不能用==,要用is。
is和==的区别:
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同。
==是python标准操作符中的比较操作符,用来比较判断两个对象的value(值)是否相等
Range函数第一个下界参数是闭区间,第二个上界参数是开区间,注意要+1处理。
Import多层级路径要注意是以执行文件为当前路径。
流程控制语句还有return语句注意缩进的位置。
Set对象没有顺序,列表才有。记录label切记不要用set对象存储。
使用slices获取矩阵中的片段时注意如果超出了range范围会返回None。
print函数打印时出现OSError: raw write() returned invalid length 136 (should have been between 0 and 82)
总的来说,与win10系统、版本有关系(本人win10,版本 10.0.16299 版本 16299)
解决办法:
import win_unicode_console
win_unicode_console.enable()
使用相对路径时,以代码执行的当前文件为起始路径,可以防止发布给别人用时路径错误。
__new__和__init__的区别:
调用顺序:先__new__后__init__
__new__是类级别的方法,是个静态方法
__init__是对象级别的方法,用于设置对象属性的一些初始值,所以注意:每个重新获取的对象,都会调用该方法。例如很多加载工作就不要放在这里执行,否则每次获取对象都会重新加载。
在for循环里面对循环对象进行更改会容易导致出错,如:
for index, name in enumerate(name_list):
if name == ‘me’:
name_list.remove(index)
编码乱码问题,先区分bytes,str和unicode,
Python2有两种表示方式str和unicode,unicode encode成str,str decode成unicode。
Python3有两种表示字符串的方式str和bytes,str encode成bytes,bytes decode成str
Python3 中 bytes其实是字节串, str才是真正意义上的字符串。
Python3以前默认使用ASCII编码方式,Python3以后统一用Unicode编码方式。
Windows系统中默认使用GBK编码,open读写文件默认跟随Windows的默认编码,即GBK,控制台上显示UTF-8字符时不兼容会出现乱码。
当try块中发生异常,如果except块中的处理也出异常,except的异常会直接覆盖try中的异常。
Finally中不要使用return或break!!!因为当try块中发生异常,如果在except语句中找不到对应的异常处理,异常会被临时保存起来,当finally执行完毕后,临时保存的异常将会被再次抛出,但如果finally语句中产生了新的异常或者执行了return或break语句,那么临时保存的异常将会被丢失,从而导致异常屏蔽。而如果在try中return会被finally中的return覆盖。
任何形式的数值类型0、0L、0.0、0j,空序列和字典 都为空,但None不为空,是NoneType对象。(空和None)!=False但都为会被判为False。
Python2使用的__nonzero__在Python3中改为了__bool__。
字符串不可以修改赋值。
可变类型:列表、字典
不可变类型:数字、字符串、元组
对象的赋值都是进行对象引用(内存地址)传递
list2 = list1,list1改变时list2也会跟着改变,因为他们指向同一个地址。
列表切片操作相当于浅拷贝,如list2 = list1[:],相当于复制了一个新的内存地址。
浅拷贝复制了对象,但对象里面的元素还是用以前的引用。所以当做浅拷贝时,如果里面的可变元素发生了变化,引用是没有变化的,就会出现跟着变化。这时候深拷贝才能解决这个问题。
例如:list1=[1,2,3]用浅拷贝没有问题,里面没有可变元素;
list1=[1,2,[3,4]]要用深拷贝,因为里面的[3,4]是一个可变元素。
函数传参既不是传值也不是传引用,而是传对象。
++i不等于i+=1。++i其实是+(+i),意味着取两次正号,正正得正,结果没变还是i。