当前位置: 首页 > 面试题库 >

| =(ior)在Python中做什么?

屈星腾
2023-03-14
问题内容

Google不允许我进行搜索,|=因此我在查找相关文档时遇到了麻烦。有人知道吗


问题答案:

|=在成对的对象之间执行 就地 +操作。尤其是:

  • 集合:联合操作
  • dicts:更新操作
  • 计数器:(多集)联合运算
  • 数字:按位或,二进制运算

在大多数情况下,它与|操作员有关。请参阅下面的示例。

套装

例如,两个分配的集合的s1并并s2共享以下等效表达式:

>>> s1 = s1 | s2                                           # 1
>>> s1 |= s2                                               # 2
>>> s1.__ior__(s2)                                         # 3

其中的最终值s1等于:

  1. 分配的OR操作
  2. 就地或运算
  3. 通过特殊方法++进行原位或运算

在这里,我们将OR(|)和就地OR(|=)应用于 集合

>>> s1 = {"a", "b", "c"}
>>> s2 = {"d", "e", "f"}

>>> # OR, | 
>>> s1 | s2
{'a', 'b', 'c', 'd', 'e', 'f'}
>>> s1                                                     # `s1` is unchanged
{'a', 'b', 'c'}

>>> # In-place OR, |=
>>> s1 |= s2
>>> s1                                                     # `s1` is reassigned
{'a', 'b', 'c', 'd', 'e', 'f'}

辞典

在Python 3.9+中,在字典之间提出了新的merge(|)和update(|=)运算符。注意:这些与上述集合运算符不同。

两个指定的dictd1和之间的给定操作d2

>>> d1 = d1 | d2                                           # 1
>>> d1 |= d2                                               # 2

其中d1经由相当于:

  1. 分配的合并权操作
  2. 就地合并权限(更新)操作;相当于d1.update(d2)

在此,我们将merge(|)和update(|=)应用于 字典

>>> d1 = {"a": 0, "b": 1, "c": 2}
>>> d2 = {"c": 20, "d": 30}

>>> # Merge, | 
>>> d1 | d2
{"a": 0, "b": 1, "c": 20, "d": 30}
>>> d1 
{"a": 0, "b": 1, "c": 2}

>>> # Update, |=
>>> d1 |= d2
>>> d1 
{"a": 0, "b": 1, "c": 20, "d": 30}

专柜

collections.Counter涉及称为数学数据结构
多集
(MSET)。它基本上是(对象,多重性)键值对的决定。

给定两个分配柜台之间的操作c1c2

>>> c1 = c1 | c2                                           # 1
>>> c1 |= c2                                               # 2

其中c1经由相当于:

  1. 指定的联合操作
  2. 就地联合操作

多集的并集包含每个条目的最大重复数。请注意,这与两个集合之间或两个常规字典之间的行为方式不同。

在这里,我们将union(|)和就地union(|=)应用于 Counters

import collections as ct


>>> c1 = ct.Counter({2: 2, 3: 3})
>>> c2 = ct.Counter({1: 1, 3: 5})

>>> # Union, |    
>>> c1 | c2
Counter({2: 2, 3: 5, 1: 1})
>>> c1
Counter({2: 2, 3: 3})

>>> # In-place Union, |=
>>> c1 |= c2
>>> c1
Counter({2: 2, 3: 5, 1: 1})

号码

最后,您可以进行二进制数学运算。

在两个分配的数字n1和之间进行给定的运算n2

>>> n1 = n1 | n2                                           # 1
>>> n1 |= n2                                               # 2

其中n1经由相当于:

  1. 分配的按位或运算
  2. 就地按位或运算

在这里,我们将按位OR(|)和就位按位OR(|=)应用于 数字

>>> n1 = 0
>>> n2 = 1

>>> # Bitwise OR, |
>>> n1 | n2
1
>>> n1
0

>>> # In-place Bitwise OR, |=
>>> n1 |= n2
>>> n1
1

评论

本节简要回顾一些按位数学。在最简单的情况下,按位或运算会比较两个二进制位。1除非两个位均为,否则它将始终返回0

>>> assert 1 == (1 | 1) == (1 | 0) == (0 | 1)
>>> assert 0 == (0 | 0)

