一些遇到的东西
all(iterables)和any(iterables)
两个内建函数
- 本质上讲,any()实现了或(OR)运算,而all()实现了与(AND)运算。
- 对于
any(iterables)
,如果可迭代对象iterables中任意存在每一个元素为True则返回True。特例:若可迭代对象为空,比如空列表[],则返回False。 - 对于
all(iterables)
,如果可迭代对象iterables中所有元素都为True则返回True。特例:若可迭代对象为空,比如空列表[],则返回True。
f-string使用中如果出现无需转义的{xxxx}字符的解决办法
- 在{xxxx}字符串外再套一个{}来取消转义
assert语句 断言
assert
可以用来做一个condition的判断,如果为False则raise一个Error。assert condition [,ErrorMessage]
用法就是如果condition为True则正常pass;如果为False则raise一个AssertionError,且该错误的信息为ErrorMessage设置的信息In [3]: assert 1==0,'1 not like 0' ---------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-3-54d3c5adefe2> in <module>() ----> 1 assert 1==0,'1 not like 0' AssertionError: 1 not like 0
Python的True和False
- 在Python中如果
''
,()
,[]
,{}
,None
,set()
,0
这些值都是False - 非空对象以及1都是True
Python 字符串去空
str.strip()
Python for 循环中的索引的作用域问题
- 本人一直认为for 中的临时索引变量,只在for中有效出了for循环就被删除了,实则不然
- python的for循环的索引变量能泄露到外围的函数范围
-
for循环将变量赋值到目标列表中。……当循环结束时,赋值列表中的变量不会被删除,但如果序列是空的,它们将不会被赋值给所有的循环。
for i in range(3):
pass
print(i)
>>>2
os.getpid()
获取当前进程的id,os.getppid()
获取当前进程的父进程的id
random.random()
- 产生0-1范围内的随机实数
注意py文件的命名
- 一定不能与某些模块的名称相同,会出很奇怪的错误
IO文件操作时路径问题
- 对文件进行操作时填写的相对路径并不是相对当前文件,而是相对于当前的工作路径而言
PyInstaller打包程序
- 个人推荐新建一个虚拟环境并安装Pyinstaller,使用新的环境去打包,可以有效控制体积,因为个人感觉Pyinstaller打包时会将当前Python环境中所有的库都打包,所以需要构建一个最低库需求的环境去打包以亚索exe文件的体积
Python del用法
- del用来删除一个对象的引用,其作用于一个变量,删除一个对象的引用
- python每次引用对象就会有一个计数器为该对象加1,如果引用为0了就会被python自动处理回收。
Python 魔术方法 (magic method)
- 构造与初始化
__new__
是用来创建类并返回这个类的实例__init__
只是将传入的参数来初始化该实例__del__
当一个对象的生命周期结束时,调用来删除该对象的引用,对象本身的删除交由python自己处理- 在创建一个对象时先执行
__new__
之后才执行__init__
来初始化对象,最后执行__del__
来删除对象的引用
- 可调用的对象
Python enumerate() 函数
- enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter'] >>> list(enumerate(seasons)) [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] >>> list(enumerate(seasons, start=1)) # 下标从 1 开始 [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
Python 编码
- 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理;由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,ASCII码是一个Byte的。
-
Unicode : Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode通常是2个Bytes
- Unicode包含了所有字符,但是如果纯英文的使用Unicode就很浪费,在存储和传输上就十分不划算。所以,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间
- 计算机内存中,统一使用Unicode编码
- Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言
- 由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
- 以Unicode表示的str通过encode()方法可以编码为指定的bytes
>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87' >>> '中文'.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
- 如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法
>>> b'ABC'.decode('ascii') 'ABC' >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') '中文'