Получил ответный вход None после разных входов - PullRequest
0 голосов
/ 13 марта 2012

Привет, ребята, с кодом ниже, после ввода числа, а затем символа, возвращается None. Я понятия не имею об этом. Любая помощь приветствуется. Я попытался напечатать значения, но они меняются только при возврате!

import string
def get_input_char(char):
    char = str.lower(input("Input a letter: "))
    if not char in string.ascii_letters or char == "" or char == None:
        print("Character " + char + " not valid. Try again.\n")
        char = str(get_input_char(char))
    else:
        return char
    print (char)

word_frag = ""
while True:
    word_frag += get_input_char("")
    print("\nThe current word fragment is " + word_frag)

Ответы [ 2 ]

7 голосов
/ 13 марта 2012

Если ваша функция проваливается до конца, после оператора print она ничего не возвращает. Значение по умолчанию, возвращаемое функцией: None.

2 голосов
/ 13 марта 2012

Как отметил Марк, проблема в том, что никакое значение не возвращается, если первое введенное значение недопустимо.Есть также несколько других вещей, которые не совсем верны в вашем коде:

  • Вы используете рекурсию для проверки допустимых значений, когда цикл будет лучше.Это происходит главным образом из-за больших накладных расходов, связанных с вызовом функции по сравнению с циклом.Если вы используете цикл, вам не нужно давать функции аргумент.
  • Лучше проверять char is None вместо char == None.Проверка на равенство может дать неожиданные результаты, если тестируемый объект настроен для сравнения равным None.Проверка идентичности (с использованием is) гораздо более надежна.
  • Однако вообще не нужно проверять None, поскольку char всегда будет строкой.
  • Ваш код подразумевает, что ожидается только один символ, но фактически любая строка, содержащаяся в ascii_letters , будет принята, например, "efgh".

Я бы предложил переписать функциюкак то так:

def get_input_char():
    while True:
        char = str.lower(input("Input a letter: "))
        if len(char) == 1 and char in string.ascii_letters:
            break
        else:
            print("Character '%s' not valid. Try again.\n" % char)
    return char
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...