Apa gunanya operator tilde di Python?
Satu hal yang dapat saya pikirkan adalah melakukan sesuatu di kedua sisi string atau daftar, seperti memeriksa apakah string palindromik atau tidak:
def is_palindromic(s):
return all(s[i] == s[~i] for i in range(len(s) / 2))
Adakah penggunaan lain yang baik?
~
diimplementasikan oleh metode khusus__invert__
tidak terkait dengannot
operator, yang secara logis meniadakan nilai yang dikembalikan oleh__bool__
(atau__nonzero__
dalam 2.x). Ini juga tidak terkait dengan-
operator negasi unary, diimplementasikan oleh__neg__
. Misalnya~True == -2
, mana yang tidakFalse
atau salah, dan-False == 0
yang masih salah.-False==0
) Ini membingungkan, karena Anda berbicara tentang~
, dan~False == -1
yang tidak Salah.__neg__
). Mungkin saya harus terus menggunakanTrue
, misalnya-True == -1
, yang bukan -2 atauFalse
atau salah, yang lebih jelas menghubungkannya kembali ke~True
hasil dan juga bahwa negasi aritmatika dari abool
berbeda dari negasi logisnya. Saya tidak berusaha untuk mendalam. Saya baru saja menyoroti 3 operasi dan metode khusus yang mendasarinya yang terkadang membingungkan.Jawaban:
Ini adalah operator unary (mengambil argumen tunggal) yang dipinjam dari C, di mana semua tipe data hanyalah cara yang berbeda untuk menafsirkan byte. Ini adalah operasi "membalikkan" atau "pelengkap", di mana semua bit data input dibalik.
Dalam Python, untuk bilangan bulat, bit representasi dua komplemen dari integer dibalik (seperti dalam
b <- b XOR 1
untuk setiap bit individu), dan hasilnya ditafsirkan lagi sebagai bilangan bulat dua komplemen. Jadi untuk bilangan bulat,~x
sama dengan(-x) - 1
.Bentuk reified
~
operator disediakan sebagaioperator.invert
. Untuk mendukung operator ini di kelas Anda sendiri, berikan__invert__(self)
metode.Kelas mana pun yang memiliki "pelengkap" atau "terbalik" dari instance yang juga merupakan instance dari kelas yang sama adalah kandidat yang memungkinkan untuk operator invert. Namun, overloading operator dapat menyebabkan kebingungan jika disalahgunakan, jadi pastikan bahwa sangat masuk akal untuk melakukannya sebelum memasok
__invert__
metode ke kelas Anda. (Perhatikan bahwa byte-string [ex:'\xff'
] tidak mendukung operator ini, meskipun itu berarti untuk membalikkan semua bit dari byte-string.)sumber
~
adalah operator komplemen bitwise dalam python yang pada dasarnya menghitung-x - 1
Jadi sebuah meja akan terlihat seperti
Jadi untuk
i = 0
itu akan dibandingkans[0]
dengans[len(s) - 1]
, untuki = 1
,s[1]
dengans[len(s) - 2]
.Sedangkan untuk pertanyaan Anda yang lain, ini bisa berguna untuk serangkaian peretasan bitwise .
sumber
Selain menjadi operator komplemen bitwise,
~
juga dapat membantu mengembalikan nilai boolean , meskipun ini bukanbool
tipe konvensional di sini, tetapi sebaiknya Anda gunakannumpy.bool_
.Ini dijelaskan dalam,
Membalikkan nilai logis kadang-kadang bisa berguna, misalnya,
~
operator di bawah ini digunakan untuk membersihkan dataset Anda dan mengembalikan Anda kolom tanpa NaN.sumber
numpy.NaN
tampaknya didefinisikan sebagainumpy.float
. Jika saya mencoba~numpy.NaN
, python mengeluh, bahwa operator unary~
tidak ditentukan untuk tipenumpy.float
.~True
menghasilkan-2
, sedangkan untuk booleans numpy~np.True_
menghasilkanFalse
.Orang harus mencatat bahwa dalam kasus pengindeksan array,
array[~i]
berjumlahreversed_array[i]
. Itu dapat dilihat sebagai pengindeksan mulai dari akhir array:sumber
~i
(yaitu nilai negatif) bertindak sebagai titik awal untuk indeks array yang python dengan senang hati menerima menyebabkan indeks membungkus dan memetik dari belakang.Satu-satunya waktu saya pernah menggunakan ini dalam praktek adalah dengan
numpy/pandas
. Misalnya dengan.isin()
metode dataframe .Dalam dokumen mereka menunjukkan contoh dasar ini
Tetapi bagaimana jika sebaliknya Anda menginginkan semua baris tidak pada [0, 2]?
sumber
Saya sedang memecahkan masalah leetcode ini dan saya menemukan solusi yang indah ini oleh seorang pengguna bernama Zitao Wang .
Masalahnya seperti ini untuk setiap elemen dalam array yang diberikan menemukan produk dari semua angka yang tersisa tanpa menggunakan divisi dan
O(n)
waktuSolusi standar adalah:
Solusinya hanya menggunakan satu untuk loop dengan memanfaatkan. Ia menghitung produk kiri dan produk kanan dengan cepat menggunakan
~
sumber
Ini adalah penggunaan minor ...
kode di atas adalah dari "Hands On Machine Learning"
Anda menggunakan tilde (~ tanda) sebagai alternatif untuk - tanda indeks penanda
sama seperti Anda menggunakan minus - adalah untuk indeks integer
ex)
adalah samething as
print(array[~1])
sumber