python的那些一般人不知道的细节
1,浮点数用==来比较的话,可能会出错哦。
我们来看一个例子吧:
float_a = 1.0 - 0.8
float_b = 0.8 - 0.6
print(float_a == float_b) # False
print(float_a) # 0.19999999999999996
print(float_b) # 0.20000000000000007
是不是很多人会认为,float_a应该是“==”float_b的呐,可是结果并不是。
我们可以从打印出来的结果看到, float_a不等于float_b的原因是:python的解释器在计算的时候失真了。
那么想解决的问题该怎么办呐? 很简单,我们不使用 == 就好啦。
这时候,小伙伴一定会问, 那我们用什么来判断是否相当啊? 用 < 来判断是否相等啊!没错,你没听错。
不废话,上代码:
float_a = 1.0 - 0.8
float_b = 0.8 - 0.6
print(float_a - float_b < EPSILON) # True
当然,使用math库中的isclose方法是最佳的选择哦:
print(math.isclose(float_a, float_b, rel_tol=1e-15)) # True
2, (代码规范) 避免出现重复的字符串字面量
这个其实很好理解,举个例子大家就都明白啦:
def morning():
wake_up('Wen')
get_food('Wen')
to_work('Wen')
其中,字符串Wen反复出现多次,我们可以先声明一个变量,然后使用变量。
def morning():
my_name = 'Wen'
wake_up(my_name)
get_food(my_name)
to_work(my_name)
3, (常见) 一个示例与None比较的时候要用is,==通常用于变量的比较
is是用来判断是否指向一个对象的,也就是比较两个对象的id是否相等。
==则是判断两个对象的值是否相等,其实是调用__eq__方法来判断的。
简单暴力的让大家理解,上栗子:
class student(object):
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def __eq__(self, guy):
if hasattr(guy, 'gender'):
return self.gender == guy.gender
else:
return 'property not exist'
s1 = student('东皇太一', 108, 'male')
s2 = student('廉颇', 78, 'male')
print(s2.gender == 'male') # True
print(s2 == None) # property not exist
print(s2 is None) # False
print(s1 == s2) # True
print(s1 is s2) # False
这个栗子很明显啦,print(s1 == s2) # True 是因为我重写了__eq__方法,导致了只对比两个对象的性别,所以是相等。
但是使用is是判断这两个对象的id是否是一致的,也就是s1和s2指向的地址空间是否是一致的;很显然,不一致啦。
浙公网安备 33010602011771号