Найти - Пользователи
Полная версия: Оценить, понять, простить.
Начало » Python для новичков » Оценить, понять, простить.
1 2 3 4
marvellik
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())
первый ввод
>> иванов иван
Иванов Иван
>>>
и ввод с пустой строкой
>>
Имя не может быть пустой строкой!
>>
Имя не может быть пустой строкой!
>> иванов иван
# как видно функция вернула пустую строку.
>>>

лучше через цикл while с ограниченным количеством попыток и оповещением об этом пользователя
 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()
Babay82
marvellik
Babay82 ну это должен быть очень упоротый пользователь что бы более 990 раз вводить пустую строку - это раз.рекурсию еще надо очень хорошо понять потому как в вашем случае после второго правильного ввода функция вернет пустую строку то есть ту что была задана изначально как пустая.
Спасибо.C рекурсией погорячился, если честно ещё даже не начинал разбирать эту тему, а по поводу очень упоротого пользователя, здесь же на форуме учили , что нужно уметь предусмотреть ВСЕ варианты, а этот хоть и маловероятен но не исключен, в частности мне , нажав клавишу Enter и держа в нажатом положении, потребовалось меньше 2х минут что - бы вызвать исключение.
Babay82
И исправленный вариант с рекурсией
 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 
Если человек нормальный то ему 10 попыток много, else - пусть развлекается
rami
Babay82
C рекурсией погорячился, если честно ещё даже не начинал разбирать эту тему, а по поводу очень упоротого пользователя, здесь же на форуме учили , что нужно уметь предусмотреть ВСЕ варианты, а этот хоть и маловероятен но не исключен, в частности мне , нажав клавишу Enter и держа в нажатом положении, потребовалось меньше 2х минут что - бы вызвать исключение.
Рекурсия и обработка исключений тут не нужна, количество попыток ограничиваем в цикле for:
 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()                 #хлопок дверью...

Вообще, у вашей программы много недостатков:
1. обращение к пользователю не выдержано в едином стиле, то к нему обращаетесь на “вы”, то на “ты” (эй, вы трое, я тебе говорю, оба подойдите сюда )

2. лишние куски кода, переменные и не нужная обработка данных, код можно и нужно упрощать

3. выводить (в консоль) с помощью табуляции данные в виде таблицы — не есть хорошо, столбцы ломаются, сравните:
 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)
Babay82
rami
Рекурсия и обработка исключений тут не нужна, количество попыток ограничиваем в цикле for:
Чем плоха рекурсия, в данном случае?
rami
лишние куски кода, переменные и не нужная обработка данных, код можно и нужно упрощать
Например?
rami
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)
В данной ситуации я отталкивался от примеров автора учебника, естественно, что автор приводит далеко не все способы и методы, про ljust() там вообще ни слова(кстати, спасибо), про это я уже писал выше.
И цель создания программы несколько иная, поэтому упор на интерфейс не ставился, ибо ,как говориться, это мы не проходили.Задачу свою программа выполнила - очень много интересного и полезного узнал из
всех ответов в посте. Спасибо.
rami
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Ну ты , вообще, неудачник!")     #не уложимся в число попыток — будем читать о себе любимом...

Остальные функции тоже можно очистить от лишнего.
py.user.next
Babay82
Чем плоха рекурсия, в данном случае?
Рекурсию можно делать только там, где есть чёткая граница выхода из неё либо где есть гарантированная оптимизация бесконечной рекурсии, которая не заполняет память.
Ни того, ни другого у тебя в данном случае нет: рекурсия не имеет явно заданной границы выхода и будет продолжаться, пока память не переполнится.

На то, что пользователь что-то там не наберёт, расчитывать нельзя, так как вместо набирающего пользователя можно поставить набирающую программу, которая не только наберёт тысячу вводов, но и сделает это за три секунды.


