Как вернуть программу на начало ввода Python
Как сделать так чтобы после вывода конвертированного числа пользователь мог вернуться к началу выбора задания?
Отслеживать
задан 8 июн 2019 в 20:18
3 1 1 золотой знак 1 1 серебряный знак 3 3 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Оберните весь код в функцию, например, convert , запустите её 1 раз, а потом в цикле спрашивайте пользователя, хочет ли он запустить код ещё раз (или вовсе не спрашивайте). В зависимости от ответа вызывайте её или завершайте программу:
def convert(): z=int(input('Введите номер задания ')) if z == 1: m=float(input('Введите количество мегабайт ')) g=int g=m/1024 print(g) elif z==2: g=float(input('Введите количество гигабайт ')) m=int m=g*1024 print(m) print('Эта программа создана для конвертации мегабайт в гигабайты и обратно') print('1.-конвертация мегабайт в гигабайты') print('2.-конвертация гигабайты в мегабайты') convert() while True: flag = input('Ещё раз? [да/нет]: ') if flag == 'да': convert() else: break
UPD:
Ваш код написан не в Pythonic-style :). Как минимум, Вам не следует делать g=int , m=int :
def convert(): z = int(input('Введите номер задания: ')) if z == 1: m = float(input('Введите количество мегабайт: ')) g = m / 1024 print(g) elif z == 2: g = float(input('Введите количество гигабайт: ')) m = g * 1024 print(m) print( 'Эта программа создана для конвертации мегабайт в гигабайты и обратно' '\n' '1 - конвертация мегабайт в гигабайты' '\n' '2 - конвертация гигабайты в мегабайты' '\n' ) convert() while True: flag = input('Ещё раз? [да/нет]: ') if flag == 'да': convert() else: break
Python: Возврат из циклов
Рассмотрим алгоритм проверки простоты числа. Будем делить искомое число x на все числа из диапазона от двух до x — 1 и смотреть остаток. Если в этом диапазоне не найден делитель, который делит число x без остатка, значит, перед нами простое число.
В этом случае достаточно проверять числа не до x — 1 , а до половины числа. Например, 11 не делится на 2, 3, 4, 5. Но и дальше не будет делиться на числа больше своей половины. Значит, можно оптимизировать алгоритм и проверять деление только до x / 2 :
def is_prime(number): if number < 2: return False divider = 2 while divider False print(is_prime(2)) # => True print(is_prime(3)) # => True print(is_prime(4)) # => False
Если быть честными до конца, то для решения задачи хватит проверки чисел до значения квадратного корня number , но в нашем случае важно сосредоточиться на понимании работы с условиями внутри цикла
Представим, что по алгоритму последовательного деления на числа до x / 2 нашлось одно, которое делит без остатка. Значит, переданный аргумент — не простое число, и дальнейшие вычисления не имеют смысла. В этом месте стоит возврат False .
Если цикл отработал целиком, и не нашлось число, которое делит без остатка, значит, число — простое.
Задание
Реализуйте функцию is_contains_char() , которая проверяет с учётом регистра, содержит ли переданная строка указанную букву. Функция принимает два параметра:
- Строка
- Буква для поиска
print(is_contains_char('Hexlet', 'H')) # => True print(is_contains_char('Hexlet', 'h')) # => False print(is_contains_char('Awesomeness', 'm')) # => True print(is_contains_char('Awesomeness', 'd')) # => False
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
Определения
- Агрегация — Накопление результата во время итераций и работа с ним после цикла.
break, continue, pass#
В Python есть несколько операторов, которые позволяют менять поведение циклов по умолчанию.
Оператор break#
Оператор break позволяет досрочно прервать цикл:
- break прерывает текущий цикл и продолжает выполнение следующих выражений
- если используется несколько вложенных циклов, break прерывает внутренний цикл и продолжает выполнять выражения, следующие за блоком * break может использоваться в циклах for и while
Пример с циклом for:
In [1]: for num in range(10): . : if num 7: . : print(num) . : else: . : break . : 0 1 2 3 4 5 6
Пример с циклом while:
In [2]: i = 0 In [3]: while i 10: . : if i == 5: . : break . : else: . : print(i) . : i += 1 . : 0 1 2 3 4
Использование break в примере с запросом пароля (файл check_password_with_while_break.py):
username = input('Введите имя пользователя: ') password = input('Введите пароль: ') while True: if len(password) 8: print('Пароль слишком короткий\n') elif username in password: print('Пароль содержит имя пользователя\n') else: print('Пароль для пользователя <> установлен'.format(username)) # завершает цикл while break password = input('Введите пароль еще раз: ')
Теперь можно не повторять строку password = input(‘Введите пароль еще раз: ‘) в каждом ответвлении, достаточно перенести ее в конец цикла.
И, как только будет введен правильный пароль, break выведет программу из цикла while.
Оператор continue#
Оператор continue возвращает управление в начало цикла. То есть, continue позволяет «перепрыгнуть» оставшиеся выражения в цикле и перейти к следующей итерации.
Пример с циклом for:
In [4]: for num in range(5): . : if num == 3: . : continue . : else: . : print(num) . : 0 1 2 4
Пример с циклом while:
In [5]: i = 0 In [6]: while i 6: . : i += 1 . : if i == 3: . : print("Пропускаем 3") . : continue . : print("Это никто не увидит") . : else: . : print("Текущее значение: ", i) . : Текущее значение: 1 Текущее значение: 2 Пропускаем 3 Текущее значение: 4 Текущее значение: 5 Текущее значение: 6
Использование continue в примере с запросом пароля (файл check_password_with_while_continue.py):
username = input('Введите имя пользователя: ') password = input('Введите пароль: ') password_correct = False while not password_correct: if len(password) 8: print('Пароль слишком короткий\n') elif username in password: print('Пароль содержит имя пользователя\n') else: print('Пароль для пользователя <> установлен'.format(username)) password_correct = True continue password = input('Введите пароль еще раз: ')
Тут выход из цикла выполнятся с помощью проверки флага password_correct. Когда был введен правильный пароль, флаг выставляется равным True, и с помощью continue выполняется переход в начало цикла, перескочив последнюю строку с запросом пароля.
Результат выполнения будет таким:
$ python check_password_with_while_continue.py Введите имя пользователя: nata Введите пароль: nata12 Пароль слишком короткий Введите пароль еще раз: natalksdjflsdjf Пароль содержит имя пользователя Введите пароль еще раз: asdfsujljhdflaskjdfh Пароль для пользователя nata установлен
Оператор pass#
Оператор pass ничего не делает. Фактически, это такая заглушка для объектов.
Например, pass может помочь в ситуации, когда нужно прописать структуру скрипта. Его можно ставить в циклах, функциях, классах. И это не будет влиять на исполнение кода.
Пример использования pass:
In [6]: for num in range(5): . : if num 3: . : pass . : else: . : print(num) . : 3 4
Как сделать возврат в коде к определённому моменту?
Привет! Вопрос из разряда «Для чайников». Мне нужно сделать возврат к строке в начале кода. Допустим у меня есть условный оператор, при невыполнении условия которого мне нужно вернуться к началу программы или к предыдущему шагу. Как мне это сделать?
- Вопрос задан более трёх лет назад
- 8989 просмотров
1 комментарий
Простой 1 комментарий

