Форум сайта python.su
Babay82 ну это должен быть очень упоротый пользователь что бы более 990 раз вводить пустую строку - это раз.рекурсию еще надо очень хорошо понять потому как в вашем случае после второго правильного ввода функция вернет пустую строку то есть ту что была задана изначально как пустая.
def acquaintance_1(): response = input('>> ') if not response: try: print("Имя не может быть пустой строкой!") acquaintance_1() except RecursionError: print("\n\nНа этом мы с вами попрощаемся!") sys.exit() return response. strip(). title() print(acquaintance_1())
def acquaintance_1(): response = input('>> ') attempt = 10 while not response: attempt -= 1 print("Имя не может быть пустой строкой!") print(f"Осталось {attempt} попыток") response = input('>> ') if attempt == 1: print("\n\nНа этом мы с вами попрощаемся!") sys.exit() return response. strip(). title()
Офлайн
marvellikСпасибо.C рекурсией погорячился, если честно ещё даже не начинал разбирать эту тему, а по поводу очень упоротого пользователя, здесь же на форуме учили , что нужно уметь предусмотреть ВСЕ варианты, а этот хоть и маловероятен но не исключен, в частности мне , нажав клавишу Enter и держа в нажатом положении, потребовалось меньше 2х минут что - бы вызвать исключение.
Babay82 ну это должен быть очень упоротый пользователь что бы более 990 раз вводить пустую строку - это раз.рекурсию еще надо очень хорошо понять потому как в вашем случае после второго правильного ввода функция вернет пустую строку то есть ту что была задана изначально как пустая.
Офлайн
И исправленный вариант с рекурсией
def acquaintance_1(question): response = input(question). strip(). title() if not response: try: print("Имя не может быть пустой строкой!") response = acquaintance_1(question) except RecursionError: print("\n\nНа этом мы с вами попрощаемся!") sys.exit() return response
Офлайн
Babay82Рекурсия и обработка исключений тут не нужна, количество попыток ограничиваем в цикле for:
C рекурсией погорячился, если честно ещё даже не начинал разбирать эту тему, а по поводу очень упоротого пользователя, здесь же на форуме учили , что нужно уметь предусмотреть ВСЕ варианты, а этот хоть и маловероятен но не исключен, в частности мне , нажав клавишу Enter и держа в нажатом положении, потребовалось меньше 2х минут что - бы вызвать исключение.
def acquaintance_1(question): for i in range(5): #ограничиваем количество попыток response = input(question).strip().title() if response: return response else: print("Имя не может быть пустой строкой!") print(f"\n{i+1} неудачных попыток это слишком!!!\nНа этом мы с вами попрощаемся!") sys.exit() #хлопок дверью...
lst = [['СЛОЖНОСТЬ', 'ИМЯ', 'РЕКОРД'], ['1', 'Компьютер', 1234567], ['1', 'rami', 12], ['123456789', 'абракадабра', 987], ['12345', 'Babay82', 5]] for i, name, score in lst: print('\t', i.ljust(12), name.ljust(12), score) print('\n\nа теперь как у вас с табуляцией:\n') for i, name, score in lst: print("\t\t", i, "\t\t\t", name, "\t\t", score)
Офлайн
ramiЧем плоха рекурсия, в данном случае?
Рекурсия и обработка исключений тут не нужна, количество попыток ограничиваем в цикле for:
ramiНапример?
лишние куски кода, переменные и не нужная обработка данных, код можно и нужно упрощать
ramiВ данной ситуации я отталкивался от примеров автора учебника, естественно, что автор приводит далеко не все способы и методы, про ljust() там вообще ни слова(кстати, спасибо), про это я уже писал выше.
3. выводить (в консоль) с помощью табуляции данные в виде таблицы — не есть хорошо, столбцы ломаются, сравните:
lst = [,
,
,
,
]
for i, name, score in lst:
print('\t', i.ljust(12), name.ljust(12), score)
print('\n\nа теперь как у вас с табуляцией:\n')
for i, name, score in lst:
print(“\t\t”, i, “\t\t\t”, name, “\t\t”, score)
Офлайн
Babay82Если речь об учебном примере с рекурсией, то нормально, а в реальной программе нужно смотреть, что полезного даёт рекурсия по сравнению с циклами — в данном коде ничего полезного, только позволяет упоротому пользователю нагружать компьютер рекурсивными вызовами до выброса исключения, вместо того, чтобы ограничить число попыток в простом цикле.
Чем плоха рекурсия, в данном случае?
ramiНапример функцию:
2. лишние куски кода, переменные и не нужная обработка данных, код можно и нужно упрощать
def user_game(interval, name): """Пользователь отгадывает число""" computer_choise = random.randrange(interval) + 1 score = 0 response = None while response != computer_choise : response = ask_number("\n\n\tНазывай число в заданном диапазоне.", interval) if response > computer_choise : score += 1 print("\n\tМеньше") elif response < computer_choise : score += 1 print("\n\tБольше") elif response == computer_choise : score += 1 print("\tМолодец, это действительно" , computer_choise) print("\tТы отгадал число всего за", score ,"шагов!") elif response <= 1 or response >= interval: print("Это число вне диапазона, пожалуйста введите другое!") if score == 10: print("\n\tНу ты , вообще, неудачник!") break records_list_4(score, interval, name)
def user_game(interval, name): """Пользователь отгадывает число""" computer_choise = random.randrange(interval) + 1 #компьютер загадал число for score in range(10): #каждый шаг цикла — одна попытка response = ask_number("\n\tНазывай число в заданном диапазоне. ", interval) if computer_choise < response: #если меньше print("\n\tМеньше") elif computer_choise > response: #если больше print("\n\tБольше") else: #значит угадали print("\n\tМолодец, это действительно" , computer_choise) print(f"\tТы отгадал число всего за {score+1} шагов!") records_list_4(score, interval, name) #если угадал — записываем в файл return #угадали, записали, теперь выходим из функции print("\n\tНу ты , вообще, неудачник!") #не уложимся в число попыток — будем читать о себе любимом...
Офлайн
Babay82Рекурсию можно делать только там, где есть чёткая граница выхода из неё либо где есть гарантированная оптимизация бесконечной рекурсии, которая не заполняет память.
Чем плоха рекурсия, в данном случае?
Отредактировано py.user.next (Апрель 15, 2019 01:34:41)
Офлайн
ramiСпасибо.
Можно переписать так:
def user_game(interval, name):
“”“Пользователь отгадывает число”“”
computer_choise = random.randrange(interval) + 1 #компьютер загадал число
for score in range(10): #каждый шаг цикла — одна попытка
response = ask_number(“\n\tНазывай число в заданном диапазоне. ”, interval)
if computer_choise < response: #если меньше
print(“\n\tМеньше”)
elif computer_choise > response: #если больше
print(“\n\tБольше”)
else: #значит угадали
print(“\n\tМолодец, это действительно” , computer_choise)
print(f“\tТы отгадал число всего за {score+1} шагов!”)
records_list_4(score, interval, name) #если угадал — записываем в файл
return #угадали, записали, теперь выходим из функции
print(“\n\tНу ты , вообще, неудачник!”) #не уложимся в число попыток — будем читать о себе любимом…
Офлайн
Babay82Внимательно прочитайте книгу, выполните все примеры и забросьте эту книгу на чердак, она вам больше не пригодится. Нужно читать документацию и встроенный help(), вот например документация о строковых методах в Python 3.7 там всё написано и даже с примерами.
Строчка print(f“\tТы отгадал число всего за {score+1} шагов!”) - В принципе догадаться можно , что это выводится счетчик итераций в цикле, но о том что так можно делать, как и зачем вообще используются фигурные скобки в строке, впервые вижу и слышу(кстати что это?,в книге естественно далеко не вся информация, и в интернете тоже не всегда и все примеры ).
Babay82Если вы о строке кода:
И еще мне не совсем понятно откуда берется информация , что я вне диапазона , если в вашей функции об этом ни строчки.(и как это,???)
Командой return мы принудительно завершаем функцию? если я правильно понял?
print("\n\tНу ты , вообще, неудачник!") #не уложимся в число попыток — будем читать о себе любимом...
Офлайн
ramiЭто само собой, просто это мой первый опыт в программировании вообще, я стараюсь при выполнении заданий брать информацию и из других источников, просто многое вообще приходит с опытом( за ваш тоже спасибо).
Внимательно прочитайте книгу, выполните все примеры и забросьте эту книгу на чердак, она вам больше не пригодится. Нужно читать документацию и встроенный help(), вот например документация о строковых методах в Python 3.7 там всё написано и даже с примерами.
ramiНет, тут то как раз все понятно. Я о том , что если я называю число которое больше или меньше указанного диапазона( допустим, диапазон 100 а я называю -10 или 150) программа выводит сообщение что я вне диапазона и счетчик не идет. В моем коде это прописано условием
Если вы о строке кода:
print(“\n\tНу ты , вообще, неудачник!”) #не уложимся в число попыток — будем читать о себе любимом…
то она выполняется после завершения цикла, т.е. если пользователь не угадал за указанное число попыток (проходов цикла), но если пользователь угадал, сообщаем ему, записываем данные в файл и return немедленно завершает функцию (в этом случае мы до “неудачника” просто не дойдём).
Офлайн
ramiА в вашем я не нашел, но тем не менее оно срабатывает. Очень заинтересовал момент.
elif response <= 1 or response >= interval:
print(“Это число вне диапазона, пожалуйста введите другое!”)
def demonstration_records(file_name, mode): """Выводит список рекордов на экран""" print_record =[] with open(file_name, mode) as records_list: while True: try: record = pickle.load(records_list) print_record.append(record) except: break print_record.sort(reverse=True) print_record = print_record[:3] for i in print_record: score, name = i print("\t\t", name,"\t\t", score, "баллов\n\n")
Офлайн