2.30. Comprehension¶
Sebuah comprehension membangun daftar, set, dict, atau generator baru dari iterable yang sudah ada, dalam satu ekspresi. Ini adalah pengganti pola umum memulai dengan container kosong dan menambahkan dalam perulangan.
2.30.1. List comprehension¶
squares = [x * x for x in range(5)]
print(squares)
Output:
[0, 1, 4, 9, 16]
Perulangan yang sama ditulis lengkap:
squares = []
for x in range(5):
squares.append(x * x)
Bentuk comprehension adalah satu ekspresi yang membangun daftar di tempat. Tidak ada squares = [] dan tidak ada .append -- hasilnya adalah nilai dari comprehension tersebut.
Ekspresi di depan menghasilkan setiap item; klausa for menamai variabel perulangan; klausa if opsional memfilter item.¶
2.30.2. Memfilter dengan if¶
Klausa if opsional hanya menyimpan item yang cocok:
evens = [x for x in range(10) if x % 2 == 0]
print(evens)
Output:
[0, 2, 4, 6, 8]
Filter berjalan sebelum ekspresi di depan -- x % 2 == 0 diperiksa terlebih dahulu; hanya nilai yang cocok yang mencapai x untuk output.
2.30.3. Dict dan set comprehension¶
Bentuk yang sama berfungsi dengan literal dict dan set.
Sebuah dict comprehension memiliki pasangan key: value sebelum for:
squares = {x: x * x for x in range(5)}
print(squares)
Output:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Sebuah set comprehension menggunakan kurung kurawal dan satu ekspresi:
unique_lengths = {len(w) for w in ["a", "bb", "c", "bb"]}
print(unique_lengths)
Output:
{1, 2}
2.30.4. Generator expression¶
Kurung bulat menghasilkan generator expression alih-alih daftar. Nilainya dihitung satu per satu, sesuai permintaan:
total = sum(x * x for x in range(1000))
Tidak ada daftar sejuta item yang pernah dibangun. Nilainya mengalir satu per satu ke sum(), yang menjumlahkannya dan membuang setiap nilai saat berjalan.
Generator expression adalah pilihan yang tepat saat memberikan nilai ke fungsi reduksi (sum(), max(), any(), all()) atau kode yang mengonsumsi iterator lainnya -- mereka menghemat memori yang seharusnya digunakan oleh daftar yang setara.
2.30.5. Kapan tidak menggunakan comprehension¶
Comprehension ringkas tetapi tidak selalu lebih jelas. Gunakan perulangan for biasa ketika:
Isinya membutuhkan lebih dari satu pernyataan (comprehension hanya cocok untuk tepat satu ekspresi).
Isinya memiliki efek samping (mencetak, menulis ke file) -- comprehension adalah untuk membangun koleksi, bukan untuk menjalankan aksi.
Filter atau transformasinya memiliki begitu banyak bagian sehingga comprehension tidak lagi terbaca dari kiri ke kanan.