2013-08-16 2 views
2

Итак, вот соответствующий код:Python 3.3: Не удается получить функции возвращать ничего, кроме None

def action(): 
    print("These are the actions you have available:") 
    print("1 - Change rooms") 
    print("2 - Observe the room (OUT OF ORDER)") 
    print("3 - Check the room(OUT OF ORDER)") 
    print("4 - Quit the game") 

    choice = input("What do you do?\n> ") 
    if choice in (1, "move"): 
     return(1) 
    elif choice in (4, "quit"): 
     return(4) 

play = True 

while play == True: 
    ###some functions that aren't relevant to the problem 
    choice = action() 
    print(choice) 
    if choice == 1: 
     change_room() 
     ## more code... 

Функция всегда возвращает None. Я помещаю там распечатку (выбор), чтобы увидеть, какое значение имеет значение «выбор», и оно всегда ничего не связывает, а блок «if choice == 1» никогда не запускается. Поэтому я думаю, что функция не возвращает значение вообще, поэтому ошибка, вероятно, связана с return() в действии(), но я проверил здесь и в другом месте, и я не вижу, что с ним не так.

ответ

4

input() возвращает строку, всегда, но вы тестируете целые числа. Сделайте их строки:

if choice in ('1', "move"): 
    return 1 

Введенной choice не соответствуют ни одному из ваших тестов, так что функция заканчивается не достигая явный return заявления и Python возвращается к значению по умолчанию возвращения из None.

еще лучше, замените все if/elif/elif дерева со словарем:

choices = { 
    '1': 1, 
    'move': 1, 
    # ... 
    '4': 4, 
    'quit': 4, 
} 

if choice in choices: 
    return choices[choice] 
else: 
    print('No such choice!') 
+0

Ааа .. человек, я должен тестируемым с «двигаться», я просто одержимы пытаемся только с 1! Если бы я попытался «переехать», я бы сказал, что я мог бы это понять. Большое спасибо Martijn. Что вы можете сказать о преимуществах использования словаря вместо тестов if/elif? Это выглядит менее запутанным/более элегантным с dict. – user2690126

+0

Отображение более компактно, проще в расширении и может быть передано в случае необходимости. Поиск быстрее; просто * один * тест необходим. –

+0

Gotcha, еще раз спасибо. – user2690126

Смежные вопросы