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编写一个程序来模拟射影几何,而射影点的同余函数看起来相当糟糕

(对于任何感兴趣的人来说,如果两个投影点都位于通过原点的一条线上,则它们是全等的。)


我是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
    很方便)
  • 对于任一坐标为非零的情况,列表将获取所有坐标比。如果两者都是,那就好了,它被排除在外
  • ZDE仅在
    c1
    为非零且
    c2
    为零时发生,因此这是失败的
  • 最后,如果所有比率相等,我们通过
  • 注意:如果您没有使用Python3,您应该将
    从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