在Python中定义函数时如何调用列表?
我事先道歉。我是一个编码初学者 我尝试使用Python编写一个函数,使用包含节点位置的两个列表计算多边形的面积,代码如下:在Python中定义函数时如何调用列表?,python,list,function,parameters,arguments,Python,List,Function,Parameters,Arguments,我事先道歉。我是一个编码初学者 我尝试使用Python编写一个函数,使用包含节点位置的两个列表计算多边形的面积,代码如下: def Area(xvalues, yvalues): area = 0 stepone = 0 for x in xvalues: for y in yvalues: stepone = stepone + (xvalues(x)-xvalues(0))*(yvalues(y+1)-yvalues(y-1))
def Area(xvalues, yvalues):
area = 0
stepone = 0
for x in xvalues:
for y in yvalues:
stepone = stepone + (xvalues(x)-xvalues(0))*(yvalues(y+1)-yvalues(y-1))
area = abs(stepone)/2
print area
xvalues = [2000, 2126, 2716, 2524, 2518, 2000]
yvalues = [1000, 1256, 1102, 408, 611, 1000]
Area(xvalues, yvalues)
然而,我得到一个错误,声明“TypeError:“list”对象不可调用”
我只想让这个等式在列表中循环并返回最终的结果。我不确定哪里出了问题,但我认为这可能与我的函数参数有关
任何帮助都将不胜感激。您将收到错误,因为您试图将列表作为函数(“调用它”)运行。从列表中访问元素的语法如下所示:
>>myList = [1,2,3,4]
>>print mylist[1]
2
因此,在公式中应该使用方括号而不是大括号。再看一下你的代码,我意识到你是用绝对值来计算你在循环中的面积。固定代码的形式如下。但是,由于时间紧迫,我无法检查您用于计算stepone的逻辑,因此我仅在此处留下评论:
def Area(xvalues, yvalues):
area = 0
stepone = 0
for x in xvalues:
for y in yvalues:
# logic to calculate stepone
area = abs(stepone)/2
return area
xvalues = [2000, 2126, 2716, 2524, 2518, 2000]
yvalues = [1000, 1256, 1102, 408, 611, 1000]
print Area(xvalues, yvalues)
请注意,我还更改了函数以返回区域的值,而不是打印它。(这只是一个很好的做法。您试图在这里调用
xvalues(x)
。如果x
是一个索引,那么您需要xvalues[x]
使用方括号而不是括号,但是x
已经是元素本身了!但是,看起来您试图访问的元素与从迭代器中获取的元素不同。您可以在范围(len(xvalues))中循环x
,如下所示:
def Area(xvalues, yvalues):
area = 0
stepone = 0
for x in range(len(xvalues)):
for y in range(len(yvalues)):
stepone = stepone + (xvalues[x]-x[0])*(yvalues[y+1]-yvalues[y-1])
area = abs(stepone)/2
print area
但是它有两个问题。首先,y值[y-1]
没有给你你所期望的y
是0
。我不知道你希望从中得到什么。我能猜到的最好结果是:
def Area(xvalues, yvalues):
area = 0
stepone = 0
firstx = xvalues[0]
for x in xvalues:
for y1, y2 in zip(yvalues[1:], yvalues[:-1]):
stepone = stepone + (x-firstx)*(y1-y2)
area = abs(stepone)/2
print area
zip
创建一个新列表,对其进行迭代,并将y1和y2分配给以下元素:[(12561000),(11021256),(4081102),(611408),(1000611)]
“类型错误:'list'对象不可调用”是因为您试图像函数一样使用列表而引发的
xvalues
和yvalues
是列表,因此当您访问它们时,您需要使用数组表示法。圆括号通常用于函数,但列表不是函数,不能像圆括号中的函数那样调用。因此,正如错误所说,“不可调用”
相反,使用方括号进行索引
也就是说,xvalues中的第一个值可以通过调用xvalues[0]
找到,第三个值可以通过xvalues[2]
找到,最后一个值可以通过xvalues[-1]
要了解列表操作的更多信息,请阅读本页!:)
当您在xvalues中为x编写行时,我注意到您在编写x[0]时试图将x用作列表。但是x
是xvalues
列表的一个元素。。这意味着x是一个整数,而不是一个列表
你可以想象一个循环-
对于x中的x值:
…
-实际上与:
范围内ii的(0,len(xvalue)):
x=x值[ii]
…
希望这有帮助 要解决您的问题,您只需
x_values = [2000, 2126, 2716, 2524, 2518, 2000]
y_values = [1000, 1256, 1102, 408, 611, 1000]
area = 0
for x1, y1, x2, y2 in zip(x_values, y_values, x_values[1:], y_values[1:]):
area += x1 * y2 - x2 * y1
area = abs(area) * 0.5
对于这些坐标,这将产生272472.0
您认为stepone=stepone+…
行具体可以做什么?这就是问题所在,括号中应该有括号,但是x(0)
非常混乱。假设这一行是:stepone=stepone+(xvalues(x)-xalues(0))*(yvalues(y+1)-yvalues(y-1))xvalues/yvalues后面的子值应该与列表中的位置相对应。将来:请仔细查看回溯,它将准确地告诉您哪一行有问题,以及原因。这通常会让你更接近。是的,我没有认真研究数学表达式。不过,我打算回避几何问题。:)你的评论帮助我取得了很大的进步。我想我很接近了。我试图告诉代码,如果索引位置小于0或大于5,则无需执行任何操作。我添加了if语句(如果y<0或y>6:),但我设置它的方式是查看列表中该索引位置的值(例如:1000、1256、1102、408、611、1000),而不是实际的索引位置本身(例如0、1、2、3、4或5)。有没有直接查看索引位置的方法?我的第一个示例是迭代索引位置<代码>适用于范围内的x(len(xvalues))
是!!对于范围内的x(len(xvalues)-1),解决了该问题。谢谢你的帮助!