Mengurai kamus menggunakan loop 'untuk'
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
...
Bagaimana Python mengenali bahwa itu hanya perlu membaca kunci dari kamus? Apakah kunci kata khusus dengan Python? Atau itu hanya variabel?
Ini bukan hanya for
loop. Kata penting di sini adalah "iterasi".
Kamus adalah pemetaan kunci nilai:
d = {'x': 1, 'y': 2, 'z': 3}
Setiap kali kita beralih di atasnya, kita beralih di atas kunci. Nama variabel key
hanya dimaksudkan untuk deskriptif - dan itu cukup tepat untuk tujuan tersebut.
Ini terjadi dalam pemahaman daftar:
>>> [k for k in d]
['x', 'y', 'z']
Ini terjadi ketika kami meneruskan kamus ke daftar (atau objek jenis koleksi lainnya):
>>> list(d)
['x', 'y', 'z']
Cara Python mengulangi adalah, dalam konteks di mana ia perlu, ia memanggil __iter__
metode objek (dalam hal ini kamus) yang mengembalikan iterator (dalam hal ini, objek keyiterator):
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
Kita tidak harus menggunakan metode khusus ini diri kita sendiri, sebagai gantinya, gunakan fungsi builtin masing-masing untuk menyebutnya, iter
:
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
Iterators memiliki __next__
metode - tapi kami menyebutnya dengan fungsi builtin, next
:
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Ketika sebuah iterator habis, ia muncul StopIteration
. Ini adalah cara Python tahu untuk keluar dari for
loop, atau daftar pemahaman, atau ekspresi generator, atau konteks berulang lainnya. Setelah iterator memunculkannya, iterator StopIteration
akan selalu memunculkannya - jika Anda ingin mengulanginya lagi, Anda perlu yang baru.
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
Kembali ke dikte
Kami telah melihat dikte yang berulang dalam banyak konteks. Apa yang telah kita lihat adalah bahwa setiap kali kita beralih pada dikt, kita mendapatkan kuncinya. Kembali ke contoh aslinya:
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
Jika kami mengubah nama variabel, kami masih mendapatkan kunci. Mari kita coba:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
Jika kita ingin iterate atas nilai, kita perlu menggunakan .values
metode dicts, atau keduanya bersama-sama, .items
:
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
Dalam contoh yang diberikan, akan lebih efisien untuk beralih ke item-item seperti ini:
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
Tetapi untuk tujuan akademis, contoh pertanyaan itu baik-baik saja.