2015-10-04 4 views
0

Так что я пытаюсь реализовать логический оператор XOR в Python. Сначала я спрашиваю у пользователя, сколько входных данных они хотят протестировать (4 - TT, TF, FT, FF). Я знаю, что XOR оценивает T & T-> F, T & F-> T, F & T-> T, F & F-> F.Реализация XOR в Python

Я сохраняю первое логическое значение, которое я получаю от пользователя в переменной P в виде строки. Затем я конвертирую в boolean. Как так ...

P = input("Enter boolean number 1: ") 
    P = bool(P) 

Я не отбрасывают вход в BOOL сразу, так как любой непустой строки приведет Правда, независимо от строки будучи «Ложное».

У меня есть таблица истинности XOR, установленная для четырех возможных условий, упомянутых выше, как четыре отдельных оператора if, а затем просто напечатайте («P xor Q - False» или «P xor Q is True») все в зависимости от таблицы истинности для XOR.

Вся эта логика находится внутри цикла for, который отсчитывает от 1 до 0 от ввода пользователем количества входных данных, которые они хотели бы сделать.

Когда я запускаю эту программу, независимо от того, что вводит пользователь, оператор печати «P xor Q is False».

Я просто не могу понять, почему! Я чувствую, что решение довольно просто, что меня беспокоит, поэтому любая помощь в правильном направлении будет оценена, спасибо!

Вот мой код:

numOfInputs = int(input("Enter the number of inputs: ")) 

for num in range(numOfInputs, 0, -1): 
    print() 

    P = input("Enter the first boolean: ") 
    P = bool(P) 
    Q = input("Enter the second boolean: ") 
    Q = bool(Q) 

    print() 

    if(P == True and Q == True): 
     print("P xor Q is False") 
    if(P == True and Q == False): 
     print("P xor Q is True") 
    if(P == False and Q == True): 
     print("P xor Q is True") 
    if(P == False and Q == False): 
     print("P xor Q is False") 
+0

«Я не отбрасывают вход в bool "- но вы делаете это в строке' P = bool (P) '. Почему вы думаете, что нет? – user2357112

+0

Является ли это тем же самым, что и P = bool (input (...))? Я посчитал, что что-нибудь, кроме пустой строки, будет оценено как «True», если сразу будет выпущено. –

+0

Любая непустая строка преобразуется в True как логическое. Это не изменится, если вы переместите вызов 'bool' в другую строку. – user2357112

ответ

0

Ваш код работает отлично, если вы используете пустую строку для False, т.е. просто нажмите возврата.

пустая строка является единственным строковое значение, которое bool превращается в False:

>>> bool('False') 
True 

>>> bool('0') 
True 

>>> bool('') 
False 

См the documentation.

Если вы не используете строки Python считает 0, {}, [], всем быть эквивалентно False, то есть ноль или пустые контейнеры. Большинство других вещей - True.

Если вы хотите использовать любой из них в качестве входных данных, вы можете преобразовать значение строки в фактический тип с помощью ast.literal_eval, а затем конвертировать в bool для получения True или False.

>>> import ast.literal_eval 
>>> value = literal_eval('False') 
>>> type(value) 
bool 
>>> value 
False 

>>> value = literal_eval('0') 
>>> type(value) 
int 
>>> bool(value) 
False 

Ваши логические сравнения можно упростить, например:

if(P == True and Q == False): 
    print("P xor Q is True") 

может быть:

if P and not Q: 
    print("P xor Q is True") 
2

Оба T и F "истинны", как любая непустая строка «верно "в Python. Это может объяснить, почему ваш цикл работает не так, как ожидалось.

Первый шаг, чтобы исправить ваш кастинг:

p = input('Enter a boolean value, True or False: ') 
if p.lower() == 'false': 
    p = False 
q = input('Enter the second boolean, True or False: ') 
if q.lower() == 'false': 
    q = False 

Теперь, XOR просто, когда два значения не равны друг другу:

if p != q: 
    print('p xor q is true') 
else: 
    print('p xor q is false') 
+0

Просто подумал об этом. Работает! Как реализовать его, используя только логические операторы (и/не/или), чтобы не было одинаковых или неравных знаков? –

+0

@ S.Tolm Ваш код сравнения в порядке, это всего лишь ваши входы, которые нуждаются в фиксации. –

+0

Звучит неплохо, спасибо @PeterWood !! –