我注意到我可以用2 << 5来得到64,用1000 >> 2来得到250。
我也可以在打印中使用>>:
print >>obj, "Hello world"
这里发生了什么?
我注意到我可以用2 << 5来得到64,用1000 >> 2来得到250。
我也可以在打印中使用>>:
print >>obj, "Hello world"
这里发生了什么?
当前回答
在您的示例中,>>操作符用于两个不同的目的。在c++术语中,这个操作符是重载的。在第一个例子中,它被用作位运算符(右移),
2 << 5 # shift left by 5 bits
# 0b10 -> 0b1000000
1000 >> 2 # shift right by 2 bits
# 0b1111101000 -> 0b11111010
而在第二个场景中,它用于输出重定向。你可以用它来处理文件对象,就像下面这个例子:
with open('foo.txt', 'w') as f:
print >>f, 'Hello world' # "Hello world" now saved in foo.txt
>>的第二次使用只适用于Python 2。在Python 3中,可以使用file=参数重定向print()的输出:
with open('foo.txt', 'w') as f:
print('Hello world', file=f) # "Hello world" now saved in foo.txt
其他回答
这些是移位运算符
x << y返回x,其中比特向左移动y位(和 右边的新位是零)。这和 x乘以2**y。 x >> y返回x,位移位到 右移y位。这和//'ing x * 2* y是一样的。
另一种情况涉及print >>obj, "Hello World"是Python 2中print语句的"print chevron"语法(在Python 3中被删除,由print()函数的file参数取代)。输出不是写入标准输出,而是传递给obj.write()方法。一个典型的例子是具有write()方法的文件对象。请参阅最近一个问题的答案:Python中的双大于号。
12 is less than < 2 48
当我们执行上面的语句时,12的实际二进制值是“00 1100”。左移(左移2位)返回值48,其二进制值是“11 0000”。
48 >> 2 12
48的二进制值是“11 0000”,执行上述语句右移(右移2位)后返回值12,其二进制值是“00 1100”。
我在Python 2.7和Python 3.8上验证了以下内容
打印(100<<3) 将100转换为二进制得到1100100。 我所做的是去掉前3位,并在最后添加3位值为“0”的位。 所以结果应该是0100000,我把它转换成十进制,结果是32。
令我惊讶的是,当我执行print(100<<3)时,答案是800。我很困惑。 我把800转换成二进制来检查发生了什么。 这是1100100000。
如果你看到800是Python的答案,他们没有移位或删除前3位,而是将值“0”添加到最后3位。
其中作为打印(100>>3),工作完美。我做了手动计算,并从python中检查了打印结果。它工作正常。删除最后3位,并将值“0”添加到前3位。
看起来像(100<<3),左移运算符在Python上有一个错误。
在您的示例中,>>操作符用于两个不同的目的。在c++术语中,这个操作符是重载的。在第一个例子中,它被用作位运算符(右移),
2 << 5 # shift left by 5 bits
# 0b10 -> 0b1000000
1000 >> 2 # shift right by 2 bits
# 0b1111101000 -> 0b11111010
而在第二个场景中,它用于输出重定向。你可以用它来处理文件对象,就像下面这个例子:
with open('foo.txt', 'w') as f:
print >>f, 'Hello world' # "Hello world" now saved in foo.txt
>>的第二次使用只适用于Python 2。在Python 3中,可以使用file=参数重定向print()的输出:
with open('foo.txt', 'w') as f:
print('Hello world', file=f) # "Hello world" now saved in foo.txt