2014-11-22 218 views
1

我有兩個函數。第一個函數 - def training_list()創建兩個列表 - under_50k & over_50k。我想第二個函數def sums_lists()創建一個sum_list,它將兩個列表中的每個索引相加,然後附加每個列表以創建1個列表 - sums_list。當我運行代碼時,它說over_50k沒有在sums_list函數中定義。你能告訴我怎麼定義這個,我想繼續在under_50k & over_50k列表進入新的功能Python:函數 - 將結果從一個函數轉換爲另一個函數


  • 錯誤信息

    File "C:\Python34\Lib\assign1.py", line 208, in sums_list over_50k_sum_list = [sum(k) for k in zip(*over_50k)] NameError: name 'over_50k' is not defined


def training_list(): 

    data_list = create_data(data_url) 
    training_list = data_list[:int(len(data_list) * 75/100)] 
    test_list = data_list[int(len(data_list) * 25/100):] 

    #return training_list 


    over_50k = [] 
    over_50k_count = 0 
    under_50k = [] 
    under_50k_count = 0 

    for row in training_list: 
     if row[-1].lstrip() == '<=50K': 
      under_50k.append(row[:-1]) 
      under_50k_count +=1 
     elif row [-1].lstrip() == ">50K": 
      over_50k.append(row[:-1]) 
      over_50k_count +=1 


    return under_50k,over_50k 

def sums_list(): 

    over_50k_sum_list = [] 
    under_50k_sum_list = [] 

    over_50k_sum_list = [sum(k) for k in zip(*over_50k)] 
    under_50k_sum_list = [sum(k) for k in zip(*under_50k)] 
    sums_list = over_50k_sum_list + under_50k_sum_list 

    print(sums_list) 
    return sums_list 

def main(): 
    def trainging_list(): 

     over_50k = [[1, 2, 3, 4], [3, 4, 5, 6], [7, 8, 9, 8]] 
     under_50k = [[1, 4, 6, 8], [3, 7, 4, 5], [6, 9, 4, 5]] 
     print(over_50k) 
     return over_50k, under_50k 

    over_50k, under_50k = trainging_list() 

    def sum_columns(over_50k, under_50k): 
     print("a") 
     over_50k_sum_list = [sum(k) for k in zip(*over_50k)] 
     under_50k_sum_list = [sum(k) for k in zip(*under_50k)] 
     sums = over_50k_sum_list + under_50k_sum_list 
     print(sums) 
     return sums 
main() 
+1

將數組作爲參數傳遞給'sums_list'。 – akonsu 2014-11-22 13:13:39

+0

嗨akonsu,從我的例子,我需要做什麼? – 2014-11-22 13:21:57

+0

這適用於我 – michaelpri 2015-04-05 04:51:39

回答

0

under_50k和over_50k只在您的第一個功能中分配。當你調用第二個函數時,你需要調用該函數以使它們存在。增加:

under_50k, over_50k = training_list() 

在你的第一個函數會工作,因爲他們已經被指定爲全局變量。

您還可以在定義第二個函數時添加參數,然後在調用它時讀入它。

def sums_list(under_50k, over_50k): 
    # rest of the function 

然後調用一個函數,則其他的沒有鋸齒的空間:

p, q = training_list 
sums_list(p ,q) 
0

你的主要程序需要調用training_list,存儲返回的值,並將其傳遞給sums_list

def main(): 
    under_50k, over_50k = training_list() 
    sums = sums_list(under_50k, over_50k) 

但它可能是最簡單的減少sums_list只是

def sum_columns(table): 
    return [sum(column) for column in zip(*table)] 

,並使用sum_columns(under_50k + over_50k)調用它。 (我更喜歡名稱sum_columns,因爲它更容易理解它在做什麼。)

+0

嗨,斯圖爾特,試圖按照您的評論的第一部分。我已經添加了代碼的更新。試圖讓一個簡單的例子首先工作。我添加了def main()函數以及50k以下的over_50k = training_list()。我得到以下錯誤:文件「C:/Python34/Lib/rerun.py」,第12行,在主 over_50k,under_50k = trainging_list() TypeError:'函數'對象不可迭代 – 2014-11-22 16:25:44

+0

任何想法,我要去哪裏這裏錯了嗎? – 2014-11-22 16:26:06

+0

您的函數'trainging_list'返回一個名爲'trainging_list'的變量,但不向其分配任何值。所以python會查找你可能引用的內容,並發現函數本身被稱爲'trainging_list'並返回它。您需要明確設置您返回的變量的值。通常情況下,您不應該在變量名稱中指定變量的名稱,因爲這會導致混淆。 – Stuart 2014-11-22 17:26:42

相關問題