2017-09-13 116 views
-1

我正在學習Python的教程。我寫的代碼,你看到如下:爲什麼PyCharm給我一個未解決的參考名稱錯誤

creatures = [] 

def get_creature_race(): 
    creature_race = [] 
    for creature in creatures: 
     creature_race.append(creature["race"].title()) 
    return creature_race 


def print_creature_race(): 
    creature_race = get_creature_race() 
    print(creature_race) 


def add_creature(race, sex): 
    creature = {"race": race, "creature_sex": sex} 
    creatures.append(creature) 


def save_file(creature): 
    try: 
     f = open("creatures.txt", "a") 
     f.write(creature + "\n") 
     f.close() 
    except Exception: 
     print("Could not save file") 


def read_file(): 
    f = open("creatures.txt", "r") 
    for creature in f.readlines(): 
     add_creature(creature) 
    f.close() 


read_file() 
print_creature_race() 


creature_race = input("Enter creature race: ") 
creature_sex = input("Enter creature sex: ") 

add_creature(creature_race, creature_sex) 
print_creature_race() 
save_file(creature_race) 

當我嘗試運行此我得到如下:

...line 32, in read_file 
    add_creature(creature) 
TypeError: add_creature() missing 1 required positional argument: 'sex' 

第32行是在READ_FILE()函數定義四號線:

add_creature(creature) 

如果我將鼠標懸停在最右邊的括號 ')' 我得到:

Parameter 'sex' unfilled 

如果我把第二個參數:

def read_file(): 
    f = open("creatures.txt", "r") 
    for creature in f.readlines(): 
     add_creature(creature, sex) 
    f.close() 
    print("Could not read file") 

我得到:

line 32, in read_file 
    add_creature(creature, sex) 
NameError: name 'sex' is not defined 

當我將鼠標懸停在性愛這讓我:

Unresolved reference sex 

如果我把一個try塊def def read_file(),所以我可以運行程序,而不會出錯:

def read_file(): 
    try: 
     f = open("creatures.txt", "r") 
     for creature in f.readlines(): 
      add_creature(creature, sex) 
     f.close() 
    except Exception: 
     print("Could not read file") 

並運行它,我得到以下幾點:

Could not read file 
[] 
Enter creature race: giant 
Enter creature sex: male 
['Giant'] 

Process finished with exit code 0 

第一行是從READ_FILE()函數的異常,因爲creatures.txt尚不存在(或因此我想)。 []是print_creature_race()函數的輸出,因爲它當前爲空。接下來的兩個「Enter ...」語句應該是不言自明的。 ['Giant']是第二個print_creature_race()函數調用的輸出。我現在有一個creatures.txt文件,其中包含「巨人」一詞。

現在,按照教程,如果我跑這第二次是我應該得到的是:

giant 

Enter creature race: elf 
Enter creature sex: female 

有沒有異常,因爲文件creatures.txt現在存在。 print_creature_race()函數調用導致「巨人」被打印。我得到兩個提示進入另一場比賽和性別。不過,我實際上得到的是:

Could not read file 
[] 
Enter creature race: 

如果我繼續提示我得到:

Could not read file 
[] 
Enter creature race: elf 
Enter creature sex: female 
['Elf'] 

我creatures.txt文件有巨人,精靈(各自成一行),但是,很明顯,我仍然無法讀取文件。 add_creature的定義有兩個參數,但是包含它並且不包含它會導致錯誤。

我在做什麼錯?

+0

要麼你有下面的教程有問題,要麼你不明白。沒有生物的性別,你不能使用'add_creature'。如果文件只包含可能的物種,那麼你可能不應該添加到生物列表。而且,如果不告訴我們這是哪個教程,我們不能說你是錯的還是教程簡單地被破壞了。 – Bakuriu

+0

您可能需要在'creature'旁邊的文件中將'creature_sex'寫入空格,並在讀取文件時使用'line.split()'解析每行。不要忘記在每個函數中添加新參數:save_file ...並且當你打電話給他們時 – PRMoureu

+0

Bakuriu,顯然我不明白。這就是我問這個問題的原因。我明白函數調用如何與其他語言一起工作,這就是爲什麼我不明白爲什麼教程只用一個參數調用函數。我不明白Python,所以我在問希望有人能向我解釋'爲什麼'。不知道爲什麼僅僅提出問題就需要反對投票。即使它不是你... –

回答

0

請了解如何調試您的代碼! 我只是提供一些提示。然而,這些並不會導致更迭(保羅留斯指出)

修復最後一行:

save_file(creature_race)

save_file(creatures)

簡要說明: 要保存只有比賽,而你的職能在等待:種族和性別。

您還應該查看hot以適當地將您的數據保存到文件中並閱讀它。 (例如檢查python + csv)。

另外:你創建的函數是壞的 - 它們沒有被封裝。嘗試以某種方式重新思考代碼,您的任何函數都不必調用或更改外部變量。然後,您可以啓動您的代碼,而不執行任何函數,並逐個調用它們以查看它們的功能。觀察你的全局變量,隨時更改和修復代碼。

+0

這不會有幫助,因爲生成的文件既不包含生物名稱也不包含性別,但是包含名爲'creatures'的Python列表的默認格式。本教程似乎不解釋如何編寫該文件或以允許該腳本運行的方式對其進行解析。也許OP可以告訴我們這個教程來自哪裏。 –

+0

確實....沒有注意到它。實際上,在理解其他內容的工作方式之前,我不會立即推薦使用這些文件。所有的編程原理,如DRY,封裝,以及一個好的算法。 –

+0

save_file(creature_race)是正確的。我仔細檢查了教程以確保。當我嘗試您的建議時,我也會遇到錯誤。我正在使用的教程是Python:Pluoplesight上的Bo Milanovich入門。它位於開放,閱讀和寫作下的第三個模塊中...這裏是鏈接:[link](https://app.pluralsight.com/player?course=python-getting-started&author=bo-milanovich&name=python-開始 - m3&clip = 6&mode = live) –

0

我想通了這個問題。我錯過了代碼中的一個小細節。在add_creature()的定義,我不得不默認值分配給性別:

def add_creature(race, sex="male"): 
    creature = {"race": race, "creature_sex": sex} 
    creatures.append(creature) 

這是教程如何能夠調用該函數只有在比賽的參數。一旦我添加了="male"代碼就能按預期工作。