2015-10-11 35 views
4

我一直在看着這個整個下午,無法弄清楚爲什麼性別輸入是重複自己,儘管只出現被稱爲一次。這不是我可以看到的循環的一部分。Python - 隨機嬰兒名稱生成器問題 - (複製輸入,調用變量)

我試着添加變量來充當計數器,並嘗試使用if語句只運行輸入,如果計數器變量小於1,但無法弄清楚。

編輯:由於這裏有很好的反饋,我發現get_full_name在get_first_name中導致了重複的性別輸入 - 但是現在我在嘗試輸出隨機生成的第一個中間名時遇到問題。

我想設置setFirst,setMiddle和setLast變量爲全局變量,但後來我得到一個NameError。我也嘗試創建一個新的功能來顯示它們,但那也不起作用。我嘗試添加「自我」。 (不包括引號),直接在函數()或其下的一個縮進中。

我會先顯示錯誤,然後顯示完整的代碼。

錯誤: 回溯(最近通話最後一個):
文件 「初始化 py」 爲,線100,在 的main()
文件 「初始化 py」 爲,行92,在主
打印顯示名(setFirst,setMiddle,setLast)
NameError:全局名稱 'setFirst' 沒有定義

我也得到名稱錯誤,試圖串聯setFirst,setMiddle和setLast在到另一個變量的全名。

下面的代碼:

from os.path import abspath, join, dirname 
import random 

full_path = lambda filename: abspath(join(dirname(__file__), filename)) 


FILES = { 
    'first:male': full_path('dist.male.first'), 
    'first:female': full_path('dist.female.first'), 
    'last': full_path('dist.all.last'), 
} 


def get_name(filename): 
    selected = random.random() * 90 
    with open(filename) as name_file: 
     for line in name_file: 
      name, _, cummulative, _ = line.split() 
      if float(cummulative) > selected: 
       return name 


def get_first_name(gender=None): 
    global determine 
    global setFirst 

    print ("First name... Enter 1 for Male, 2 for Female or 3 to be surprised! ") 
    determine = input() 

    if determine == 1: 
     gender = 'male' 
    if determine == 2: 
     gender = 'female' 
    if determine == 3: 
     print ("You want to be surprised!") 
     gender = random.choice(('male', 'female')) 

    return get_name(FILES['first:%s' % gender]).capitalize() 
    setFirst = get_first_name() 
    print setFirst + " " 

def get_middle_name(gender=None): 
    global setMiddle 

    if determine == 1: 
     gender = 'male' 
    if determine == 2: 
     gender = 'female' 
    if determine == 3: 
     gender = random.choice(('male', 'female')) 

    return get_name(FILES['first:%s' % gender]).capitalize() 
    setMiddle = get_middle_name() 
    print setMiddle + " " 

def get_last_name(): 
    global setLast 

    #We will implicitly pass a Last Name until other issues are fixed 
    return 「Smith」 

    setLast = get_last_name() 
    print setLast 

def get_full_name(gender=None): 
    return u"%s %s %s" % (get_first_name(gender), get_middle_name(gender), get_last_name()) 

#def displayName(setFirst, setMiddle, setLast): 
# print setFirst + " " + setMiddle + " " + setLast 

def main(): 
    #print u"%s %s %s" % (setFirst, setMiddle, setLast) 
    #print displayName(setFirst, setMiddle, setLast) 

    f = open('output', 'a') #append output to filename output 
    f.write(get_full_name() + '\n') #and add a line break after each run 
    f.close() 

if __name__ == "__main__": 
    main() 

即使我嘗試傳遞變量的main(),如:

def main(setFirst, setMiddle, setLast): 

它仍然給出了NameError約不被定義。我究竟做錯了什麼?

我在「導入隨機」下添加了這個權限,但現在我得到了一些流氓「無」顯示 - 這導致我相信代碼中存在泄漏。思考?

setFirst = None 
setMiddle = None 
setLast = None 

這裏是我創建設法跟蹤它的功能: 高清顯示名(setFirst,setMiddle,setLast):

