Quelle est l'utilisation de l'opérateur tilde en Python?
Une chose à laquelle je peux penser est de faire quelque chose des deux côtés d'une chaîne ou d'une liste, comme vérifier si une chaîne est palindromique ou non:
def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))
Tout autre bon usage?
~
implémenté par la méthode spéciale__invert__
n'est pas lié à l'not
opérateur, ce qui annule logiquement la valeur retournée par__bool__
(ou__nonzero__
dans 2.x). Il n'est pas non plus lié à l'-
opérateur de négation unaire, implémenté par__neg__
. Par exemple~True == -2
, ce qui n'est pasFalse
ou faux, et-False == 0
ce qui est toujours faux.-False==0
) C'est déroutant, puisque vous parliez de la~
, et~False == -1
ce n'est pas faux.__neg__
). J'aurais probablement dû continuer à utiliserTrue
, par exemple-True == -1
, ce qui n'est ni -2 niFalse
faux, ce qui le relie plus clairement au~True
résultat et aussi que la négation arithmétique de abool
est différente de sa négation logique. Je n'essayais pas d'être profond. Je mettais juste en évidence 3 opérations et les méthodes spéciales sous-jacentes qui se confondent parfois.Réponses:
C'est un opérateur unaire (prenant un seul argument) qui est emprunté à C, où tous les types de données ne sont que des façons différentes d'interpréter les octets. C'est l'opération "inverser" ou "complément", dans laquelle tous les bits des données d'entrée sont inversés.
En Python, pour les entiers, les bits de la représentation à deux compléments de l'entier sont inversés (comme
b <- b XOR 1
pour chaque bit individuel), et le résultat est à nouveau interprété comme un entier à deux compléments. Donc, pour les entiers,~x
est équivalent à(-x) - 1
.La forme réifiée de l'
~
opérateur est fournie en tant queoperator.invert
. Pour prendre en charge cet opérateur dans votre propre classe, donnez-lui une__invert__(self)
méthode.Toute classe dans laquelle il est significatif d'avoir un "complément" ou "inverse" d'une instance qui est également une instance de la même classe est un candidat possible pour l'opérateur inversé. Cependant, la surcharge de l'opérateur peut entraîner de la confusion si elle est mal utilisée, alors assurez-vous qu'il est vraiment logique de le faire avant de fournir une
__invert__
méthode à votre classe. (Notez que les chaînes d'octets [ex:'\xff'
] ne prennent pas en charge cet opérateur, même s'il est utile d'inverser tous les bits d'une chaîne d'octets.)la source
~
est l' opérateur de complément au niveau du bit en python qui calcule essentiellement-x - 1
Donc, une table ressemblerait
Donc,
i = 0
cela se compareraits[0]
avecs[len(s) - 1]
, cari = 1
,s[1]
avecs[len(s) - 2]
.Quant à votre autre question, cela peut être utile pour une gamme de hacks au niveau du bit .
la source
En plus d'être un opérateur de complément au niveau du bit, il
~
peut également aider à rétablir une valeur booléenne , bien que ce ne soit pas lebool
type conventionnel ici, vous devez plutôt l'utilisernumpy.bool_
.Ceci est expliqué dans,
Inverser la valeur logique peut parfois être utile, par exemple, l'
~
opérateur ci-dessous est utilisé pour nettoyer votre jeu de données et vous renvoyer une colonne sans NaN.la source
numpy.NaN
semble être défini commenumpy.float
. Si j'essaye~numpy.NaN
, python se plaint, que l'opérateur unaire~
n'est pas défini pour le typenumpy.float
.~True
traduit par-2
, tandis que pour les booléens numpy, cela se~np.True_
traduit parFalse
.Il convient de noter que dans le cas de l'indexation de tableaux,
array[~i]
équivaut àreversed_array[i]
. Il peut être vu comme une indexation à partir de la fin du tableau:la source
~i
(c'est-à-dire une valeur négative) agit comme un point de départ pour l'index du tableau que python accepte avec plaisir, ce qui fait que l'index s'enroule et se ramasse à l'arrière.La seule fois où je l'ai utilisé en pratique, c'est avec
numpy/pandas
. Par exemple, avec la.isin()
méthode dataframe .Dans les documents, ils montrent cet exemple de base
Mais que se passe-t-il si à la place vous vouliez que toutes les lignes ne soient pas dans [0, 2]?
la source
Je résolvais ce problème de leetcode et je suis tombé sur cette belle solution par un utilisateur nommé Zitao Wang .
Le problème va comme ceci pour chaque élément dans le tableau donné trouver le produit de tous les nombres restants sans faire usage de la division et dans le
O(n)
tempsLa solution standard est:
Sa solution n'en utilise qu'une pour la boucle en faisant usage de. Il calcule le produit gauche et le produit droit à la volée en utilisant
~
la source
Ceci est une utilisation mineure est tilde ...
le code ci-dessus provient de "Hands On Machine Learning"
vous utilisez le tilde (signe ~) comme alternative au marqueur d'index de signe
tout comme vous utilisez moins - est pour l'index entier
ex)
est la même chose que
print(array[~1])
la source