Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关于改进此功能的提示?_Python_Math_Polygon - Fatal编程技术网

Python 关于改进此功能的提示?

Python 关于改进此功能的提示?,python,math,polygon,Python,Math,Polygon,这可能是一个相当环保的问题,但我希望您理解——我刚刚开始使用python并尝试改进。总之,编写了一个小函数来执行“鞋带法”,即在笛卡尔平面中查找多边形的面积(请参阅以获取更新) 我想知道如何改进我的方法,这样我就可以尝试做同样的老事情的新奇方法 def shoelace(list): r_p = 0 # Positive Values r_n = 0 # Negative Values x,

这可能是一个相当环保的问题,但我希望您理解——我刚刚开始使用python并尝试改进。总之,编写了一个小函数来执行“鞋带法”,即在笛卡尔平面中查找多边形的面积(请参阅以获取更新)

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

    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)
def鞋带(列表):
r_p=0#正值
r_n=0#负值
x、 y=[i[0]表示列表中的i],[i[1]表示列表中的i]
x、 追加(x[0]),y.append(y[0])
打印(x,y)
对于范围内的i(len(x)):
如果(i+1)
从功能上讲,您的程序相当不错。一个小注释是将
range(len(x))
替换为
xrange(len(x))
。它使程序稍微更有效率。通常,只有在实际需要它创建的完整值列表的情况下,才应该使用
range
。如果您只需要在这些值上循环,请使用
xrange

此外,在
return
语句中,也不需要在
r\u p+=
r\u n+=
语句中使用括号

关于样式,在Python中,变量赋值不应该像您那样进行,而是在
=
符号的每一侧使用一个空格:

r_p = 0
r_n = 0
  • 不要使用需要注释的短变量名;使用指示函数的名称

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

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

  • 尽可能使用内置函数进行标准列表转换。例如,请参阅
    zip
    的文档。除非你真的不需要执行这个转换;你想考虑对相邻点,这样做,并把他们的坐标在环内。< /p>
  • 但是,可以使用
    zip
    将点列表转换为相邻点对的列表:),这样可以编写更清晰的循环。这个想法很简单:首先,我们列出相对于原件的所有“下一个”点,然后将这两个点列在一起

  • return
    不是一个函数,因此您要返回的内容不需要括号

  • 对单个值执行有符号算术,而不是单独计算正负值



谢谢你的建议:)不客气。确保你不会错过Burhan的建议,我(周一早上)错过了:
list
对于变量来说是一个糟糕的名字。你应该在CodeReview SE网站上发布这一点。提示:
list
对于变量来说是个坏名字,因为它是内置变量的名字。
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