Используйте Python __irshift__() для реализации арифметического присваивания

Python

грамматика

object.__irshift__(self, other)

Python__irshift__()Волшебным образом реализует последовательную операцию сдвига вправо на месте, вычисляет операцию сдвига вправо и присваивает результат первой переменной операнда.x. Эта операция также называетсяРасширенное арифметическое назначение, Метод просто возвращает новое значение, которое будет присвоено первому операнду.

  • когда ты звонишьx >>= y, Python сначала пытается вызватьx.__irshift__(y).
  • Если это не реализовано, он попытается выполнить обычную операцию битового сдвига влево.[x.__rshift__(y)](https://blog.finxter.com/python-__rshift__/ "https://blog.finxter.com/python-__rshift__/").
  • Если это вообще не достигается, он попытается выполнить операцию обратного сдвига влево.[y.__rrshift__(x)](https://blog.finxter.com/python-__rrshift__-magic-method/ "Python __rrshift__() Magic Method")Поменять местами операнды с.

затем присвойте результат первому операндуx. Если ни одна из этих операций не реализована, Python выдаетTypeError.

Мы называем это "Dunder Method",который_"Double UnderscoreМетод» (также известный как«Волшебный метод»_).

Базовый пример переопределения __irshift__

В следующем примере кода вы создаете классData, и определяет магический метод__irshift__(self, other).

  • "self«Аргумент — это параметр по умолчанию для каждого метода, и он относится к вызываемому объекту — в нашем случае это первый операнд операции на месте.
  • Параметр «другой» метода на месте относится ко второму операнду, который в операции на местеy x >>= y.

Возвращаемое значение этой операции возвращает ложную строку'finxter 42', и присваивается первому операнду. На практике это будет результатом операции сдвига вправо на месте.

class Data:
    def __irshift__(self, other):
        return 'finxter 42'


x = Data()
y = Data()

x >>= y

print(x)
# finxter 42

Сдвиг вправо на месте >> нет __irshift__()

Для поддержки сдвига вправо на месте в пользовательском классе вам не нужно переопределять на месте__irshift__()метод. Потому что, если этот метод не определен, Python вернется к нормальному[__rshift__()](https://blog.finxter.com/python-__rshift__/ "https://blog.finxter.com/python-__rshift__/")метод и присваивает его результат первому операнду.

Вот пример.

class Data:
    def __rshift__(self, other):
        return 'finxter 42'


x = Data()
y = Data()

x >>= y

print(x)
# finxter 42

Хотя и не определено__irshift__()метод, но из-за__rshift__()Волшебный метод «назад», операция смещения по часовой стрелке на местеx >>= yеще работает!

Цифровой сдвиг вправо на месте без __irshift__() и __rshift__()

Для поддержки сдвига влево на месте в пользовательском классеx >>= y, вам даже не нужно переопределятьx.__irshift__(y)илиx.__rshift__(y)метод. Если ни один метод не определен, Python вернется к обратному[y.__rrshift__(x)](https://blog.finxter.com/python-__rrshift__-magic-method/ "https://blog.finxter.com/python-__rrshift__-magic-method/")метод и присваивает его результат первому операнду.

Вот пример, когда вы создаете собственный класс для первого операнда, который не поддерживает операции сдвига вправо по часовой стрелке. Затем вы определяете собственный класс для второго операнда, который определяет__rrshift__()метод. Для операций на месте Python возвращает значение, определенное во втором операнде.__rrshift__()метод и присвоить его первому операндуx.

class Data_1:
    pass

class Data_2:
    def __rrshift__(self, other):
        return 'finxter 42'

x = Data_1()
y = Data_2()

x >>= y

print(x)
# finxter 42

TypeError: неподдерживаемый тип операнда для >>=

Если вы попытаетесь выполнить умножение на местеx >>= y, но не определяетx.__irshift__(y), также не определеноx.__rshift__(y), больше не определеноy.__rrshift(x), Python выдает "TypeError: unsupported operand type(s) for >>=". Чтобы исправить эту ошибку, просто определите любой из этих методов перед выполнением операции на месте.

class Data:
    pass


x = Data()
y = Data()

x >>= y

вывод

Traceback (most recent call last):
  File "C:UsersxcentDesktopcode.py", line 8, in <module>
    x >>= y
TypeError: unsupported operand type(s) for >>=: 'Data' and 'Data'

сдвиг вправо

Питон**сдвиг вправо** операторx >> nпреобразовать целое числоxДвоичное представление сдвинуто вправоnнемного.

он вставляет левый0бит и удалить крайний правый бит. Например, если вы поместите двоичную запись0101Сдвиньте одну позицию вправо, и вы получите0010.

Семантически оператор битового сдвига аналогичен целочисленному делению.2**n.

Python Bitwise Right-Shift >> Operator

Вы можете найти полное руководство (включая видео) по сдвигу по часовой стрелке прямо здесь.

Когда начать?

Хватит теории, займемся практикой!

Чтобы добиться успеха в программировании, вам нужно выйти и решить реальные проблемы для реальных людей. Таким образом, вы можете легко стать шестизначным доходом. И именно так вы можете развить навыки, которые вам действительно нужны на практике. В конце концов, что толку изучать теорию, которая никому не нужна?

Практические проекты — это то, как вы оттачиваете свое мастерство в программировании!

Вы хотите стать гуру кода, сосредоточившись на реальных проектах кода, которые действительно приносят вам деньги и решают проблемы для людей?

Тогда станьте внештатным разработчиком Python!Даже если вы новичок, это лучший способ улучшить свои навыки работы с Python.