Для чего в Python 3.8 вводят новый оператор :=?
![]()
Примеры из существующего (не специально придуманного) кода (grep-нул по диску), к которому можно PEP 572: The Walrus Operator применить:
копирование файлов (и аналогичный код для сокетов и других объектов, из которых можно данные принимать пока не пусто):
с PEP-572 можно заменить на::
что, конечно, и сейчас можно записать как:
с PEP-572 можно заменить на:
можно заменить на:
списковое включение (listcomp), где какое-то выражение несколько раз используется. К примеру, чтобы напечатать публичные неспециальные свойства объекта obj (атрибуты-не методы) как словарь, созданный dictcomp:
здесь DRY реализуется с помощью: for attr in [getattr(obj, name)] идиомы (добавляется лишний вложенный цикл по списку из одного элемента). C PEP-572 это можно переписать как:
Конечно, особенно в тех случаях когда целое выражение не нужно, можно явный цикл использовать вместо dictcomp.
здесь та же DRY идиома используется со списком из одного элемента. C PEP-572 это можно переписать как:
Q: Почему нельзя использовать обычный оператор =, как в C#?
A: Чтобы не было путаницы с == как в Си между if (x == y) и if (x = y) , которые кардинально разные вещи делают.
Что значит двойное равно в python
These are Python’s bitwise operators.
Preamble: Twos-Complement Numbers
All of these operators share something in common — they are «bitwise» operators. That is, they operate on numbers (normally), but instead of treating that number as if it were a single value, they treat it as if it were a string of bits, written in twos-complement binary. A two’s complement binary is same as the classical binary representation for positve integers but is slightly different for negative numbers. Negative numbers are represented by performing the two’s complement operation on their absolute value. So a brief summary of twos-complement binary is in order:
- 0 is written as «0»
- 1 is written as «1»
- 2 is written as «10»
- 3 is «11»
- 4 is «100»
- 5 is «101»
- .
- .
- 1029 is «10000000101» == 2**10 + 2**2 + 2**0 == 1024 + 4 + 1
Two’s Complement binary for Negative Integers:
Negative numbers are written with a leading one instead of a leading zero. So if you are using only 8 bits for your twos-complement numbers, then you treat patterns from «00000000» to «01111111» as the whole numbers from 0 to 127, and reserve «1xxxxxxx» for writing negative numbers. A negative number, -x, is written using the bit pattern for (x-1) with all of the bits complemented (switched from 1 to 0 or 0 to 1). So -1 is complement(1 — 1) = complement(0) = «11111111», and -10 is complement(10 — 1) = complement(9) = complement(«00001001») = «11110110». This means that negative numbers go all the way down to -128 («10000000»).
Of course, Python doesn’t use 8-bit numbers. It USED to use however many bits were native to your machine, but since that was non-portable, it has recently switched to using an INFINITE number of bits. Thus the number -5 is treated by bitwise operators as if it were written «. 1111111111111111111011».
Whew! With that preamble out of the way (and hey, you probably knew this already), the operators are easy to explain:
The Operators:
x Returns the complement of x — the number you get by switching each 1 for a 0 and each 0 for a 1. This is the same as -x — 1. x ^ y Does a «bitwise exclusive or». Each bit of the output is the same as the corresponding bit in x if that bit in y is 0, and it’s the complement of the bit in x if that bit in y is 1.
Just remember about that infinite series of 1 bits in a negative number, and these should all make sense.
Other Classes
One more point: Python allows operator overloading, so some classes may be written to allow the bitwise operators, but with some other meaning. For instance, the new sets module for Python 2.3 uses | and & for union and intersection.