Що означають >> і << в Python?


90

Я помічаю, що можу робити такі речі, як 2 << 5отримати 64 і 1000 >> 2отримати 250.

Також я можу використовувати >>в print:

print >>obj, "Hello world"

Що тут відбувається?



3
Ось тепер ви можете підключити ці символи до пошукової системи і запропонувати їм насправді шукати їх: symbolhound.com
user2357112 підтримує Моніку


3
@ user2357112 Це буде дуже корисно, дякую. І для тих, хто каже, що це основне питання, це може бути, але у мене не було поняття побітових операторів, тому я б ніколи не думав шукати це в документації ...
user3201152

@joaquin це тепер результат номер один у google для python, який перевищує.
Jordan Reiter

Відповіді:


63

Я думаю, що це важливе питання, і на нього поки що немає відповіді (ОП, схоже, вже знає про операторів зміни). Дозвольте спробувати відповісти, оператор >> у вашому прикладі використовується для двох різних цілей. У термінах с ++ цей оператор перевантажений. У першому прикладі він використовується як побітовий оператор (зсув ліворуч), тоді як у другому сценарії він використовується просто як перенаправлення вихідних даних. тобто

2 << 5 # shift to left by 5 bits
2 >> 5 # shift to right by 5 bits
print >> obj, "Hello world" # redirect the output to obj, 

приклад

with open('foo.txt', 'w') as obj:
    print >> obj, "Hello world" # hello world now saved in foo.txt

оновлення:

У python 3 можна дати аргумент файлу безпосередньо таким чином:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt

11
FYI, що інше поширене використання оператора правильного зсуву, яке ви можете побачити в коді Python, відбудеться у файлах Airflow. Структура повітряного потоку перевантажує оператор «>>» , щоб вказати один задачу вгору по течії від іншого: stackoverflow.com/questions/52389105 / ...
schimmy

3
ви можете фактично замінити ці оператори за допомогою методів __rshift__і __lshift__.
trudolf

Я отримую, що 2 >> 5 дорівнює 0. Я думав, це повинно дорівнювати 0,0001?
lightbox142

1
@ teter123f операція є двійковою. це не десяткова операція.
yosemite_k

61

Це побітові оператори зсуву.

Цитування з документів :

x << y

Повертається xз бітами, зміщеними вліво на y місцями (а нові біти праворуч - нулі). Це те саме, що множити xна 2**y.

x >> y

Повертається xз бітами, зміщеними вправо на y місця. Це те саме, що ділити xна 2**y.


2
Можливо , приклад допоможе, введіть серію з них в Python: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)і так далі. Ви можете побачити, як це працює, без пояснень.
bartekbrak

4
Оператору зсуву бітів потрібно 2 операнди, то чому операнд - це "друк", а операнд 2 - об'єкт? як уprint >>obj, "Hello world"
Ци Фань

Це відповідь на контекст, наданий ОП (і, отже, відомий ОП), а не на поставлене питання.
z33k

@Qi Fan @ z33k Питання було відредаговано, щоб додати посилання на друк більше року після написання цієї відповіді. В оригінальному запитанні згадувалось лише 2 << 5та 1000 >> 2 ¯_ (ツ) _ / ¯
Джеймс,

24

12 << 2

48

Фактичне двійкове значення 12 дорівнює "00 1100", коли ми виконуємо вищезазначене твердження. Зсув ліворуч (на 2 місця зміщено вліво) повертає значення 48, його двійкове значення дорівнює "11 0000".

48 >> 2

12

Двійкове значення 48 - "11 0000", після виконання вищезазначеного оператора Зсув праворуч (на 2 місця зміщено вправо) повертає значення 12, його двійкове значення - "00 1100".


12

Інший випадок print >>obj, "Hello World"- це синтаксис "print chevron" для print оператора в Python 2 (видалений в Python 3, замінений fileаргументом print() функції ). Замість того, щоб писати на стандартний вихід, результат передається obj.write()методу. Типовим прикладом можуть бути файлові об'єкти, що мають write()метод. Дивіться відповідь на недавнє запитання: Подвійний знак більший, ніж у Python .


11

Вони є оператором бітового зсуву, який існує у багатьох основних мовах програмування, <<є лівим зсувом та >>правим зрушенням, їх можна продемонструвати як наступну таблицю, припустимо, що ціле число займає лише 1 байт в пам'яті.

| operate | bit value | octal value |                       description                        |
| ------- | --------- | ----------- | -------------------------------------------------------- |
|         | 00000100  |           4 |                                                          |
| 4 << 2  | 00010000  |          16 | move all bits to left 2 bits, filled with 0 at the right |
| 16 >> 2 | 00000100  |           4 | move all bits to right 2 bits, filled with 0 at the left |

Точно шукаючи це пояснення.
shaik moeed

7

Це оператори зміни

x << y Повертає x з бітами, зміщеними вліво на місця y (а нові біти праворуч - нулі). Це те саме, що помножити x на 2 ** y.

x >> y Повертає x із бітами, зміщеними вправо на y місця. Це те саме, що // 'x x на 2 ** y.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.