Как можно упростить цикл while?

Хочется упростить код, который состоит из нескольких циклов while. Каждый из циклов - возобновляет свое собственное сообщение со своими данными, так что просто сделать 1 цикл с одинаковым для всех сообщением - не в рамках задачи.

while True:
    number_maps_1_3 = int(input(f"Введите кол-во для {interval_1}: "))
    if number_maps_1_3 <= levels_1_3:
        break
    print(f'ВНИМАНИЕ! Превышено. Введите меньшее кол-во.', end="\n")

while True:
    number_maps_4_7 = int(input(f"Введите кол-во для {interval_2}: "))
    if number_maps_4_7 <= levels_4_7:
        break
    print(f'ВНИМАНИЕ! Превышено. Введите меньшее кол-во.', end="\n")

while True:
    number_maps_8_11 = int(input(f"Введите кол-во карт для {interval_3}: "))
    if number_maps_8_11 <= levels_8_11:
        break
    print(f'ВНИМАНИЕ! Превышено. Введите меньшее кол-во.', end="\n")

Ответы (2 шт):

Автор решения: CrazyElf

Учитесь писать функции, как вам справедливо заметили в комментариях. Просто берёте весь повторяющийся функционал, и оформляете его функцией. А всё, что в разных фрагментах кода различается - передаёте в функцию в виде аргументов и используете их:

def input_while(text, limit):
    while True:
        n = int(input(f"Введите кол-во для {text}: "))
        if n <= limit:
            return n
        print(f'ВНИМАНИЕ! Превышено. Введите меньшее кол-во.', end="\n")

number_maps_1_3 = input_while(interval_1, levels_1_3)
number_maps_4_7 = input_while(interval_2, levels_4_7)
number_maps_8_11 = input_while(interval_3, levels_8_11)

Дальше можно ещё код сократить, он тут тоже явно повторяется и напрашивается какой-то цикл по разным данным и одинаковому коду. Совершенствовать код можно бесконечно.

→ Ссылка
Автор решения: Vitalizzare ушел в монастырь

По хорошему, у вас два цикла. Во внешнем вы перебираете разные пары interval, level и в зависимости от них фильтруете входящие значения во внутреннем. Соответственно, оптимизацию вы можете провести на уровне структурирования данных, чтобы по ним можно было организовать внешний цикл. Например:

interval_level_seq = [
    ['A', 10],
    ['B', 20],
    ['C', 30],
]
number_maps = []
for interval, level in interval_level_seq:
    while True:
        number = input(f"Введите кол-во для {interval}: ")
        try:
            number = int(number)
            assert number <= level
            number_maps.append(number)
            break
        except ValueError:
            print('ВНИМАНИЕ! Нужно ввести целое число')
        except AssertionError:
            print(f'ВНИМАНИЕ! Число не должно превышать {level}')
→ Ссылка