Ошибка. Имя/переменная "тут имя" не определено # работа с функцией eval()

неЕгор

Новичок
Пользователь
Дек 9, 2022
4
1
1

Есть код:
Python:
a = "4 * 100 - 54"
x = input("Реши пример: " + a + " = ")
z = type(eval(x))
if z == str:
    print("Цифрами пиши, цифрами! Арабскими!")
elif (z == int or z == float) and int(x) == eval(a):
    print("Твой ответ: " + x, "\t" * 2, "Верный ответ: " + str(eval(a)))
    print("Надо же, даже совпало...")
elif (z == int or z == float) and int(x) != eval(a):
    print("Твой ответ: " + x, "\t" * 2, "Верный ответ: " + str(eval(a)))
    print("Э, иди математику учи!")
else:
    print("Это вообще абракадабра какая-то... Ты идиот?")

Ошибка в третьей строке. Если ввести текст (набор символов), то на этапе eval(x) все остановится с таким ответом:
File "C:\Users\задача1.py", line 3, in <module>
z = type(eval(x))
^^^^^^^
File "<string>", line 1, in <module>
NameError: name 'scdv' is not defined

'scdv' - это естественно был ввод.
Читаю книжки, где пишется про eval(), пытаюсь на форумах найти пояснения, но кроме "удачного" и "полезного" использования функции пояснений нет, хотя в книге написано, что eval() работает с текстом и выводит набор символов (если не ошибаюсь в книге Васильева это сказано). Сильно тапком не бейте, я еще плохо понимаю специфическую терминологию, можно сказать только из excel'я вырвался, до сих пор ЕСЛИ пишу по тому принципу.
Итак вопрос - почему интерпритатор выдает ошибку? Я так понимаю, что функция выводит набор символов, а интерпритатор говорит, что этому набору символов ничего не соответствует, так?
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
Ну как доберусь до замены eval()
А чего тут добираться-то? :LOL:
Python:
a_str = "4 * 100 - 54"
a = 4 * 100 - 54
goal = 0
not_int = 0

while goal == 0:
    x = input("Реши пример: " + a_str + " = ")
    # z = type(x) - это тут не нужно! Любой ввод из input имеет тип str
    try:
        x = int(x)
        if x == a:
            print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
            print("Надо же, даже совпало...")
            goal = 1
        else:
            print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
            print("Э, иди математику учи! Ты идиот?")
            not_int = 0
    except:
        not_int = 1

    if not_int == 1:
        try:
            x = float(x)
            if x == a:
                print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
                print("Надо же, даже совпало...")
                goal = 1
            else:
                print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
                print("Э, иди математику учи! Ты идиот?")
                not_int = 0
        except:
            print("Цифрами пиши, цифрами! Арабскими!")
            not_int = 0
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
374
108
43
Ты это имел ввиду?
о нет, ты сделал ещё больше простыню:ROFLMAO:

Вот что я имел ввиду:

Python:
a_str = "4 * 100 - 54"
a = 4 * 100 - 54

while 1:
    try:
        x = float(input(f'Реши пример: {a_str} = '))
    except ValueError:
        print("Цифрами пиши, цифрами! Арабскими!")
        continue

    print(f"Твой ответ: {x}\t\tВерный ответ: {a}")
    if x == a:
        print("Надо же, даже совпало...")
        break
    else:
        print("Э, иди математику учи! Ты идиот?")

Но, честно говоря, не совсем понятно зачем применять цикл, если при вводе не правильного ответа ты показываешь правильный. Юзер ведь подсмотрит и при следующей попытке введет верный
 
  • Мне нравится
Реакции: Malenkey

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 589
459
83
Ну повторю в сотый раз, не стоит использовать eval!
Eval выполняет код, который вы ему дали! У вашей задачи есть другое решение
Ошибка из за того, что eval думает, что вводимый текст это переменная и пытаться выполнить ваш код, но не находит переменную, которую вы написали
И проверка типов делается через функцию isinstance()
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 589
459
83
Это не я показываю! Это показывает тот, кто эту тему создал! :giggle: А я просто не стал ему на это указывать! Пусть и дальше говорит "А я вам ни за что не расскажу, что меня зовут Петя!" :ROFLMAO: Кстати! Помню, когда я еще кодил на "Алгоритме"*, читал где-то про кейгены для взлома ключей программ ,что принцип их работы в том, что они как-то перехватывают момент, когда программа проверяет введенный ключ и сравнивает его с тем значением, которое должно быть введено. А кейген то значение, с которым сравнивается, и перехватывает!

