Python во время цикла / диапазона

#python

#python

Вопрос:

Мне нужно запросить номер у пользователя, и затем, если он находится в диапазоне низкого / высокого числа, он возвращает номер, и если его нет в диапазоне, он повторяется до тех пор, пока введенное число не окажется в диапазоне. Я действительно не знаю, как именно это сделать, но я думаю, что отчасти я прав. Моя главная проблема — строка «while question! = низкий <= вопрос <= высокий:» Я чувствую, что с этой строкой проблема.

 def ask_number(question, low, high):
    question = int(raw_input("Enter a number within the range: "))
    question = ""
    while question != low <= question <= high:
        question = int(raw_input("Enter a number within the range: "))
  

Комментарии:

1. Я пытаюсь создать эту игру, но я получил свой ответ, спасибо

Ответ №1:

В этом случае самым простым решением является использование True в качестве условия в while цикле и if внутри цикла для прерывания, если число в порядке:

 def ask_number(low, high):
    while True:
        try:
            number = int(raw_input("Enter a number within the range: "))
        except ValueError:
            continue
        if low <= number <= high:
            return number
  

Я также добавил оператор try / except , чтобы предотвратить сбой программы, если пользователь вводит строку, которая не может быть преобразована в число.

Комментарии:

1. Если он хочет принимать только целые числа (и даже не принимать (путем усечения) числа с плавающей точкой, тогда он мог бы просто сделать что-то вроде if number.isnumeric(): return int(number)

2. @TylerCrompton: Вы, вероятно, имеете в виду, number.isdigit() поскольку isnumeric() не существует. Это даже исключило бы начальные или конечные пробелы, так что, вероятно, это слишком строго.

Ответ №2:

Ваш синтаксис цикла while был бы более понятным, если бы вы думали об этом так: «Я хочу продолжать запрашивать у пользователя ответ, пока его ответ меньше низкого или больше высокого«. Переведенный непосредственно на Python, это было бы

 while question < low or question > high:
  

Вы также не должны назначать "" для question , поскольку это перезаписывает первый ответ пользователя. Если они получат число в диапазоне в первый раз, они все равно будут запрошены снова. В принципе, вы должны удалить эту строку:

 question = ""
  

Ваш окончательный код должен выглядеть примерно так:

 def ask_number(low, high):
    assert low < high
    question = int(raw_input("Enter a number within the range: "))
    while question < low or question > high:
        question = int(raw_input("Enter a number within the range: "))
    return question

print(ask_number(5,20))
  

Комментарии:

1. К вашему сведению, этот код вызывает ask_number() с тремя аргументами, но принимает только два.

2. @AustinMarshall Спасибо, что уловили это.

Ответ №3:

 def ask_number(low, high):  
    while True:
        number = int(raw_input('Enter a number within the range: '))
        if number in xrange(low, high   1):
            return number
  

Комментарии:

1. Это плохая идея. xrange() Объект Python 2.x не использует специальный регистр in оператора, поэтому он будет зацикливаться на диапазоне. Попробуйте 100000000 in xrange(200000000) понять, что я имею в виду. 🙂 Также обратите внимание, что это эффективно работает для объектов Python 3.x range() .

Ответ №4:

 def ask_number(low, high):

    """question cannot be less than the minimum value so we set it below the
    minimum value so that the loop will execute at least once."""

    question = low - 1

    """You want question to be within the range [high, low] (note the
    inclusivity), which would mathematically look like 'low <= question <= high'.
    Break that up into what appears to be one comparison at a time:
    'low <= question and question <= high'. We want the while loop to loop when
    this is false. While loops loop if the given condition is true. So we need to
    negate that expression. Using the DeMorgan's Theorem, we now have
    'low < question or question > high'."""

    while question < low or question > high:

        """And this will obviously update the value for question. I spruced up
        the only argument to raw_input() to make things a bit 'smoother'."""

        question = int(raw_input("Enter a number within the range [%d, %d]: " % _
                   (low, high)))

    # Return question.
    return question
  

Комментарии:

1. Его использование question = "" отлично работало (на Python 2), поскольку оно никогда не будет в диапазоне low <= question <= high . «математически выглядит как «низкий <= вопрос <= высокий»» Также питонически выглядит так; подобные сравнения с цепочкой работают нормально.

2. Но вы не можете связать отрицание этого (если только вы не хотите этого сделать not (<expression>) . И да, я понимаю, что использование "" — это нормально.