PBO Python - 2019
PBO Python - 2019
__.:Design Patterns:.__
Iterators
Secara umum iterator adalah objek yang memiliki metode next() dan done();
selanjutnya akan mengembalikan True jika sudah tidak ada item yang tertinggal
di dalam daftar. Pada suatu bahasa pemrogaman yang tidak ada built-in iterator,
maka iterator akan terlihat seperti berikut:
while not iterator.done():
item = iterator.next()
# lakukan aksi terhadap item
1
Pemrograman Berorientasi Objek menggunakan Python
__.:Design Patterns:.__
di dalam Python, iterasi merupakan fitur khusus, sehingga metodenya memiliki
nama khusus, __next__, metode ini dapat diakses menggunakan built-in
next(iterator), protokol iterator memunculkan StopIteration untuk
memberitahukan bahwa loop telah lengkap. Akhirnya, kita gunakan sintaks for
item in iterator untuk mengakses item dalam iterator daripada menggunakan
loop while.
Protokol iterator
Di dalam Python, abstract base class Iterator berada di dalam modul
collections.abc, mendifinisikan protokol iterator. Memiliki metode __next__
yang untuk memanggil elemen baru dari daftar. Setiap iterator harus memenuhi
interface Iterable. Setiap kelas yang menyediakan metode __iter__ berarti
iterable; maka metode tersebut harus mengembalikan instan Iterator yang akan
menaungi seluruh elemen-elemen di dalam kelas.
Contoh 1:
2
Pemrograman Berorientasi Objek menggunakan Python
__.:Design Patterns:.__
List comprehensions
Coba kita lihat salah satu operasi yang umum; misalkan, mengubah daftar item
ke dalam suatu daftar item yang saling terkait. Sebagai contoh, kita membaca
daftar strings dari suatu file, dan mengubahnya ke dalam daftar bilangan integer.
Berikut contoh cara sederhana tanpa list comprehensions:
Contoh 2:
Sedangkan apabila menggunakan pattern list comprehensions akan seperti
Contoh 3 berikut:
Perhatikan contoh 2 pada baris 1 – 4 bandingkan dengan contoh 3 cukup dengan
baris 1 – 2. Tanda kurung siku menandakan pembuatan list. Di dalam list ada for
loop yang mengiterasi setiap item dalam urutan input.
Selain mengubah daftar item ke dalam daftar item lain, list comprehension juga
dapat menambahkan pengecualian terhadai nilai tertentu dengan menambahkan
pernyataan if di dalam comprehensions. Perhatikan Contoh 4.
Contoh 4:
Set dan Dictionary Comprehensions
Comprehensions juga dapat diterapkan pada selain list, misalkan set
dandictionary. Berikut adalah contoh menggunakan named tuple untu
3
Pemrograman Berorientasi Objek menggunakan Python
__.:Design Patterns:.__
memodelkan author/title/genre triads, dan selanjutnya mendapatkan suatu set
dari seluruh authors menulis pada genre tertentu.
Contoh 5:
Generator Expressions
Kadang kita ingin memproses daftar baru tanpa menempatkan list, set, atau
dictionary baru ke dalam sistem memori. Jadi kita memproses baris demi baris
tanpa harus membuat objek kontainer karena akan menggunakan banyak
memori. Berikut contoh misalkan program yang bertugas untuk memproses file
log. Setiap log sederhana akan menyimpan kejadian berdasarkan waktu
disimpan dalam 1 baris seperti terlihat pada Gambar 1.
Jan 26, 2015 11:25:25 DEBUG This is a debugging message.
Jan 26, 2015 11:25:36 INFO This is an information method.
Jan 26, 2015 11:25:46 WARNING This is a warning. It could be serious.
Jan 26, 2015 11:25:52 WARNING Another warning sent.
Jan 26, 2015 11:25:59 INFO Here's some information.
Jan 26, 2015 11:26:13 DEBUG Debug messages are only useful if you want to
figure something out.
Jan 26, 2015 11:26:32 INFO Information is usually harmless, but helpful
Jan 26, 2015 11:26:40 WARNING Warnings should be heeded.
Jan 26, 2015 11:26:54 WARNING Watch for warnings.
Gambar 1. Isi dari file log.txt
Apabila menggunakan for loop untu menangani file log, dilakukan proses satu
baris saat itu juga sebelum membaca baris berikutnya di dalam memori.
4
Pemrograman Berorientasi Objek menggunakan Python
__.:Design Patterns:.__
Sementara akan lebih baik jika menggunakan sintaks comprehensions untuk
tugas yang sama.
Disinilah generator expression memberikan solusi. Sintaksnya sama dengan
comprehensions, namun tidak meciptakan objek kontainer. Untuk membuat
generator expression, bungkus comprehension dalam () bukan [] atau {}.
Berikut adalah contoh kode untuk mem-parsing file log yang berisi data seperti
di atas, dan output berupa file baru yang berisi baris khusus WARNING yang
diambil dari gile log. Untuk mencoba program pada Contoh 6, anda buat file
bernama log.txt berisi data seperti pada Gambar 1. Selanjutnya buka console
(terminal cmd) ketik perintah berikut, <nama file program> diganti dengan
nama file python yang anda buat. Ulangi dengan mengubah “WARNING” pada
baris 6 program menjadi status lainnya, amati hasil eksekusi.
C:> Python3 <nama file program> log.txt logW.txt
Contoh 6:
5
Pemrograman Berorientasi Objek menggunakan Python
__.:Design Patterns:.__
Generators
Misalkan kita akan menghapus kolom WARNING dari file outpu, kita perlu
beberapa opsi dengan berbagai macam teknik. Berikut adalah contoh
menggunakan generator expression, seperti terlihat pada Contoh 7.
Contoh 7:
Dapat juga menggunakan for loop seperti biasa, namun kode program yang
dihasilkan memiliki manyak tingkat indent seperti terlihat pada Contoh 8.
Contoh 8:
berikutnya bisa menggunakan solusi yang benar-benar object oriented, seperti
terlihat pada Contoh 9.
6
Pemrograman Berorientasi Objek menggunakan Python
__.:Design Patterns:.__
Contoh 9:
Contoh selanjutnya adalah menggunakan generators. Sama seperti sebelumnya
progam ini akan membuat objek dengan dengan metode __next__ yang
memunculkan StopIteration jika selesai.
Contoh 10:
7
Pemrograman Berorientasi Objek menggunakan Python
__.:Design Patterns:.__
Baiklah, sekarang terlihat cukup bisa dibaca, setidaknya lebih pendek dari solusi
yang object oriented, yang membedakan adalah adanya yield.
Sebenarnya, yield adalah suatu kunci ke generators. Ketika Python melihat yield
di dalam fungsi, maka akan mengambil fungsi tersebut dan membungkus dalam
suatu objek tidak seperti pada contoh sebelumnya. Statemen yield dapat anda
analogikan seperti statemen return; akan mengeluarkan dari fungsi dan
mengembalikan suatu baris. Namun tidak seperti return, ketika fungsi dipanggil
kembali (via next()), akan memulai dari posisi terakhir – pada badis setelah
pernyataan yield – daripada memulai dari awal fungsi.