Jakie jest zastosowanie operatora tyldy w Pythonie?
Jedną rzeczą, o której mogę pomyśleć, jest zrobienie czegoś po obu stronach łańcucha lub listy, na przykład sprawdzenie, czy łańcuch jest palindromiczny czy nie:
def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))
Jakieś inne dobre wykorzystanie?
~
implementowany metodą specjalną__invert__
nie jest związany znot
operatorem, co logicznie neguje wartość zwracaną przez__bool__
(lub__nonzero__
w 2.x). Nie jest również związany z-
operatorem jednoargumentowej negacji, implementowanym przez__neg__
. Na przykład~True == -2
, który nie jestFalse
fałszywy lub fałszywy, a-False == 0
który nadal jest fałszywy.-False==0
) To mylące, ponieważ mówiłeś o~
, a~False == -1
które nie jest fałszywe.__neg__
). Prawdopodobnie powinienem był kontynuowaćTrue
, np.-True == -1
Który nie jest -2 lubFalse
fałszywy, co bardziej wyraźnie łączy go z powrotem z~True
wynikiem, a także, że negacja arytmetyczna abool
różni się od negacji logicznej. Nie próbowałem być głęboki. Właśnie podkreślałem 3 operacje i podstawowe metody specjalne, które czasem się mylą.Odpowiedzi:
Jest to jednoargumentowy operator (biorąc pojedynczy argument) zapożyczony z C, gdzie wszystkie typy danych to po prostu różne sposoby interpretacji bajtów. Jest to operacja „odwracania” lub „uzupełniania”, w której wszystkie bity danych wejściowych są odwracane.
W Pythonie, w przypadku liczb całkowitych, bity reprezentacji uzupełnienia dwójkowego liczby całkowitej są odwrócone (jak w
b <- b XOR 1
przypadku każdego pojedynczego bitu), a wynik jest interpretowany ponownie jako liczba całkowita uzupełnienia dwójkowego. W przypadku liczb całkowitych~x
jest to równoważne z(-x) - 1
.Zmieniona forma
~
operatora jest dostarczana jakooperator.invert
. Aby wesprzeć tego operatora we własnej klasie, podaj mu__invert__(self)
metodę.Każda klasa, w której sensowne jest posiadanie „dopełnienia” lub „odwrotności” instancji, która jest również instancją tej samej klasy, jest potencjalnym kandydatem na operatora inwertowania. Jednak przeciążenie operatora może prowadzić do zamieszania w przypadku niewłaściwego użycia, więc upewnij się, że naprawdę ma sens, aby to zrobić przed dostarczeniem
__invert__
metody do twojej klasy. (Zauważ, że ciągi bajtów [np .:'\xff'
] nie obsługują tego operatora, nawet jeśli odwrócenie wszystkich bitów ciągu bajtów ma sens.)źródło
~
jest bitowym operatorem dopełniania w pythonie, który zasadniczo oblicza-x - 1
Tak wyglądałby stół
Więc za
i = 0
to porównaćs[0]
zs[len(s) - 1]
, nai = 1
,s[1]
zs[len(s) - 2]
.Jeśli chodzi o twoje inne pytanie, może to być przydatne w przypadku szeregu bitowych hacków .
źródło
Oprócz tego, że jest bitowym operatorem dopełniania,
~
może również pomóc w przywróceniu wartości logicznej , chociaż nie jest to typowybool
tutaj typ, raczej powinieneś go użyćnumpy.bool_
.Wyjaśnia to
Odwracanie wartości logicznej może być czasem przydatne, np.
~
Operator poniżej służy do czyszczenia zestawu danych i zwraca kolumnę bez NaN.źródło
numpy.NaN
wydaje się być zdefiniowany jakonumpy.float
. Jeśli spróbuję~numpy.NaN
, python narzeka, że operator jednoargumentowy~
nie jest zdefiniowany dla typunumpy.float
.~True
powoduje-2
, podczas gdy dla numpy booleans~np.True_
powodujeFalse
.Należy zauważyć, że w przypadku indeksowania tablic
array[~i]
wynosireversed_array[i]
. Można to postrzegać jako indeksowanie od końca tablicy:źródło
~i
(tj. Wartość ujemna), działa jako punkt początkowy dla indeksu tablicowego, który Python chętnie przyjmuje, powodując zawijanie indeksu i wybieranie go od tyłu.Jedyny raz, kiedy użyłem tego w praktyce, to z
numpy/pandas
. Na przykład z.isin()
metodą dataframe .W dokumentach pokazują ten podstawowy przykład
Ale co jeśli zamiast tego chcesz, aby wszystkie wiersze nie były w [0, 2]?
źródło
Rozwiązałem problem z kodem Leet i natknąłem się na to piękne rozwiązanie autorstwa użytkownika Zitao Wang .
Problem przebiega w ten sposób, że każdy element w danej tablicy znajduje iloczyn wszystkich pozostałych liczb bez korzystania z podziału i na
O(n)
czasStandardowe rozwiązanie to:
Jego rozwiązanie używa tylko jednego dla pętli, wykorzystując. Oblicza lewy i prawy produkt w locie za pomocą
~
źródło
To niewielkie użycie jest tyldą ...
powyższy kod pochodzi z „Hands On Machine Learning”
używasz tyldy (~ znak) jako alternatywy dla - znaku indeksu znaku
tak jak używasz minus - jest dla indeksu liczb całkowitych
dawny)
jest taki sam jak
print(array[~1])
źródło