привести код программы для начала
Решения вопроса 1

покоряю пик Балмера
есть несколько реализаций goto для python. можно заменить конструкцией
while True: . continue # это переход в начало . break
но проблема этой (и подобной) конструкций — выход из вложенных циклов
альтернатива — использовать try except
Ответ написан более трёх лет назад
Артём Майдуров @sylniyduxom Автор вопроса
что в данном случае значит True у цикла?
Артём Майдуров @sylniyduxom Автор вопроса
answer = 0 print('Здравствуйте! Вы открыли текстовый квест. Чтобы начать его, нажмите Enter') input() print('Перед началом квеста вы должны узнать, как нужно отвечать на вопросы.') print('На вопросы нужно отвечать строго числами, которые указаны перед вариантами ответов!') print('Начинаем! Приятной игры!') while True: print('Вы очнулись на корабле. Вокруг ни души. Нужно осмотреться. Здесь есть 3 прохода.') print('1)Прямо по коридору') print('2)По коридору налево') print('3)Зайти в каюту') answer = input() if answer == 1: print('Здесь ещё одна развилка. Есть три прохода. Выбирайте') print('1)Пройти в дверь прямо') print('2)Пройти направо по коридору') print('3)Повернуть налево и открыть тяжёлую дверь')
При нажатии 1 он заново воспроизводит всю программу. Что можно сделать с этим? Спасибо заранее
Ответы на вопрос 2

Владимир Куц @fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
not_success = True while (not_success):
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Артём Майдуров @sylniyduxom Автор вопроса
Вот код. Если нажать 1, то он воспроизведёт программу с начала, а мне это не нужно.
answer = 0 print('Здравствуйте! Вы открыли текстовый квест. Чтобы начать его, нажмите Enter') input() print('Перед началом квеста вы должны узнать, как нужно отвечать на вопросы.') print('На вопросы нужно отвечать строго числами, которые указаны перед вариантами ответов!') print('Начинаем! Приятной игры!') while answer != 5: print('Вы очнулись на корабле. Вокруг ни души. Нужно осмотреться. Здесь есть 3 прохода.') print('1)Прямо по коридору') print('2)По коридору налево') print('3)Зайти в каюту') answer = input() if answer == 1: print('Здесь ещё одна развилка. Есть три прохода. Выбирайте') print('1)Пройти в дверь прямо') print('2)Пройти направо по коридору') print('3)Повернуть налево и открыть тяжёлую дверь') answer = input()
Ответ написан более трёх лет назад

Вы так и собрались писать всю программу в одну линию? В результате код будет на 90% состоять из отступов.
Вам нужно один раз сохранить все эти блоки строк в плоском массиве и определять по каждому ответу, к какому (номеру) перейти следующим шагом.
Раз уж взялись реализовывать книжку-квест, так и следуйте ее логике: на стр. N есть вот такой текст и варианты перехода: на стр. L, M и K.
Артём Майдуров @sylniyduxom Автор вопроса
Adamos, дело в том, что о массивах я ничего ещё не знаю. Я учу Python не так давно, а этот квест — просто задание из программы обучения.

sylniyduxom, ну, вот вам и причина поизучать массивы.
Приведенный вами спагетти-код ничему хорошему вас не научит.
Артём Майдуров @sylniyduxom Автор вопроса
Adamos, ладно, спасибо! Я поищу кое-что в интернете. Просто программа обучения требует чтобы я учился строго всему в своё время.
Артём Майдуров @sylniyduxom Автор вопроса
Adamos, я знаю как объявлять простой массив типа massive = [‘Земля’, ‘Венера’, ‘Юпитер’, ‘Меркурий’]

sylniyduxom, ну, теперь можно переходить к симулятору противостояния Внутренних Планет и Внешних Спутников:
[
[‘Земля’, ‘Венера’, ‘Марс’, ‘Меркурий’],
[‘Ганимед’, ‘Титан’, ‘Каллисто’, ‘Альматея’]
]
%)