* - Вот чем "Алгоритм" был удобнее "IDLE" питоновского, так это наличием графического интерфейса, где ты располагал и перемещал на окне все виджеты. И сразу видел результат. А в "IDLE" каждый раз нажимай "F5", чтобы увидеть изменения, внесенные тобой в виджеты "tkinter"'а. Ты не в курсе, есть ли ВИЗУАЛЬНАЯ среда программирования на "Питоне"? Уж не "Visual Studio" ли?
в qt есть дизайнер
 
  • Мне нравится
Реакции: Malenkey

неЕгор

Новичок
Пользователь
Дек 9, 2022
4
1
1
Ну повторю в сотый раз, не стоит использовать eval!
Eval выполняет код, который вы ему дали! У вашей задачи есть другое решение
Ошибка из за того, что eval думает, что вводимый текст это переменная и пытаться выполнить ваш код, но не находит переменную, которую вы написали
И проверка типов делается через функцию isinstance()
Ну как доберусь до замены eval(), то перестану им пользоваться в таком ключе. Спасибо за ответ.
Кстати, isinstance() мне однозначно выведет str, ведь input любое значение текстом принимает. А мне нужно, чтобы определяло, можно ли введенные данные перевести в какой либо тип. То есть если ввели число, то его можно сделать int или float. Если ввели символы или буквы, то никуда от str не деться. Eval() справляется, но считает текст переменной. А есть функция, которая может то же, но не считает текст переменной? Просто если напишу например:
x = input()
isinstance(int(x)) # то при вводе текста у меня будет ошибка на этапе int(x)

Или создавать такую функцию самому?
 
Последнее редактирование:

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
374
108
43
А чего тут добираться-то? :LOL:
Python:
a_str = "4 * 100 - 54"
a = 4 * 100 - 54
goal = 0
not_int = 0

while goal == 0:
    x = input("Реши пример: " + a_str + " = ")
    # z = type(x) - это тут не нужно! Любой ввод из input имеет тип str
    try:
        x = int(x)
        if x == a:
            print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
            print("Надо же, даже совпало...")
            goal = 1
        else:
            print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
            print("Э, иди математику учи! Ты идиот?")
            not_int = 0
    except:
        not_int = 1

    if not_int == 1:
        try:
            x = float(x)
            if x == a:
                print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
                print("Надо же, даже совпало...")
                goal = 1
            else:
                print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
                print("Э, иди математику учи! Ты идиот?")
                not_int = 0
        except:
            print("Цифрами пиши, цифрами! Арабскими!")
            not_int = 0
это что за простыня такая?:D
 

неЕгор

Новичок
Пользователь
Дек 9, 2022
4
1
1
А чего тут добираться-то? :LOL:
Python:
a_str = "4 * 100 - 54"
a = 4 * 100 - 54
goal = 0
not_int = 0

while goal == 0:
    x = input("Реши пример: " + a_str + " = ")
    # z = type(x) - это тут не нужно! Любой ввод из input имеет тип str
    try:
        x = int(x)
        if x == a:
            print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
            print("Надо же, даже совпало...")
            goal = 1
        else:
            print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
            print("Э, иди математику учи! Ты идиот?")
            not_int = 0
    except:
        not_int = 1

    if not_int == 1:
        try:
            x = float(x)
            if x == a:
                print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
                print("Надо же, даже совпало...")
                goal = 1
            else:
                print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
                print("Э, иди математику учи! Ты идиот?")
                not_int = 0
        except:
            print("Цифрами пиши, цифрами! Арабскими!")
            not_int = 0
Спасибо за ответ. Можно еще пару пояснений? 1-у почему не ломается программа на этапе x = int(x)? И почему именно while с переменной goal (они вообще нужны тут? пока не совсем понимаю зачем)....
А, стоп, пока писал понял почему не ломается на этапе х = int(x), а вот while все еще актуально.

Всё, понял что и зачем. Спасибо.
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
это что за простыня такая?:D
А чего тебе не нравится-то!? :D eval() в моей простыне видишь? Вот и я не вижу! :p Что и требовалось доказать! :cool:
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
Спасибо за ответ. Можно еще пару пояснений? 1-у почему не ломается программа на этапе x = int(x)? И почему именно while с переменной goal (они вообще нужны тут? пока не совсем понимаю зачем)....
А, стоп, пока писал понял почему не ломается на этапе х = int(x), а вот while все еще актуально.

Всё, понял что и зачем. Спасибо.
Незачто! Обращайся! ;)
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
374
108
43
А чего тебе не нравится-то!? :D eval() в моей простыне видишь? Вот и я не вижу! :p Что и требовалось доказать! :cool:
Я к тому, что ты нарушаешь принцип DRY. А можно было не писать 2 раза одно и то же))
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
А можно было не писать 2 раза одно и то же))
Поясни на коде, а не на словах, пжста! :sneaky: Пощеголяй своим примером кода! ;)
Ты это имел ввиду?
Python:
a_str = "4 * 100 - 54"
a = 4 * 100 - 54
goal = 0
not_int = 0

