web-dev-qa-db-fra.com

Applications de l'opérateur '~' (tilde) en Python

Je viens de découvrir la opération unaire du complément au bit en Python via cette question et j'essayais de trouver une application réelle, et si ce n'est pas le cas, de déterminer s'il est généralement prudent de le faire. surcharger l'opérateur (en remplaçant la méthode __invert__) pour d'autres utilisations. L'exemple donné dans la question échoue avec un TypeError, et le lien fourni semble assez intimidant. Voici quelques trucs pour voir ~ utilisé:

from bitstring import BitArray

x = 7

print(~x)
# -8

print(BitArray(int=x, length=4).bin)
# '0111'

print(BitArray(int=~x, length=4).bin)
# '1000'

print(~~True, ~~False)
# 1 0

for i in range(-100, 100):
    assert i + ~i == -1
    assert i ^ ~i == -1
    assert bool(i) == ~~bool(i)

Existe-t-il des exemples de cas d'utilisation valides pour cet opérateur que je devrais connaître? Et même s’il en existe, est-il généralement acceptable de remplacer cet opérateur par des types autres que int?

16
Alec

Existe-t-il des exemples de cas d'utilisation valides pour cet opérateur que je devrais connaître? Et même s’il en existe, est-il généralement acceptable de remplacer cet opérateur par des types autres que int?

En règle générale, vous ne voudriez pas surcharger l'opérateur ~ uniquement parce que c'est amusant. Cela rend la lecture difficile. Mais parfois, une telle surcharge pour des types autres que int est logique. Regardez comment SQLAlchemy l'exploite à bon escient.

6
UltraInstinct

Vous pouvez utiliser cet opérateur avec l'opérateur de négation (-) pour incrémenter un nombre de 1. Par exemple:

x = 5
assert -~x == 6

C’est le seul moyen pratique que j’ai utilisé l’opérateur ~. Toute autre utilisation, hormis les nombres, dépend généralement du contexte et ajoute souvent un niveau de complexité à la compréhension du code .Pour des langages tels que C++, Swift, Ruby, etc., vous pouvez surcharger cet opérateur. ce qui rend parfois le code plus difficile à digérer rapidement

2
smac89

Il est couramment utilisé dans code golf comme raccourci pour quelques opérations, telles que l’utilisation de ~x plutôt que -x-1 ou ~my_bool plutôt que not my_bool.

2
Justin

Comme d’autres l’ont mentionné, cela peut s'avérer très utile lorsque vous parcourez des listes.

for i in range(n):
    mylist[~i]
    #much prettier than mylist[-i-1]

Regardez un exemple qui fait pivoter une matrice de 90 degrés dans le sens des aiguilles d'une montre:

def rotate( A):
    n = len(A)
    for i in range(n/2):
        for j in range(n-n/2):
            A[i][j], A[~j][i], A[~i][~j], A[j][~i] = \\
                     A[~j][i], A[~i][~j], A[j][~i], A[i][j]

(Cet extrait a été pris de ici )

0
A73rnA