Вся современная электронно-вычислительная техника строится на Булевой алгебре, которая оперирует истинностью и ложностью высказываний. Любой язык программирования содержит логические операции (в Python это and
, or
, not
).
Чаще всего для работы со сложными высказываниями прибегают к методу под названием «Таблица истинности».
Суть метода проста — рассматриваются все возможные значения входных переменных и для них вычисляется результат.
Разработайте программу, которая для введённого сложного логического высказывания строит таблицу истинности.
Формат ввода
Вводится логическое выражение от трех переменных (a, b, c) валидное для языка Python.
Формат вывода
Выведите таблицу истинности данного выражения.
Примечание
Для выполнения Python кода, записанного в строках, существуют две замечательные функции: exec
и eval
.
Пример
Ввод
not a or b and c
Вывод
a b c f
0 0 0 1
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 0
1 0 1 0
1 1 0 0
1 1 1 1
Ввод
a and not b and c
Вывод
a b c f
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 1
1 1 0 0
1 1 1 0
Решение
Достаточно простая задача. Необходимо с помощью product() подготовить различные каобинации значений переменных a, b и c и в цикле передать их вместе с выражением в качестве аргументов функции eval(). Полученый для каждого набора данных результат вывести в таблицу.
Посмотреть код
Решение
from itertools import product
expression = input()
print('a b c f')
for a, b, c in product([0, 1], repeat=3):
print(a, b, c, int(eval(expression, {'a': a, 'b': b, 'c': c})))
мне хватило
print(a, b, c, int(eval(s)))
в каких случаях может понадобится правильный вариант??
Передача переменных в виде словаря это вопрос безопасности. Если этот словарь пустой, то функция eval имеет доступ ко всем глобальным переменным вашей программы и может выполнять с ними действия. Передавая словарь, вы ограничиваете функцию только переменными и значениями упомянутыми в словаре. Хоть и не до конца.
Нелишне будет напомнить, что eval так же как и exec, если их использовать неаккуратно, это дыра в безопасности приложения.
Вот хорошая статья на эту тему: https://proglib.io/p/dinamicheskoe-vypolnenie-vyrazheniy-v-python-funkciya-eval-2020-05-14
И в дополнение, прошу прощения замечание, но стоит все же давать переменным хорошие имена. И если a, b, c в этой ситуации интуитивны, то s в остальном коде – совсем нет.
Абсолютно с вами согласен.
В моей ситуации я понимаю что я мог хотя бы написать string.
Мне хотелось бы использовать expression, далее я так и сделал.
Проблема в том, что правильное наименование тратит время и силы.
сейчас во время обучения я позволяю себе абстрактное именование.
Прошу подсказать прав ли я?
В моём виденье мне легче после написания кода причесать его, в том числе изменив имена.
Хотя понимаю что при написании кода будет легче ориентироваться.
Нежели используя s1, s2….
Буду заводить словарик с возможными названиями))
Expression
Token
Result
Hash
Count
Имеет смысл сразу тренироваться давать правильные имена. Пока пишете программу – напишете имя десяток раз и очень быстро выучите слова, которые будете часто использовать.