def check():
    global a
    global not_int
    global goal
    if x == a:
        print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
        print("Надо же, даже совпало...")
        goal = 1
    else:
        print("Твой ответ: " + str(x), "\t" * 2, "Верный ответ: " + str(a))
        print("Э, иди математику учи! Ты идиот?")
        not_int = 0

while goal == 0:
    x = input("Реши пример: " + a_str + " = ")
    # z = type(x) - это тут не нужно! Любой ввод из input имеет тип str
    try:
        x = int(x)
        check()
    except:
        not_int = 1
       
    if not_int == 1:
        try:
            x = float(x)
            check()
        except:
            print("Цифрами пиши, цифрами! Арабскими!")
            not_int = 0
 
Последнее редактирование:

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
о нет, ты сделал ещё больше простыню:ROFLMAO:

Вот что я имел ввиду:

Python:
a_str = "4 * 100 - 54"
a = 4 * 100 - 54

while 1:
    try:
        x = float(input(f'Реши пример: {a_str} = '))
    except ValueError:
        print("Цифрами пиши, цифрами! Арабскими!")
        continue

    print(f"Твой ответ: {x}\t\tВерный ответ: {a}")
    if x == a:
        print("Надо же, даже совпало...")
        break
    else:
        print("Э, иди математику учи! Ты идиот?")

Но, честно говоря, не совсем понятно зачем применять цикл, если при вводе не правильного ответа ты показываешь правильный. Юзер ведь подсмотрит и при следующей попытке введет верный
Браво! :D Краткость - сестра таланта!
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
Но, честно говоря, не совсем понятно зачем применять цикл, если при вводе не правильного ответа ты показываешь правильный. Юзер ведь подсмотрит и при следующей попытке введет верный
Это не я показываю! Это показывает тот, кто эту тему создал! :giggle: А я просто не стал ему на это указывать! Пусть и дальше говорит "А я вам ни за что не расскажу, что меня зовут Петя!" :ROFLMAO: Кстати! Помню, когда я еще кодил на "Алгоритме"*, читал где-то про кейгены для взлома ключей программ ,что принцип их работы в том, что они как-то перехватывают момент, когда программа проверяет введенный ключ и сравнивает его с тем значением, которое должно быть введено. А кейген то значение, с которым сравнивается, и перехватывает!

* - Вот чем "Алгоритм" был удобнее "IDLE" питоновского, так это наличием графического интерфейса, где ты располагал и перемещал на окне все виджеты. И сразу видел результат. А в "IDLE" каждый раз нажимай "F5", чтобы увидеть изменения, внесенные тобой в виджеты "tkinter"'а. Ты не в курсе, есть ли ВИЗУАЛЬНАЯ среда программирования на "Питоне"? Уж не "Visual Studio" ли?
 
Последнее редактирование:
  • Мне нравится
Реакции: 4olshoy_blen

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
Спасибо! (y) Все время про него забываю! :p
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
в qt есть дизайнер
ERTETERT.png
Вот этот? Он у меня в папке "Program files" с "DAZ Studio" приложен. :) И ты как там, создаешь интерфейс, он сам все методы "pack", "grid" прописывает? Потом на выходе дает тебе файл с готовым интерфейсом. А ты уже потом в твоем коде с логикой программы просто подключаешь этот файл с интерфейсом как внешнюю библиотеку? Я правильно понял?
 
Последнее редактирование:

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
в qt есть дизайнер
А у "Visual Studio" есть подобная возможность?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 589
459
83
Посмотреть вложение 2130
Вот этот? Он у меня в папке "Program files" с "DAZ Studio" приложен. :) И ты как там, создаешь интерфейс, он сам все методы "pack", "grid" прописывает? Потом на выходе дает тебе файл с готовым интерфейсом. А ты уже потом в твоем коде с логикой программы просто подключаешь этот файл с интерфейсом как внешнюю библиотеку? Я правильно понял?
да
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 589
459
83
А у "Visual Studio" есть подобная возможность?
только для си и шарпов, но туда можно подключить qt
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
374
108
43
Пусть и дальше говорит "А я вам ни за что не расскажу, что меня зовут Петя!"
:ROFLMAO:
 

неЕгор

Новичок
Пользователь
Дек 9, 2022
4
1
1
Это не я показываю! Это показывает тот, кто эту тему создал!
У меня в коде нет цикла. Поэтому и ответ сразу, чтоб человек подумал, а где ж он накосячил.

4olshoy_blen сказал(а):

x = float(input(f'Реши пример: {a_str} = '))

except ValueError:

А вот за этот прием спасибо, обязательно возьму на вооружение.
 

Форум IT Специалистов