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指向的地址空间是否是一致的;很显然,不一致啦。

posted @ 2024-03-15 21:20  Vincent_Qi  阅读(17)  评论(0)    收藏  举报