Que signifient >> et << en Python?

90

Je remarque que je peux faire des choses comme 2 << 5obtenir 64 et 1000 >> 2250.

Je peux aussi utiliser >>dans print:

print >>obj, "Hello world"

Que se passe-t-il ici?

user3201152
la source
3
Ici, vous pouvez maintenant brancher ces symboles dans un moteur de recherche et le faire rechercher: symbolhound.com
user2357112 prend en charge Monica
duplication possible de l' opération et de l'utilisation au niveau
vaultah
3
@ user2357112 Ce sera vraiment utile, merci. Et pour ceux qui disent que c'est une question de base, c'est peut-être, mais je n'avais aucun concept d'opérateurs au niveau du bit, donc je n'aurais jamais pensé à chercher cela dans la documentation ...
user3201152
@joaquin c'est maintenant le résultat numéro un dans google pour python supérieur à supérieur à.
Jordan Reiter

Réponses:

63

Je pense que c'est une question importante et elle n'a pas encore de réponse (l'OP semble déjà connaître les opérateurs de quart). Laissez-moi essayer de répondre, l'opérateur >> dans votre exemple est utilisé à deux fins différentes. En termes c ++, cet opérateur est surchargé. Dans le premier exemple, il est utilisé comme opérateur au niveau du bit (décalage à gauche), tandis que dans le second scénario, il est simplement utilisé comme redirection de sortie. c'est à dire

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, 

exemple

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

mise à jour:

En python 3, il est possible de donner directement l'argument file comme suit:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt
yosemite_k
la source
11
Pour info, une autre utilisation courante de l'opérateur de décalage droit que vous pourriez voir dans le code Python se produira dans les fichiers Airflow. Le framework Airflow surcharge l'opérateur '>>' pour indiquer qu'une tâche est en amont de l'autre: stackoverflow.com/questions/52389105/…
schimmy
3
vous pouvez en fait remplacer ces opérateurs via les méthodes __rshift__et __lshift__.
trudolf le
J'obtiens que 2 >> 5 est égal à 0. Je pensais qu'il devrait être égal à 0,0001?
lightbox142
1
@ teter123f l'opération est binaire. ce n'est pas une opération décimale.
yosemite_k
61

Ce sont des opérateurs de décalage au niveau du bit.

Citant les documents :

x << y

Renvoie xavec les bits décalés vers la gauche de y places (et les nouveaux bits du côté droit sont des zéros). C'est la même chose que multiplier xpar 2**y.

x >> y

Retourne xavec les bits décalés vers la droite de y places. Cela revient à diviser xpar 2**y.

James
la source
2
Peut-être un exemple aiderait, tapez une série de ces en Python: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)et ainsi de suite. Vous pouvez voir comment cela fonctionne sans explications.
bartekbrak
4
L'opérateur de décalage de bits nécessite 2 opérandes alors pourquoi l'opérande est "impression" et l'opérande 2 un objet? comme dansprint >>obj, "Hello world"
Qi Fan
C'est une réponse au contexte fourni par l'OP (et donc connu de l'OP) et non à la question posée.
z33k
@Qi Fan @ z33k La question a été modifiée pour ajouter la référence à imprimer plus d'un an après la rédaction de cette réponse. La question originale mentionnée uniquement 2 << 5et 1000 >> 2 ¯_ (ツ) _ / ¯
James
24

12 << 2

48

La valeur binaire réelle de 12 est "00 1100" lorsque nous exécutons l'instruction ci-dessus. Décalage à gauche (décalage de 2 places vers la gauche) renvoie la valeur 48, sa valeur binaire est "11 0000".

48 >> 2

12

La valeur binaire de 48 est "11 0000", après avoir exécuté l'instruction ci-dessus. Décalage vers la droite (décalage de 2 places vers la droite) renvoie la valeur 12, sa valeur binaire est "00 1100".

PAC
la source
12

L'autre cas impliquant print >>obj, "Hello World"est la syntaxe "print chevron" pour l' print instruction en Python 2 (supprimée en Python 3, remplacée par l' fileargument de la print() fonction ). Au lieu d'écrire sur la sortie standard, la sortie est transmise à la obj.write()méthode. Un exemple typique serait les objets fichier ayant une write()méthode. Voir la réponse à une question plus récente: Double signe supérieur à Python .

chrstphrchvz
la source
11

Ce sont des opérateurs de décalage de bits qui existent dans de nombreux langages de programmation traditionnels, <<sont le décalage vers la gauche et >>le décalage vers la droite, ils peuvent être illustrés comme le tableau suivant, supposons qu'un entier ne prenne qu'un octet en mémoire.

| 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 |
Tsing Yi
la source
Recherche exacte de cette explication.
shaik moeed le
7

Ce sont les opérateurs de quart

x << y Renvoie x avec les bits décalés vers la gauche de y places (et les nouveaux bits sur le côté droit sont des zéros). Cela revient à multiplier x par 2 ** y.

x >> y Renvoie x avec les bits décalés vers la droite de y places. C'est la même chose que // 'ing x par 2 ** y.

doctorlove
la source
0
<< Mean any given number will be multiply by 2the power
for exp:- 2<<2=2*2'1=4
          6<<2'4=6*2*2*2*2*2=64
Mayank Awasthi
la source