python 格式的逻辑表

Logic tables in python with format

所以我在 Python 中有一个简短的问题。 比如说,我正在 python (AND, OR, XOR, XNOR etc) 中实现基本逻辑门 像这样:

或门

def OR(a,b):
    if a == True or b == True:
        return True
    else:
        return False

异或门或异或门

def XOR(a,b):
    if a != b:
        return True
    else:
        return False

异或门或异或门的逻辑补码

def XNOR(XOR):
    if XOR == True:
        return False
    else:
        return True

1。 现在,我试图像这样打印它们:

print "AND Gate Table:"
print "A = False, B = False \t", AND(False, False)
print "A = True, B = False \t", AND(True, False)
print "A = False, B = True \t", AND(False, True)
print "A = True, B = True \t", AND(True, True)

这输出:

AND Gate Table:
A = False, B = False    False
A = True, B = False     False
A = False, B = True     False
A = True, B = True      True

2。那么现在我想到使用 format 为我打印 table,所以我做了:

tableformat = '{:<10}' * 6
print tableformat.format("A", "True", "B", "True", ":", AND(True, True))

但令我惊讶的是,这导致了这个

A         False     B         True      :         1 

现在显然我更改了参数 AND(True, False) 并重复了上面的步骤 2,它给了我 0


我的问题:

现在,这很有趣,但我不明白,当我简单地打印 table 时它如何返回布尔值,但当我做基本相同的事情时返回实际的二进制值,使用 [format()][1] 打印时调用相同的函数。这很有趣,我很想了解它是如何工作的。

预先感谢您的回答。

问题是 bool.__format__() 决定了它的显示方式:

>>> True.__format__('')
'True'
>>> True.__format__('<10')
'1         '

你可以看到它如何反映上面的内容(因为它调用了上面的内容):

>>> '{}'.format(True)
'True'
>>> '{:<10}'.format(True)
'1         '

但是您可以通过使用转换操作来避免这种情况,在进行任何格式化之前强制 str(True)

>>> '{!s:<10}'.format(True)
'True      '

相当于:

>>> str(True).__format__('<10')
'True      '

在大多数情况下,bool 类型是 0 和 1 的语法糖:

>>> 1 == True
True

>>> 0 == False
True

>>> ['item0', 'item1'][True]
'item1'

>>> True + True
2

数字和布尔值之间的一个区别是 __str__() 成员函数的 return 值。 (1).__str__() return 是字符串“1”,(True).__str__() return 是字符串 'True'。但是,内置格式调用 format 成员函数。

>>> (1).__format__('f')
'1.000000'

>>> (True).__format__('n')
'1'

数字总是 return 其值的字符串表示形式,具体取决于格式字符串。继承地,数字只能格式化为数字,不能格式化为字符串

>>> '{:s}'.format(1)
ValueError: Unknown format code 's' for object of type 'int'

>>> '{:s}'.format(True)
ValueError: Unknown format code 's' for object of type 'bool'

当您使用 format 时,它会调用 True.__format__。该方法未在 bool 类型上实现,但 bool 继承自 int 因此其行为与整数相同。这就是为什么你得到一个数字。

>>> bool.__format__ is int.__format__
True

当做一个简单的 print 时,会调用 __str__ 方法,而 bool class 定义了它自己的方法版本,它给你一个字符串 "True" 返回.

>>> bool.__str__ is int.__str__
False