В Python 3.9+ между словарями предлагаются новые операторы merge ( |) и update ( |=). Примечание: это не то же самое, что и операторы множества, упомянутые выше.
Данные операции между двумя назначенными dicts d1и d2:
>>> d1 = d1 | d2 # 1>>> d1 |= d2 # 2
где d1эквивалентно через:
назначенная операция слияния-права
операция слияния (обновления) на месте; эквивалентноd1.update(d2)
пример
Здесь мы применяем merge ( |) и update ( |=) к dicts :
Это collections.Counterсвязано с математической структурой данных, называемой мультимножеством (mset). Это в основном набор пар ключ-значение (объект, множественность).
Данные операции между двумя назначенными счетчиками c1и c2:
>>> c1 = c1 | c2 # 1>>> c1 |= c2 # 2
где c1эквивалентно через:
назначенная операция объединения
операция объединения на месте
Объединение мультимножеств содержит максимальные кратности на запись. Обратите внимание, это не ведет себя так же, как между двумя наборами или между двумя обычными диктовками.
пример
Здесь мы применяем union ( |) и in-place union ( |=) к Counters :
В этом разделе кратко рассматривается поразрядная математика. В простейшем случае побитовая операция ИЛИ сравнивает два двоичных бита. Он всегда будет возвращаться, 1кроме случаев, когда оба бита верны 0.
>>>assert1==(1|1)==(1|0)==(0|1)>>>assert0==(0|0)
Теперь мы расширим эту идею за пределы двоичных чисел. Для любых двух целых чисел (без дробных компонентов) мы применяем побитовое ИЛИ и получаем целочисленный результат:
>>> a =10>>> b =16>>> a | b26
Как? В целом побитовые операции подчиняются некоторым «правилам»:
внутреннее сравнение двоичных эквивалентов
применить операцию
вернуть результат как заданный тип
Давайте применим эти правила к нашим обычным целым числам, указанным выше.
(1) Сравните двоичные эквиваленты, представленные здесь как строки ( 0bобозначает двоичные):
>>> bin(a)'0b1010'>>> bin(b)'0b10000'
(2) Примените побитовую операцию ИЛИ к каждому столбцу ( 0если есть оба 0, иначе 1):
0101010000-----11010
(3) Вернуть результат в заданном типе, например, с десятичным основанием 10:
>>> int(0b11010)26
Внутреннее двоичное сравнение означает, что мы можем применить последнее к целым числам в любом основании, например, шестнадцатеричном и восьмеричном:
Для большей ясности я бы добавил к демонстрации, что после выполнения обычного присвоения (x = x | y) идентификатор (x) изменился, потому что это новый объект, а | = сохраняет тот же идентификатор, потому что это исходный x, который изменяется, отсюда и название "inplace".
Флоримонд,
1
Это должен быть главный ответ - он самый исчерпывающий.
Ник
В разделе чисел вы утверждаете, что второй оператор выполняет операцию на месте. Я думаю, что это неправда, поскольку ints не изменяются в Python.
Asocia
106
В Python и многих других языках программирования |используется побитовое ИЛИ . |=это |как +=есть +, то есть комбинация операции и присвоения.
Так var |= valueкоротка для var = var | value.
Типичный вариант использования - объединение двух наборов:
Это создает своего рода искаженное впечатление об операторе; |является побитовым оператором ИЛИ для целых чисел, а не конкретно логическим оператором, и для чего-либо, кроме bools, он фактически не производит Trueили не Falseвыводит. boolявляется подклассом int, и, чтобы быть приятным, они перегружали его, boolчтобы продолжать производить True/ Falseвыводить, но в большинстве случаев логические операции должны выполняться с помощью or, а не |. Обычное использование for |- побитовое или или множественное объединение. Лучшими примерами использования были бы что-то вроде того, a = 0b1001; a |= 0b0010; print(bin(a))что производит 0b1011.
ShadowRanger 09
9
Он выполняет двоичное побитовое ИЛИ левой и правой частей присваивания, а затем сохраняет результат в левой переменной.
это объяснение, которое я искал, все говорили о наборах и логических значениях, но никто не упоминал о его использовании с числами.
Анкуш Верма
Приведенный вами пример не 32 |= 10а точнее 32 | 10. Просто чтобы прояснить это для будущих читателей :)
sniper71
@ sniper71 каков результат 32 | = 10
Future-Jim
2
В Python | = (ior) работает как операция объединения. например, если x = 5 и x | = 5, то оба значения сначала будут преобразованы в двоичное значение, затем будет выполнена операция объединения, и мы получим ответ 5.
Чтобы дать пример использования (потратив время на другие ответы):
def process(item):return bool(item)# imagine some sort of complex processing taking place abovedef any_success(data):# return True if at least one is successful
at_least_one =Falsefor item in data:
at_least_one |= process(item)return at_least_one
>>> any_success([False,False,False])False>>> any_success([True,False,False])True>>> any_success([False,True,False])True
В основном anyбез короткого замыкания: может быть полезно, если вам нужно обработать каждый элемент и записать хотя бы один успех и т. Д.
|
также используется в качестве оператора set unionОтветы:
|=
выполняет операцию + на месте между парами объектов. В частности, между:В большинстве случаев это связано с
|
оператором. См. Примеры ниже.Наборы
Например, объединение двух присвоенных наборов
s1
иs2
общих следующих эквивалентных выражений:где окончательное значение
s1
эквивалентно либо:пример
Здесь мы применяем OR (
|
) и inplace OR (|=
) к множествам :Словари
В Python 3.9+ между словарями предлагаются новые операторы merge (
|
) и update (|=
). Примечание: это не то же самое, что и операторы множества, упомянутые выше.Данные операции между двумя назначенными dicts
d1
иd2
:где
d1
эквивалентно через:d1.update(d2)
пример
Здесь мы применяем merge (
|
) и update (|=
) к dicts :Счетчики
Это
collections.Counter
связано с математической структурой данных, называемой мультимножеством (mset). Это в основном набор пар ключ-значение (объект, множественность).Данные операции между двумя назначенными счетчиками
c1
иc2
:где
c1
эквивалентно через:Объединение мультимножеств содержит максимальные кратности на запись. Обратите внимание, это не ведет себя так же, как между двумя наборами или между двумя обычными диктовками.
пример
Здесь мы применяем union (
|
) и in-place union (|=
) к Counters :Числа
Наконец, вы можете заниматься двоичной математикой.
Данные операции между двумя присвоенными номерами
n1
иn2
:где
n1
эквивалентно через:пример
Здесь мы применяем поразрядное ИЛИ (
|
) и на месте поразрядное ИЛИ (|=
) к числам :Обзор
В этом разделе кратко рассматривается поразрядная математика. В простейшем случае побитовая операция ИЛИ сравнивает два двоичных бита. Он всегда будет возвращаться,
1
кроме случаев, когда оба бита верны0
.Теперь мы расширим эту идею за пределы двоичных чисел. Для любых двух целых чисел (без дробных компонентов) мы применяем побитовое ИЛИ и получаем целочисленный результат:
Как? В целом побитовые операции подчиняются некоторым «правилам»:
Давайте применим эти правила к нашим обычным целым числам, указанным выше.
(1) Сравните двоичные эквиваленты, представленные здесь как строки (
0b
обозначает двоичные):(2) Примените побитовую операцию ИЛИ к каждому столбцу (
0
если есть оба0
, иначе1
):(3) Вернуть результат в заданном типе, например, с десятичным основанием 10:
Внутреннее двоичное сравнение означает, что мы можем применить последнее к целым числам в любом основании, например, шестнадцатеричном и восьмеричном:
Смотрите также
__ior__()
метода для итерации итераций вMutableSet
абстрактном базовом классе|=
для обновления набора+ Оператор поразрядного ИЛИ на месте не может применяться к литералам; назначать объекты именам.
++ Специальные методы возвращают те же операции, что и соответствующие им операторы.
источник
int
s не изменяются в Python.В Python и многих других языках программирования
|
используется побитовое ИЛИ .|=
это|
как+=
есть+
, то есть комбинация операции и присвоения.Так
var |= value
коротка дляvar = var | value
.Типичный вариант использования - объединение двух наборов:
источник
При использовании с наборами выполняет операцию объединения.
источник
|=
он использовался в заданном контексте, и только когда я запутался и понял это, я заметил, что этот ответ тоже здесьЭто просто операция ИЛИ между текущей переменной и другой. Будучи
T=True
иF=False
, просмотрите результат графически:Например:
источник
|
является побитовым оператором ИЛИ для целых чисел, а не конкретно логическим оператором, и для чего-либо, кромеbool
s, он фактически не производитTrue
или неFalse
выводит.bool
является подклассомint
, и, чтобы быть приятным, они перегружали его,bool
чтобы продолжать производитьTrue
/False
выводить, но в большинстве случаев логические операции должны выполняться с помощьюor
, а не|
. Обычное использование for|
- побитовое или или множественное объединение. Лучшими примерами использования были бы что-то вроде того,a = 0b1001; a |= 0b0010; print(bin(a))
что производит0b1011
.Он выполняет двоичное побитовое ИЛИ левой и правой частей присваивания, а затем сохраняет результат в левой переменной.
http://docs.python.org/reference/expressions.html#binary-bitwise-operations
источник
Побитовое или. Допустим, у нас есть
32 |= 10
изображения 32 и 10 в двоичном формате.Теперь, потому что | или, побитовое или на двух числах
т.е. 1 или 0 -> 1, 0 или 0 -> 0. Продолжайте это вниз по цепочке
Теперь измените двоичный код на десятичный, 10 10 10 = 42.
Для | =, думать о известных примерах
x +=5
. Значит,x = x + 5,
значит, если естьx |= 5
, значитx = x bitwiseor with 5
.источник
32 |= 10
а точнее32 | 10
. Просто чтобы прояснить это для будущих читателей :)В Python | = (ior) работает как операция объединения. например, если x = 5 и x | = 5, то оба значения сначала будут преобразованы в двоичное значение, затем будет выполнена операция объединения, и мы получим ответ 5.
источник
Чтобы дать пример использования (потратив время на другие ответы):
В основном
any
без короткого замыкания: может быть полезно, если вам нужно обработать каждый элемент и записать хотя бы один успех и т. Д.См. Также предостережения в этом ответе
источник