【问题标题】:Tips on improving this function?改进此功能的提示?
【发布时间】:2012-09-03 09:11:02
【问题描述】:

这可能是一个非常绿色的问题,但我希望你能理解——刚刚开始使用 python 并试图改进。无论如何,编写了一个小函数来执行“鞋带法”,以在笛卡尔平面中找到多边形的面积(参见this 进行复习)。

我想知道如何改进我的方法,这样我就可以尝试新奇的方法来做同样的事情。

    def shoelace(list):
        r_p     = 0         # Positive Values
        r_n     = 0         # Negative Values

        x, y    = [i[0] for i in list], [i[1] for i in list]
        x.append(x[0]), y.append(y[0])

        print(x, y)

        for i in range(len(x)):
            if (i+1) < len(x):
                r_p += (x[i] * y[i+1])
                r_n += (x[i+1] * y[i])
            else:
                break

        return ((abs(r_p - r_n))/2)

【问题讨论】:

  • 您应该在代码审查 SE 网站上发布此内容。
  • 一个提示:list 是一个不好的变量名称,因为它是一个内置函数的名称。

标签: python math polygon


【解决方案1】:
  • 不要使用需要注释的短变量名;使用指示功能的名称。

  • list 是内置列表类型的名称,因此虽然 Python 允许您替换该名称,但从风格上来说这是个坏主意。

  • , 不应用于分隔应该是语句的内容。您可以使用;,但通常最好将内容放在单独的行上。在您的情况下,它恰好起作用,因为您使用 .append 来产生副作用,但基本上您所做的是构造 2 元组 (None, None)(来自 .append 的返回值)并将其丢弃。

  • 尽可能使用内置函数进行标准列表转换。例如,请参阅 zip 的文档。除非您真的不需要执行此转换;您想考虑成对的相邻点,那么就这样做 - 并在循环内拆开它们的坐标。

  • 但是,您可以使用 zip 将点列表转换为相邻点对列表 :),这样您就可以编写更清晰的循环。这个想法很简单:首先,我们列出所有与原始点相关的“下一个”点,然后将两个点列表zip 放在一起。

  • return 不是一个函数,所以returning 不需要括号。

  • 不是单独计算正负值,而是对单个值执行带符号运算。


def shoelace(points):
    signed_double_area = 0

    next_points = points[1:] + points[:1]

    for begin, end in zip(points, next_points):
        begin_x, begin_y = begin
        end_x, end_y = end
        signed_double_area += begin_x * end_y
        signed_double_area -= end_x * begin_y

    return abs(signed_double_area) / 2

【讨论】:

    【解决方案2】:

    从功能上讲,您的程序相当不错。一个小注释是将range(len(x)) 替换为xrange(len(x))。它使程序稍微更有效率。通常,您应该仅在您确实需要它创建的完整值列表的情况下使用range。如果您只需要遍历这些值,请使用xrange

    另外,return 语句,r_p +=r_n += 语句中也不需要括号。

    关于风格,在 Python 中变量赋值不应该像你做的那样,而是在 = 符号的每一侧都有一个空格:

    r_p = 0
    r_n = 0
    

    【讨论】:

    • 感谢您的建议:)
    • 不客气。确保您不会错过 Burhan 的建议,我错过了(星期一早上):list 是一个可怕的变量名称。
    猜你喜欢
    • 2015-07-16
    • 2011-03-02
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多