现在,我们将这个想法扩展到二进制数之外。给定任意两个整数(缺少小数部分),我们应用按位“或”并得到一个积分结果:

>>> a = 10 
>>> b = 16 
>>> a | b
26

怎么样?通常,按位运算遵循一些“规则”:

  1. 内部比较二进制等效项
  2. 应用操作
  3. 以给定类型返回结果

让我们将这些规则应用于上面的常规整数。

(1)比较二进制等效项,在这里视为字符串(0b表示二进制):

>>> bin(a)
'0b1010'
>>> bin(b)
'0b10000'

(2)对每列应用按位或运算(0当两者均为时0,否则1):

01010
10000
-----
11010

(3)返回给定类型的结果,例如以10为底的十进制数:

>>> int(0b11010)
26

内部二进制比较意味着我们可以将后者应用于任何基数的整数,例如十六进制和八进制:

>>> c = 0xa                                            # 10
>>> d = 0o20                                           # 16 
>>> c | d
26

也可以看看

  • 在抽象基类中重载__ior__()方法以迭代可迭代对象的示例MutableSet
  • R. Hettinger的OrderedSet配方(分别参见第3行和第10行)
  • 一对Python的想法线程上为什么要使用|=更新一组
  • 一个在Python 3潜水的部分B.8 Python的运营商的特殊方法

+就位按位或运算符不能应用于文字;将对象分配给名称。

++特殊方法返回与其对应运算符相同的操作。



 类似资料:
  • 问题内容: 之间有什么区别: 我看到super在只有单一继承的类中经常使用它。我知道为什么你会在多重继承中使用它,但是不清楚在这种情况下使用它的好处。 问题答案: 单继承的好处是微不足道的-大多数情况下,你不必将基类的名称硬编码到每个使用其父方法的方法中。 但是,如果不使用,几乎不可能使用多重继承。这包括常见的惯用语,例如,接口,抽象类等。这扩展到了以后扩展你的代码的代码。如果以后有人想编写一个扩

  • 问题内容: 我看到了一个将函数应用于元组的代码示例。结果,它返回一个负整数。我想知道这个功能做什么?Google没有帮助。我找到了一个页面,该页面解释了哈希的计算方式,但没有解释为什么我们需要此函数。 问题答案: 哈希是一个固定大小的整数,用于标识特定值。每个值都需要有自己的哈希,因此对于相同的值,即使不是同一对象,您也将获得相同的哈希。 散列值的创建方式应使结果值均匀分布,以减少所得到的散列冲突

  • 问题内容: 我在这里碰到了这个,总是这样使用: 什么是运营商做的,为什么不使用普通的或? 抱歉,如果以前没有回答,搜索引擎将不喜欢标点符号。 问题答案: http://docs.python.org/reference/expressions.html#notin说: [操作员]和是等效的;为了与C保持一致,是首选。[…]拼写被认为是过时的。

  • 问题内容: 首先,我想澄清一个问题:它是关于函数的, 而不是 列表的片段或类似的字符串。 文档提到该函数在NumPy中使用,并且没有给出用法示例(说了 如何使用它, 但没有说 何时使用它 )。而且,我 从未 见过在任何Python程序中使用过此函数。 在以纯Python(无NumPy或SciPy)编程时,何时应使用该函数?任何示例将不胜感激。 问题答案: 给出与相同的结果。一个的优点对象是,它可以

  • 问题内容: 我知道构造函数会创建一个新列表,但是它的特征到底是什么? 打电话时会怎样? 打电话时会怎样? 打电话时会怎样? 据我所知,调用构造函数会删除最外面的花括号(元组或列表),并将其替换为。这是真的?还有什么其他细微差别? 问题答案: 将传递给它的iterable转换为列表。如果itertable已经是一个列表,则返回 浅表副本 ,即仅最外层的容器是新的,其余对象仍然相同。

  • 问题内容: python中反斜杠b的用途是什么,我在python解释器中运行了 打印“ \” foo \ bar” ,并得到以下结果: 问题答案: 请参阅字符串文字文档: ASCII退格键(BS) 它产生一个 退格字符 。打印该字符时,终端会在第二秒上退格。