2014-03-05 24 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

相關問題