any()和all()方法的区别
any():可迭代对象中有1个元素为真就返回True,全假或空的迭代对象就返回False。
找到第一个真值就停止迭代,全部遍历都没有真值则返回False
all():可迭代对象中所有元素都为真就返回True,有一个假值就返回False。
找到第一个假值就停止迭代,全部遍历都没有假值则返回True
any()和all()都具备短路特性。
# 遍历元素,碰到第一个真值则返回True,全部遍历都没有真值则返回False
In [35]: any([]) # 没有任何一个为真
Out[35]: False
# 遍历元素,碰到第一个假值则返回False,全部遍历都没有假值则返回True
In [36]: all([]) # 没有任何一个为假,空真
Out[36]: True
# ************************************* #
# 首先检查__bool__,为True或False
# 其次检查__len__是否为0,为0则为假值
# ************************************* #
False、None、数字0、空字符串""、空列表[]、空字典{}、空元组()、空集合set()都是假值,
Python读取文件的read, readline, readlines方法的使用
直接一次性读取文件中所有的字符串内容,如果文件是10G,则会占用10G内存来读取文件。
即文件指针从头到尾仅移动1次,把全部内容读取成完整字符串并返回,针对较大文件会占用比较大的内存空间。
文件指针每次仅移动一行,返回该行的字符串内容,可多次调用逐行读取,返回的字符串末尾会有换行符\n。
读取到文件末尾的时候会返回空字符串,可使用if not line来判断是否为空断言已读完文件,搭配while循环使用。
在处理大文件并进行逐行读取时,应使用readline()方法,
避免一次性将所有内容载入内存,提高程序性能和稳定性。
文件指针从头到尾仅移动1次,把每行内容切割并放进列表中返回,返回的每行字符串末尾会有换行符\n。
for line in f可直接迭代文件对象,不会一次性将所有行的内容加载到列表中,适合处理大文件场景。
Python中is和==比较符的区别是什么?
is比较变量的内存地址是不是同一个对象,底层调用id()进行对比。
适用于所有对象,常用于不可变类型(即int, str, tuple),还有None。
==比较变量的值,底层调用__eq__进行对比。
针对None的比较,一定要用is,若比较对象重写了__eq__方法,则可能会出现不符合预期的结果。
可变类型:值变,id不变(list, dict, set, 自定义的实例对象)。
不可变类型:值变,id变(int,float,bool,str,tuple,bytes,frozenset)。
Python会对部分字符串进行缓存优化(短字符串),指向同一个对象,因此对于短字符串使用is比较时会返回True。
In [10]: a = 'hello'
In [11]: id(a)
Out[11]: 2693636530864
In [12]: b = 'hello'
In [13]: id(b)
Out[13]: 2693636530864
In [15]: id(b)
Out[15]: 2693654118000
In [16]: b = 'hello world'
In [17]: id(b)
Out[17]: 2693654049392
In [18]: a = 'hello world'
In [19]: id(a)
Out[19]: 2693636111600
In [20]: a is b
Out[20]: False
In [21]: a == b
Out[21]: True
Python会对小整数(即-5到256)进行缓存优化,指向同一个对象,那么大于256的整数则不会被缓存,会创建新的对象。
In [23]: a = 100
In [24]: b = 100
In [25]: a is b
Out[25]: True
# 超过256时,会创建新的对象
In [28]: a = 257
In [29]: b = 257
In [30]: a is b
Out[30]: False
In [31]: a == b
Out[31]: True