if setFirst == None: 
    print ("Random Baby Name Generator") 

else: 
    print setFirst 
    print setMiddle 
    print setLast 

if setMiddle == None: 
    print ("Double check the middle name variable.") 

if setLast == None: 
    print ("Double check the last name variable.") 
+1

你所說的「性別輸入重演」呢?我們沒有這些文件,我們也看不到發生了什麼。 Yuu're將不得不告訴我們。 – saulspatz

+0

好點,對不起。這裏是一個示例輸出: 名字...輸入1爲男性,2爲女性或3爲驚訝! 菲奧娜克莉絲汀瓊斯 名字...輸入1爲男性,2爲女性或3驚訝! – cydonia22

+1

'get_full_name'在'main'中出現兩次 –

回答

0

get_full_name被調用兩次,大概,而這個結果在其他被調用get_full_name的函數也被調用兩次。不幸的是,這意味着雙重輸入和混淆用戶。

+0

我試圖找到一種方法將輸出保存到main()中的單獨變量,以便我可以保存到文件並顯示給用戶。我們發現通過在要輸出的文件中包含該函數,然後再次調用get_first_name,從而導致額外的輸入。 – cydonia22

1

要調用get_full_name()兩次,你需要保存的結果:

def main(): 
    full_name = get_full_name() 
    print(full_name) 
    f = open('output', 'a') #append output to filename output 
    f.write(full_name + '\n') #and add a line break after each run 
    f.close() 

也有幾個缺口問題,以及,再加上你的全局的使用是有點低效率的。理想的情況下,職能應該做一個 - 也只能是一個 - 任務;這使得它們更易於調試。

試試這個不同版本的代碼:

from os.path import abspath, join, dirname 
import random 

full_path = lambda filename: abspath(join(dirname(__file__), filename)) 


FILES = { 
    'first:male': full_path('dist.male.first'), 
    'first:female': full_path('dist.female.first'), 
    'last': full_path('dist.all.last'), 
} 

GENDER_MAP = {'1': 'male', '2': 'female'} 

def get_gender(): 
    result = input('Select a gender: 1 for Male, 2 for Female or 3 to be surprised') 
    if result not in ('1', '2', '3'): 
     print('{} is not a valid choice, please try again'.format(result)) 
     return get_gender() 
    if result == '3': 
     return random.choice(('1', '2')) 
    return result 

def get_name(filename): 
    selected = random.random() * 90 
    with open(filename) as name_file: 
     for line in name_file: 
      name, _, cummulative, _ = line.split() 
      if float(cummulative) > selected: 
       return name 

def get_name_from_file(name_type='first', gender='male'): 
    if name_type in ('first','middle',): 
     name = get_name(FILES['{}:{}'.format(name_type, gender)]).capitalize() 
    else: 
     name = get_name(FILES['last']).capitalize() 
    return name 

def get_full_name(): 
    gender = get_gender() 
    gender_file = GENDER_MAP.get(gender, '') 
    first_name = get_name_from_file('first', gender_file) 
    middle_name = get_name_from_file('middle', gender_file) 
    last_name = get_name_from_file('last') 

    return '{} {} {}'.format(first_name, middle_name, last_name) 

if __name__ == '__main__': 
    name = get_full_name() 
    print(full_name) 
    with open('output', 'a') as f: 
     f.write('{}\n'.format(full_name)) 
    print('Done') 
+0

感謝布爾汗 - 得到一個語法錯誤: 文件「__init__.py」,第36行 如果name_type在「第一」,「中等」: ^ 語法錯誤:無效語法的修訂 – cydonia22

+0

謝謝,但回溯拋出不同現在的錯誤: 1不是一個有效的選擇,請重試 回溯(最近通話最後一個): 文件 「__init__.py」,第51行,在 名= get_full_name() 文件 「__init__.py」 ,第42行,在get_full_name中 gender = get_gender() File「__init__」。py「,第20行,在get_gender中 return get_gender_input() NameError:全局名稱'get_gender_input'未定義 – cydonia22

+0

將它更改爲get_gender(),因爲我切換了方法名稱 –