Выход за пределы указанного максимума в функции range () - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь ответить на следующий практический вопрос:

"Написать цикл (мы предлагаем цикл for), который печатает числа от минимума до максимума, включая минимальный и максимальный значения самих себя. Если четное значение равно Истина, выведите только четные числа. Если четное значение равно Ложь, выведите только нечетные числа . Вы можете предположить, что минимум всегда будет меньше максимума. "

Для этого я написал следующий код, и он работает для определенных минимальных и максимальных значений:

minimum = 5
maximum = 14
even = True

if even:
    for numbers in range(minimum, maximum+1, 2):
        if numbers%2 == 0:
            print(numbers)
        elif numbers%2 == 1:
            numbers += 1
            print(numbers)
else:
    for numbers in range(minimum, maximum+1, 2):
        if numbers%2 == 1:
            print(numbers)
        elif numbers%2 == 0:
            numbers += 1
            print(numbers)

Это сгенерировало мой желаемый результат: 6, 8, 10, 12, 14.

Однако, когда мои минимальные, максимальные и четные значения изменены, например, ниже:

minimum = 29
maximum = 33
even = True

Код как-то генерирует вывод 30, 32 and 34. 34> 33 и поэтому не должно быть там, но это так. Я предполагал, что range() работает так, что он не включает максимальное число, и, таким образом, я использовал maximum+1, чтобы включить maximum в качестве вопроса, но он включал число, которое даже превышает maximum+1!

Чтобы проверить дальше, я попытался изменить переменные следующим образом и обнаружил нечто столь же интересное, что и загадочное:

minimum = 1
maximum = 4
even = False

Как и ожидалось, я получил 1, 3 в качестве вывода. Однако, когда я изменил minimum = 2, вместо этого я получил 3, 5!

Может кто-нибудь объяснить мне, почему код действует таким образом? Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Поскольку, когда вы находитесь в цикле for, вы увеличиваете переменную number, которая является индексом цикла и должна управляться самим циклом.

В частности, когда число 33, когда вы достигнете

elif numbers%2 == 1:
    numbers += 1
    print(numbers)

увеличивается на 1, а если 34, то печатается.

Могу ли я предложить реализацию:

for number in range(minimum, maximum+1):
    if (number%2 == 0 and even):
        print number
    elif (number%2 != 0 and not even):
        print number
0 голосов
/ 12 января 2019

Когда maximum равно 33, и вы создаете объект range, который переходит к maximum+1, наибольшее значение, которое вы увидите из этого, - maximum, что составляет 33. Однако, когда вы добавляете 1 на это значение с помощью numbers += 1, вы меняете это значение на 34, то есть где вы получаете 34. Вы можете очистить свой код, изменив minimum и maximum по мере необходимости перед началом, вместо того, чтобы сдвигать каждое число в range.

def printer(low, hi, even):
    for num in range(low + (even == low%2), hi+1, 2):
        print(num)
0 голосов
/ 12 января 2019
mn, mx, even = 5, 14, True

for x in range(mn + int(bool(mn % 2) == even), mx + 1, 2):
    print(x)

int () преобразует внутреннее значение bool в 0 или 1, что является необходимым смещением для запуска.

PS Чтобы понять, почему вы исчерпали диапазон в вашем коде, предположите numbers = 33, вставьте его в код и посмотрите, что произойдет:

    if numbers%2 == 0:
        print(numbers)
    elif numbers%2 == 1:
        numbers += 1
        print(numbers)
...