文章目录
4.1 None
值比较
与None
作比较要使用is
或is not
,不要使用等号
说明:
is
判断是否指向同一个对象(判断两个对象的id是否相等),==
会调用eq
方法判断是否等价(判断两个对象的值是否相等)。
示例:同一个实例,使用“is”和“==”的判断结果不同。
>>> class Bad(object):
def __eq__(self, other):
return True
>>> bad_inst = Bad()
>>> bad_inst == None
True
>>> bad_inst is None
False
4.2 模块导入控制 all
定义一个all不会把本模块的所有内容都暴露在外部,将允许外部访问的变量、函数和类的名字放进去
说明:
在模块中定义了__all__
之后,从外部from module import *
只会import __all__
中定义的内容。
示例:
# sample_package.py
__all__ = ["sample_external_function"]
def sample_external_function():
print("This is an external function..")
def sample_internal_function():
print("This is an internal function..")
# main.py
from sample_package import *
if __name__ == "__main__":
sample_external_function()
sample_internal_function().
NameError: name 'sample_internal_function' is not defined
4.3 字典取值的推荐方式(get
)
避免直接使用dict[key]
的方式从字典中获取value
,如果一定要使用,需要注意当key not in dict
时的异常捕获和处理
说明:
Python的字典dict
可以使用key
获取其对应的value
。但是当key
在dict
的key
值列表中不存在时,直接使用dict[key]
获取value
会报KeyError
,应当使用更为安全的dict.get(key)
类型方法获取value。
# 错误示例:
sample_dict = {
'default_key': 1}
sample_key = 'sample_key'
sample_value = sample_dict[sample_key]
# 正确示例:
sample_dict = {
'default_key': 1}
sample_key = 'sample_key'
sample_value = sample_dict.get(sample_key)
4.4 列表切边不推荐负步长值
对序列使用切片操作时,不建议使用负步进值进行切片
说明:
Python提供了sample_list[start : end : stride]
形式的写法,以实现步进切割,也就是从每stride
个元素中取一个出来。但如果stride
值为负,则会使代码难以理解,特定使用场景下还会造成错误。
# 错误示例:
# 如下写法,在start : end : stride都使用的情况下使用负的stride,会造成阅读困难。此种情况建议将“步进”切割过程和“范围”切割过程分开,使代码更清晰。
>>> a = [1,2,3,4,5,6,7,8]
>>> a[2::2]
[3,