Я смотрел на это весь день и не могу понять, почему ввод пола повторяется, несмотря на то, что он вызывается только один раз. Это не часть цикла, который я тоже вижу.
Я пробовал добавлять переменные, чтобы действовать как счетчик, и пытался использовать оператор if, чтобы запускать ввод только в том случае, если переменная счетчика меньше 1, но не могу понять это.
Редактировать: благодаря отличным отзывам здесь я узнал, что get_full_name вызывает дублирование ввода пола в get_first_name, но теперь я сталкиваюсь с проблемами при попытке вывести случайно сгенерированные имя и отчество.
Я решил установить переменные setFirst, setMiddle и setLast как глобальные, но потом получаю ошибку NameError. Я также пытался создать новую функцию для их отображения, но это тоже не сработало. Я попытался добавить «я». (без кавычек) либо непосредственно в функции(), либо в одном из отступов под ней.
Сначала я покажу ошибку, а затем полный код.
Ошибка: трассировка (последний последний вызов):
Файл "init.py", строка 100, в main()
Файл "init.py" , строка 92, в основном
print displayName(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
Вот функция, которую я создал, чтобы попытаться ее отследить: def displayName(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.")
get_full_name
появляется дважды вmain
- person Peter Wood   schedule 12.10.2015get_full_name()
дважды, один раз для печати и один раз для записи. Это означает, чтоget_first_name
вызывается дважды, каждый раз запрашивая пол. Может быть, вы хотите сохранить имя в переменной и распечатать/записать то же значение? - person zehnpaard   schedule 12.10.2015determine = input() determine = int(determine)
- person Szilárd Németh   schedule 12.10.2015