2014-03-05 26 views
3

我提前道歉。我是编码方面的初学者。在Python中定义函数时如何调用列表?

我试图使用Python编写一个函数来计算使用2只列出了包含使用下面的代码的节点位置的多边形的面积:

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:'列表'对象不可调用”。

我只想让方程遍历列表并返回最终产品。我不确定自己出错的地方,但我认为这可能与我的功能参数有关。

任何帮助将不胜感激。

+0

你认为'stepone = stepone + ...'行会做什么?这是问题线,你有括号,你应该有括号,但'x(0)'*非常*混淆。 – msvalkon

+0

该行假设为: stepone = stepone +(xvalues(x)-xalues(0))*(yvalues(y + 1)-yvalues(y-1)) xvalues/yvalues后面的子值假定为对应于列表中的位置。 – MCline

+0

未来:在追踪中仔细观察一下,它会告诉你_exactly_哪一行存在问题,以及为什么。通常会让你更接近。 –

回答

2

你试图call此:xvalues(x)如果x是一个索引,你想要xvalues[x]用方括号,而不是括号,但x已经是元素本身然而,它!貌似你试图访问比你得到了迭代器的那些不同的元素,您可以循环x in range(len(xvalues)),像这样:

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 

但也有与它一对夫妇的问题首先,yvalues[y-1]没有按。给你你期望的东西y0。我不知道你希望从中得到什么。我想最好的是:

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到的元素:[(1256, 1000), (1102, 1256), (408, 1102), (611, 408), (1000, 611)]

+0

你的评论帮助我取得了很大的进步。我觉得我很接近。 我想告诉代码,如果索引位置小于0或大于5,则不需要做任何事情。我添加了if语句(如果y < 0 or y > 6 :),但是我设置它的方式是查看列表中该索引位置处的值(例如:1000,1256,1102,408,611,1000)和而不是实际的指数位置本身(例如0,1,2,3,4或5)。 有没有办法直接看索引位置? – MCline

+0

我的第一个例子是迭代索引位置。 '范围内的x(len(xvalues))' – mhlester

+0

YES !!对于范围内的x(len(xvalues)-1)解决了这个问题。谢谢你的帮助! – MCline

1

由于您试图将该列表作为函数('调用它')来运行,因此出现错误。从列表访问元素的语法如下:

>>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) 

请注意,我也改变了函数返回该地区的价值而不是打印它。 (这仅仅是很好的做法

+0

你可能想尝试运行该代码。它会给出一个'IndexError' ... – mhlester

+0

是的,我在数学表达方面看起来不够努力。尽管如此,我还是会想出几何问题。 :) – Dandekar

1

“类型错误:‘名单’对象不是可调用“,因为你正在试图像使用函数一样使用列表。

xvaluesyvalues是列表,所以当你访问它们时,你需要使用数组表示法。圆括号通常用于函数,但列表不是函数,不能像带圆括号的函数那样调用。所以就像错误说的那样......“不可调用”。

而是使用方括号进行索引。

即xvalues的第一个值可以通过调用xvalues[0],第三个由xvalues[2]最后被发现xvalues[-1]

要了解更多信息列表操作的阅读此页! :)

​​

当你写行for x in xvalues我注意到你正在试图用X像一个列表,当你写X [0]。然而xxvalues列表的一个元素。意思是x是一个整数,而不是一个列表。

你能想象一个的环 -

for x in xvalues: ...

-is几乎一样:

for ii in range(0,len(xvalues)): x = xvalues[ii] ...

希望这有助于!

0

解决你的问题,你可以简单地做

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 

对于这些COORDS,这会产生272472.0Ref

相关问题