tags: recursion
Babay82
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Ну ты , вообще, неудачник!”) #не уложимся в число попыток — будем читать о себе любимом…
Спасибо.
Как я писал изначально , программа создавалась из ранее выполненных заданий, этот кусок кода как раз задание после прохождения цикла while.
Строчка print(f“\tТы отгадал число всего за {score+1} шагов!”) - В принципе догадаться можно , что это выводится счетчик итераций в цикле, но о том что так можно делать, как и зачем вообще используются фигурные скобки в строке, впервые вижу и слышу(кстати что это?,в книге естественно далеко не вся информация, и в интернете тоже не всегда и все примеры ).
И еще мне не совсем понятно откуда берется информация , что я вне диапазона , если в вашей функции об этом ни строчки.(и как это,???)
Командой return мы принудительно завершаем функцию? если я правильно понял?
Понятно , что код можно и нужно упрощать, но естественно что , вам с вашим опытом сделать это проще, а я писал имея при себе только мааааленький багажик знаний, который может поместиться в кармашке.
С рекурсией понятно.
py.user.next
То-же спасибо.
rami
Babay82
Строчка print(f“\tТы отгадал число всего за {score+1} шагов!”) - В принципе догадаться можно , что это выводится счетчик итераций в цикле, но о том что так можно делать, как и зачем вообще используются фигурные скобки в строке, впервые вижу и слышу(кстати что это?,в книге естественно далеко не вся информация, и в интернете тоже не всегда и все примеры ).
Внимательно прочитайте книгу, выполните все примеры и забросьте эту книгу на чердак, она вам больше не пригодится. Нужно читать документацию и встроенный help(), вот например документация о строковых методах в Python 3.7 там всё написано и даже с примерами.

Babay82
И еще мне не совсем понятно откуда берется информация , что я вне диапазона , если в вашей функции об этом ни строчки.(и как это,???)
Командой return мы принудительно завершаем функцию? если я правильно понял?
Если вы о строке кода:
 print("\n\tНу ты , вообще, неудачник!")     #не уложимся в число попыток — будем читать о себе любимом...
то она выполняется после завершения цикла, т.е. если пользователь не угадал за указанное число попыток (проходов цикла), но если пользователь угадал, сообщаем ему, записываем данные в файл и return немедленно завершает функцию (в этом случае мы до “неудачника” просто не дойдём).
Babay82
rami
Внимательно прочитайте книгу, выполните все примеры и забросьте эту книгу на чердак, она вам больше не пригодится. Нужно читать документацию и встроенный help(), вот например документация о строковых методах в Python 3.7 там всё написано и даже с примерами.
Это само собой, просто это мой первый опыт в программировании вообще, я стараюсь при выполнении заданий брать информацию и из других источников, просто многое вообще приходит с опытом( за ваш тоже спасибо).
rami
Если вы о строке кода:
print(“\n\tНу ты , вообще, неудачник!”) #не уложимся в число попыток — будем читать о себе любимом…
то она выполняется после завершения цикла, т.е. если пользователь не угадал за указанное число попыток (проходов цикла), но если пользователь угадал, сообщаем ему, записываем данные в файл и return немедленно завершает функцию (в этом случае мы до “неудачника” просто не дойдём).
Офлайн

Нет, тут то как раз все понятно. Я о том , что если я называю число которое больше или меньше указанного диапазона( допустим, диапазон 100 а я называю -10 или 150) программа выводит сообщение что я вне диапазона и счетчик не идет. В моем коде это прописано условием
rami
elif response <= 1 or response >= interval:
print(“Это число вне диапазона, пожалуйста введите другое!”)
А в вашем я не нашел, но тем не менее оно срабатывает. Очень заинтересовал момент.
И вообще, я читал что цикл for в Python используется чаще чем while, но с помощью вашего примера я начинаю понимать почему. Дело в том , что поисковики как правило выкидывают сайты со стандартным описанием работы циклов функций и т.д.
Кстати у меня вопрос, почему for не работает с бинарными файлами, например если мне нужно провести итерации со строками в файле, а с while работает? Столкнулся с такой проблемой , как оказалось везде примеры подобных операций только с while.
 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")
    
Вот здесь например, изначально пытался с помощью for, не работало. Полез в инет, нашел только пару примеров с while?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB