Python 嵌套条件语句的可读性
我目前正在用Python编写一个程序来模拟射影几何,而射影点的同余函数看起来相当糟糕 (对于任何感兴趣的人来说,如果两个投影点都位于通过原点的一条线上,则它们是全等的。)Python 嵌套条件语句的可读性,python,conditional-statements,code-readability,Python,Conditional Statements,Code Readability,我目前正在用Python编写一个程序来模拟射影几何,而射影点的同余函数看起来相当糟糕 (对于任何感兴趣的人来说,如果两个投影点都位于通过原点的一条线上,则它们是全等的。) 我是Python新手,但我知道通常有一种“Pythonic”的方式来做任何事情。考虑到这一点,我将如何使其更具可读性?可能使用if self.coords[I]而不是if self.coords[I]!=0(类似示例相同)和如果不是比率,而不是如果比率为0。在Python中,任何非零值都传递if子句,因此不需要检查它是否为非零
我是Python新手,但我知道通常有一种“Pythonic”的方式来做任何事情。考虑到这一点,我将如何使其更具可读性?可能使用
if self.coords[I]
而不是if self.coords[I]!=0
(类似示例相同)和如果不是比率
,而不是如果比率为0
。在Python中,任何非零值都传递if
子句,因此不需要检查它是否为非零值,它是自动的
def congurent(self,other):
ratio = None
for a,b in zip(self,other):
if a != 0 and b != 0:
if ratio is None:
ratio = a/float(b)
elif abs(ratio - a/float(b))>0.001:
return False
elif a!=0 or b!=0:
return False
return True
也许有点像蟒蛇。。。尽管它真正改变的是你在列表上的迭代方式(行数相同)这是怎么回事:
def congruent(self, other, eps=0.001):
ratios = (c1 / c2 for c1, c2 in zip(self.coords, other.coords) if c1 or c2)
try:
first = next(ratios)
return all(abs(ratio - first) < eps for ratio in ratios)
except ZeroDivisionError:
return False
def全等(自身,其他,eps=0.001):
比率=(c1的c1/c2,拉链中的c2(self.coords,other.coords)(如果是c1或c2)
尝试:
第一个=下一个(比率)
返回全部(abs(比率-第一)
zip
很方便)c1
为非零且c2
为零时发生,因此这是失败的从uuuu future\uuuuuu import division添加到文件的顶部,这样您就不会得到整数坐标值的错误结果
编辑:根据@JoranBeasley增加了浮动比率的短路和ε比较。这个问题似乎是主观的、基于讨论和意见的。。。没有真正的客观答案。代码检查比率为0后,它会将比率分配给一个新值。在这种情况发生之后,决不应重新分配比率。也许有更好的方法可以做到这一点。@Patrick,使用循环外的0坐标设置比率,然后从索引1开始循环。这将更清楚地表明,它在循环过程中不会发生变化。我投票将此问题作为离题问题结束,因为它应该迁移到@RobertH。如果您认为应该迁移,则结束问题对迁移没有任何帮助,单击“标志”->需要版主干预->说你认为应该迁移。Sweet。是不是abs(比率-a/float(b))>0.001
用于浮点数比较?是的,很难测试浮点数的相等性,因为它们是怎样的:Pbah甚至比我的好。。。我觉得你可以用一些短路和发电机。。。但答案很好+1@JoranBeasley是的,我想把所有的放进try
,这是一个简单的替代,但它有点损害可读性。0.0/0.0
确实给了我一个ZDE,所以不能完全确定该位是否会像预期的那样工作,但看起来是可信的enough@JoranBeasley添加了短路,请检查:)。如果两者都是0.0
,则它们将被排除在比率列表之外,因为如果c1或c2
为False
点(1,1,1)。全等(点(0,0,0))
返回False
def congruent(self, other, eps=0.001):
ratios = (c1 / c2 for c1, c2 in zip(self.coords, other.coords) if c1 or c2)
try:
first = next(ratios)
return all(abs(ratio - first) < eps for ratio in ratios)
except ZeroDivisionError:
return False