Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对象创建中的管道角色_Python_Python 3.x - Fatal编程技术网

Python 对象创建中的管道角色

Python 对象创建中的管道角色,python,python-3.x,Python,Python 3.x,我遇到了以下代码: f = wx.Frame(None, -1, 'Window Title', style = wx.MAXMIZE_BOX | wx.SYSTEM_MENU) 我读过关于堆栈溢出的其他答案,其中说“|”与按位操作有关,但我认为这不是这里的用途,如果是,我不理解。有人能解释一下这个字符在这种情况下是用来做什么的吗?按位还是真正的用法 wx.MAXIMIZE\u框,wx.SYSTEM\u菜单等均为整数常量,仅设置了一个位。(每个常数有一个不同的位。)因此,您可以按位或将它们组合

我遇到了以下代码:

f = wx.Frame(None, -1, 'Window Title', style = wx.MAXMIZE_BOX | wx.SYSTEM_MENU)
我读过关于堆栈溢出的其他答案,其中说“|”与按位操作有关,但我认为这不是这里的用途,如果是,我不理解。有人能解释一下这个字符在这种情况下是用来做什么的吗?

按位还是真正的用法

wx.MAXIMIZE\u框
wx.SYSTEM\u菜单
等均为整数常量,仅设置了一个位。(每个常数有一个不同的位。)因此,您可以按位或将它们组合在一起以获得位的集合

这几乎与在集合上执行并集操作完全相同。事实上,在Python中,set union也拼写为
|
。不同之处在于,当您使用单位整数时,整个集合将放入一个固定大小的整数中,而不是存储为一组单独值的集合。这对于Python来说通常不太重要,但对于
wx
处理的低级窗口API(主要用C编写)来说,这一点很重要

让我们举一个简单的例子:

>>> a = 0b00000001
>>> b = 0b00000010
>>> c = 0b00000100
>>> d = 0b00001000
>>> acd = a | c | d
>>> bin(acd) # notice that the a, c, and d bits are all set, but no others
'0b1101'
>>> bool(acd & c) # is c an element of acd?
True
>>> bool(acd & b) # is b an element of acd?
False
所以我可以在一个字节内传递一组8个独立的布尔值。这就是Python,“单字节”仍然是一个8字节的指针,指向一个28字节的
int
对象,其基本值的最小大小为4字节,所以我实际上只是为了节省空间而使事情变得更慢、更复杂。但是,如果你需要储存数以百万计的这些

不管怎样,正如我们使用
|
,按位或表示并集,我们使用
,按位和表示相交

这个
bool(…&…
可能有点混乱,直到您意识到集合与单个元素的交集要么是该单个元素(如果它是集合的一个成员),要么是0(如果它不是)。在Python中,0总是假的,所有其他数字都是真的


正如tripleee在评论中指出的那样,当您的值都是单位值且没有重复时,
+
实际上会做同样的事情:

>>> bin(a | c | d)
'0b1101'
>>> bin(a + c + d)
'0b1101'
想一想你是如何在纸上把东西加起来,然后拿着1。按位or类似于将列相加而忽略进位。因此,当没有进位时(因为我们没有任何比特多次出现),它们会做同样的事情。当然,一旦这不再正确,携带1和忽略1就不再相同:

>>> bin(acd | c)
'0b1101'
>>> bin(acd + c)
'0b10001'
按位或真的是这里的用途

wx.MAXIMIZE\u框
wx.SYSTEM\u菜单
等均为整数常量,仅设置了一个位。(每个常数有一个不同的位。)因此,您可以按位或将它们组合在一起以获得位的集合

这几乎与在集合上执行并集操作完全相同。事实上,在Python中,set union也拼写为
|
。不同之处在于,当您使用单位整数时,整个集合将放入一个固定大小的整数中,而不是存储为一组单独值的集合。这对于Python来说通常不太重要,但对于
wx
处理的低级窗口API(主要用C编写)来说,这一点很重要

让我们举一个简单的例子:

>>> a = 0b00000001
>>> b = 0b00000010
>>> c = 0b00000100
>>> d = 0b00001000
>>> acd = a | c | d
>>> bin(acd) # notice that the a, c, and d bits are all set, but no others
'0b1101'
>>> bool(acd & c) # is c an element of acd?
True
>>> bool(acd & b) # is b an element of acd?
False
所以我可以在一个字节内传递一组8个独立的布尔值。这就是Python,“单字节”仍然是一个8字节的指针,指向一个28字节的
int
对象,其基本值的最小大小为4字节,所以我实际上只是为了节省空间而使事情变得更慢、更复杂。但是,如果你需要储存数以百万计的这些

不管怎样,正如我们使用
|
,按位或表示并集,我们使用
,按位和表示相交

这个
bool(…&…
可能有点混乱,直到您意识到集合与单个元素的交集要么是该单个元素(如果它是集合的一个成员),要么是0(如果它不是)。在Python中,0总是假的,所有其他数字都是真的


正如tripleee在评论中指出的那样,当您的值都是单位值且没有重复时,
+
实际上会做同样的事情:

>>> bin(a | c | d)
'0b1101'
>>> bin(a + c + d)
'0b1101'
想一想你是如何在纸上把东西加起来,然后拿着1。按位or类似于将列相加而忽略进位。因此,当没有进位时(因为我们没有任何比特多次出现),它们会做同样的事情。当然,一旦这不再正确,携带1和忽略1就不再相同:

>>> bin(acd | c)
'0b1101'
>>> bin(acd + c)
'0b10001'

算术上
a+b+c==a | b | c
,只要它们都包含不同的位。低级程序员倾向于使用后一种符号。它可能在某个地方节省了几纳秒。@tripleee在绝大多数情况下,如在OP的示例中,值都将是常量,并且任何C编译器在编译时都将是常量倍
a+b+C
a | b | C
。更不用说,大多数有兴趣在任何地方都能节省几纳秒的人,不管瓶颈在哪里,都会从80年代听到的陈旧信息中消失。就我个人而言,我更喜欢这里的
|
,因为它使意图更清晰。@tripleee当然,我更喜欢使用位集类,而不是只使用原始int值。能够打印出一个值并在调试时获取
{a,b,d}
,而不是获取
11
,记住它是一个位集,然后在源代码中查找匹配1,2和8的常量,这很好…是的,我只是指出这种等价性,希望它能帮助一些读者澄清这个问题。我试图把它纳入答案中。谢谢算术上
a+b+c==a | b | c
,只要它们都包含不同的位。低级程序员倾向于使用后一种符号。可能吧