Satu baris, satu ide
Kamu sudah beberapa kali menulis pola ini: mulai dengan list kosong, lakukan perulangan pada sesuatu, mungkin disaring, lalu append ke hasilnya.
List comprehension menyatakan hal yang sama dalam satu baris:
Baca dari kiri ke kanan: "list baru yang berisi n * 2, untuk setiap n di numbers." Strukturnya adalah [expression for item in iterable].
Ini bukan trik khusus Python. Namanya comprehension karena kamu menjelaskan apa yang masuk ke list baru itu secara deklaratif, bukan menuliskan mekanisme cara membangunnya.
Menambahkan filter
Taruh klausa if setelah bagian perulangan untuk menyaring:
Baca yang kedua sebagai: "n * n untuk setiap n di numbers, tapi hanya kalau n ganjil."
Perulangan yang setara:
Keduanya tidak masalah. Comprehension lebih pendek, dan begitu kamu sudah membaca beberapa, justru lebih mudah ditelusuri karena maksudnya langsung terlihat dalam satu baris.
Map dan filter sekaligus
Kamu bisa mengolah nilai lewat sebuah fungsi dan menyaringnya di saat yang sama:
Untuk setiap kata yang lebih dari 3 huruf, masukkan versi huruf besarnya.
Perulangan bersarang dalam comprehension
Dua for menghasilkan pasangan bergaya cartesian product:
Urutannya sama seperti kalau kamu menulis perulangan bersarang: for pertama adalah yang luar, yang kedua adalah yang dalam. Bacanya dari kiri ke kanan seperti perulangan berindentasi yang setara.
Dua level kira-kira batasnya sebelum perulangan biasa lebih enak dibaca. Kalau sudah sampai tiga, kembali ke perulangan biasa.
Dictionary comprehension dan set comprehension
Idenya sama, kurungnya berbeda:
Sekilas set comprehension terlihat sama dengan dict comprehension; bedanya ada pada key: value vs satu ekspresi saja. Kurung kurawal ditambah : berarti dict; kurung kurawal tanpa : berarti set.
Generator expression
Hampir kembar dengan list comprehension, tapi memakai kurung biasa, bukan kurung siku, dan yang terpenting, tidak membangun list:
Perhatikan bahwa kita memberikan generator itu langsung ke sum() dan any(), tanpa tanda kurung tambahan. Generator expression adalah alat yang tepat saat pemanggilnya hanya perlu melakukan iterasi sekali. Untuk koleksi besar, generator expression lebih hemat memori daripada list lengkap.
Kapan memakai perulangan biasa saja
Comprehension itu menggoda. Secara teknis kamu bisa menjejalkan banyak hal ke dalamnya. Jangan lakukan itu.
Pakai perulangan biasa kalau:
- Transformasinya lebih dari satu langkah. Kalau kamu butuh variabel perantara, tuliskan secara lengkap.
- Ada penanganan error atau percabangan yang rumit.
- Siapa pun yang membaca baris itu harus berhenti lebih dari sekali untuk memahaminya.
Aturan yang aku pakai: kalau aku bisa membaca comprehension itu dalam satu tarikan napas dan paham apa yang dilakukannya, biarkan. Kalau aku tersandung, tulis ulang sebagai perulangan.
Beberapa comprehension terlihat cerdas tapi menyusahkan:
Hasilnya sama. Versi perulangan lima baris, bukan satu, tapi "lebih panjang" tidak sama dengan "lebih buruk."
Beberapa pola yang akan kamu pakai berulang kali
Kelima pola itu mencakup cukup banyak pekerjaan data sehari-hari, lebih dari yang kamu kira.
Berikutnya
Sekarang kamu sudah melihat tipe-tipe koleksi utama dan comprehension yang menyatukannya. Bab berikutnya: fungsi, yaitu mengemas perilaku menjadi unit bernama yang bisa dipakai ulang.
Pertanyaan yang sering diajukan
Apa itu list comprehension di Python?
Sintaks ringkas untuk membangun list baru dari iterable yang sudah ada. [x * 2 for x in numbers] membuat list baru yang setiap angkanya dikalikan dua. Kamu juga bisa menyaring: [x for x in numbers if x > 0].
Kapan sebaiknya tidak memakai list comprehension?
Saat list comprehension membuat kode lebih sulit dibaca. Kalau ekspresi di dalamnya rumit atau bersarang terlalu dalam, for loop biasa dengan nama variabel yang jelas lebih mudah dipahami. Comprehension ditujukan untuk transformasi sederhana, yaitu memetakan dan menyaring. Apa pun yang lebih rumit lebih baik ditulis sebagai perulangan lengkap.
Apa bedanya list comprehension dan generator expression?
List comprehension membangun seluruh list di memori. Generator expression (sintaksnya sama, tapi memakai tanda kurung biasa) menghasilkan satu item setiap kali. Pakai generator saat hasilnya diberikan ke sesuatu yang hanya melakukan iterasi sekali, seperti sum(...), agar kamu tidak membuat list yang langsung dibuang.