Jawaban:
Untuk setiap wadah python C, harapannya adalah itu
for item in C:
assert item in C
akan lulus dengan baik - tidakkah Anda akan merasa heran jika satu pengertian in
(klausa loop) memiliki makna yang sama sekali berbeda dari yang lain (pemeriksaan keberadaan)? Saya yakin akan! Secara alami berfungsi seperti itu untuk daftar, set, tuple, ...
Jadi, kapan C
kamus, jika in
menghasilkan kunci / nilai tupel dalam satu for
lingkaran, maka, dengan prinsip paling tidak heran, in
juga harus mengambil tuple seperti operan kirinya di cek kontainmen.
Seberapa bermanfaatkah itu? Cukup berguna memang, pada dasarnya membuat if (key, value) in C
sinonim untuk if C.get(key) == value
- yang merupakan cek saya percaya saya mungkin telah melakukan, atau ingin melakukan, 100 kali lebih jarang dari apa yang if k in C
sebenarnya berarti , memeriksa keberadaan kunci saja dan sepenuhnya mengabaikan nilai.
Di sisi lain, keinginan untuk mengulang hanya pada tombol cukup umum, misalnya:
for k in thedict:
thedict[k] += 1
memiliki nilai juga tidak akan membantu khususnya:
for k, v in thedict.items():
thedict[k] = v + 1
sebenarnya agak kurang jelas dan kurang ringkas. (Perhatikan bahwa items
itu adalah ejaan asli dari metode "tepat" yang digunakan untuk mendapatkan pasangan kunci / nilai: sayangnya itu kembali pada hari-hari ketika para pengakses tersebut mengembalikan seluruh daftar, sehingga untuk mendukung "hanya mengulangi" ejaan alternatif harus diperkenalkan , dan iteritems
itu - di Python 3, di mana kendala kompatibilitas ke belakang dengan versi Python sebelumnya jauh lebih lemah, itu menjadi items
lagi).
Dugaan saya: Menggunakan tupel penuh akan lebih intuitif untuk pengulangan, tetapi mungkin kurang untuk pengujian untuk menggunakan keanggotaan in
.
if key in counts:
counts[key] += 1
else:
counts[key] = 1
Kode itu tidak akan berfungsi jika Anda harus menentukan kunci dan nilainya in
. Saya mengalami kesulitan membayangkan use case di mana Anda akan memeriksa apakah kedua kunci DAN nilai ada di kamus. Jauh lebih alami untuk hanya menguji kunci.
# When would you ever write a condition like this?
if (key, value) in dict:
Sekarang tidak perlu bahwa in
operator dan for ... in
beroperasi pada item yang sama. Dari segi implementasi, keduanya adalah operasi yang berbeda ( __contains__
vs. __iter__
). Tetapi ketidakkonsistenan kecil itu akan agak membingungkan dan, yah, tidak konsisten.
x in foo
hanya jikai
dalamfor i in foo
mengasumsikan nilaix
pada titik tertentu, saya akan mengatakan bahwa itu akan menjadi inkonsistensi yang sangat besar .