Perulangan dengan For¶
Selain dengan while
, Python membolehkan kita untuk melakukan perulangan menggunakan pernyataan for
. Berbeda dengan while
, for
merupakan jenis perulangan berbatas atau finite loop yang akan berhenti tanpa perlu diberi kondisi. Oleh karena itu, kita tidak perlu mendefinisikan kondisi yang membuat perulangan tersebut berhenti dan hanya memerlukan objek iterable.
Note
Iterable adalah suatu objek yang dapat mengembalikan salah satu elemennya dalam satu waktu. Beberapa tipe data yang termasuk dalam iterable adalah tipe barisan (list
, tuple
, dan range
), string, dan pemetaan seperti dict
. [Uda21]
Komponen Pernyataan for
¶
Berbeda dengan while
, pernyataan for
memiliki beberapa komponen sebagai berikut:
Pernyataan dimulai dengan kata kunci
for
yang menyatakan bahwa pernyataan ini adalah sebuah perulangan denganfor
.Setelah
for
, dilanjutkan dengan sintaksitem in iterable
. Ada kata kunciin
yang merupakan operator keanggotaan yang sudah dibahas pada bab Struktur Data Python dan diapit olehitem
daniterable
. Secara berturut-turut,item
adalah variabel iterasi yang mewakili setiap elemen dalamiterable
daniterable
adalah objekiterable
tempat kita melakukan perulangan.Diakhiri dengan titik dua
:
Diikuti oleh blok kode
for
seperti pada blok kode yang lain.
Penggunaan for
¶
Kita akan menggunakan contoh kasus yang sama seperti while
, yaitu variabel names
. Dengan tujuan yang sama, penggunaan for
bisa ditulis seperti potongan kode di bawah.
for item in names:
print(item)
Di sini, item
akan menjadi variabel dengan nilai setiap elemen dalam names
. Supaya lebih gampang dipahami dan representatif, kita pakai variabel name
dibandingkan dengan item
.
names = ["brown", "james", "jackson", "lee", "johnson", "michael", "stephany"]
for name in names:
print(name)
brown
james
jackson
lee
johnson
michael
stephany
Sekarang, kita coba bandingkan dengan potongan kode while
sebelumnya.
idx = 0
while idx < len(names):
print(names[idx])
idx += 1
Terlihat bahwa for
lebih ringkas dan jelas. Kita juga tidak perlu membuat kondisi dan secara manual mendefinisikan penambahan indeks karena semua sudah diurus oleh for
. Analoginya sama seperti saat kita bilang,
Untuk setiap
name
yang ada di dalamnames
, tampilkanname
.
Tentu saja kita bisa melakukan apapun selain hanya menampilkan elemen.
Perulangan for
dengan break
dan continue
¶
Sama dengan while
, perulangan dengan for
juga bisa dibubuhi pernyataan break
dan continue
dengan fungsionalitas yang sama.
Contoh Kasus
Misalkan kita ingin mengisi sebuah kargo dengan beberapa barang. Biasanya, ada kapasitas maksimum yang dimiliki oleh kargo, sehingga hanya beberapa barang saja yang bisa muat. Bagaimana implementasi masalah tersebut dengan menggunakan for
dan mungkin menggunakan break
dan/atau continue
, jika didefinisikan manifesto
di bawah ini?
manifesto = [("bananas", 15), ("mattresses", 24), ("dog kernels", 42), ("computer", 120), ("cheeses", 5)]
manifesto = [("bananas", 20), ("mattresses", 25), ("dog kennels", 40), ("computer", 95), ("cheeses", 15), ("drugs", 15)]
cargo = []
total_weight = 0
for cargo_name, cargo_weight in manifesto:
print("current weight:", total_weight)
if total_weight >= 100:
print("Stop loading. Total weight:", total_weight)
break
if cargo_weight + total_weight > 100:
print(":: Skipping {} (weight: {})".format(cargo_name, cargo_weight))
else:
print("- Adding {} to cargo (weight: {})".format(cargo_name, cargo_weight))
cargo.append(cargo_name)
total_weight += cargo_weight
print("\nFinal weight:", total_weight)
print("Items in cargo:", cargo)
current weight: 0
- Adding bananas to cargo (weight: 20)
current weight: 20
- Adding mattresses to cargo (weight: 25)
current weight: 45
- Adding dog kennels to cargo (weight: 40)
current weight: 85
:: Skipping computer (weight: 95)
current weight: 85
- Adding cheeses to cargo (weight: 15)
current weight: 100
Stop loading. Total weight: 100
Final weight: 100
Items in cargo: ['bananas', 'mattresses', 'dog kennels', 'cheeses']
Penggunaan range
dalam for
¶
Fungsi bawaah range
digunakan untuk menghasilkan sebuah objek sejenis barisan berurut yang dimulai dari start
sampai stop-1
dengan selisih antar elemen sebesar step
. Nilai-nilai ini ditentukan ketika kita memanggil fungsi range
dengan sintaks berikut:
range(start, stop[, step])
Notasi [, step]
menandakan bahwa step
adalah argumen opsional karena tanpa menyediakan nilai step
pun fungsi range
tetap bisa dieksekusi dengan nilai bawaan step
adalah 1
. Ini berarti, jika kita memanggil fungsi range
dengan range(5, 10)
, maka selisih antar elemen di dalamnya adalah 1
. Perhatikan contoh pada cell di bawah ini.
five_to_nine = range(5, 10)
to_ten = range(10)
to_ten_with_two = range(0, 10, 2)
print(five_to_nine, type(five_to_nine))
print(to_ten, type(to_ten))
print(to_ten_with_two, type(to_ten_with_two))
range(5, 10) <class 'range'>
range(0, 10) <class 'range'>
range(0, 10, 2) <class 'range'>
Fungsi range
akan menghasilkan tipe data range
. Jika kita ingin melihat isi dari tipe data range
, kita harus mengubahnya ke dalam jenis barisan yang lain, seperti list
atau tuple
.
print(list(five_to_nine), tuple(five_to_nine))
print(list(to_ten), tuple(to_ten))
print(list(to_ten_with_two), tuple(to_ten_with_two))
[5, 6, 7, 8, 9] (5, 6, 7, 8, 9)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
[0, 2, 4, 6, 8] (0, 2, 4, 6, 8)
Karena range
juga termasuk dalam objek iterable, maka kita bisa melakukan perulangan menggunakan range
seperti berikut
for x in five_to_nine:
print(x)
print()
for x in to_ten:
print(x)
print()
for x in to_ten_with_two:
print(x)
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
2
4
6
8
Karena dengan range
kita punyai bilangan integer, kita bisa menggunakannya untuk melakukan indexing pada tipe barisan seperti list
, yang secara sintaks lebih mirip dengan penggunaan while
. Perhatikan perulangan for
di bawah ini pada names
.
for i in range(len(names)):
print(names[i])
brown
james
jackson
lee
johnson
michael
stephany
Perulangan pada Dictionary¶
Dictionary mempunyai metode bawaan items()
yang mengembalikan sebuah list
atas pasangan-pasangan key
dan value
sebagai tuple
. Sehingga, dengan perulangan for
, kita bisa mengakses key
dan value
seperti pada contoh kasus pertama di atas.
Eksplorasi
Misalkan kita punyai variabel dict_manifesto
yang merupakan manifesto
dalam bentuk dictionary dengan key
adalah nama barang dan value
adalah beratnya.
Definisikan
dict_manifesto
sebagai representasi dictionary darimanifesto
.Menggunakan
items()
, tampilkan pasangankey
danvalue
dalam polakey: value
menggunakan fungsiprint
.
Eksplorasi
Dengan masih menggunakan dict_manifesto
, definisikan dulu purchased_product
sebagai pemetaan antara nama produk dengan jumlah yang dibeli.
purchased_product = {"computer": 3, "cheeses": 10, "dog kennels": 5, "bananas": 20}
Dari purchased_product
di atas, kita ingin mengirimkan produk-produk di dalamnya ke para pembeli. Jika sekarang batas maksimal muatan dalam kargo adalah 1000, produk apa saja dalam purchased_product
yang bisa dikirim, dengan berat masing-masing produk sesuai pada dict_manifesto
.
List, Set, dan Dictionary Comprehension¶
Sebelumnya pada bagian Struktur Data Python, sudah dibahas berbagai cara untuk mendefinisikan list
, set
, dan juga dict
. Setelah kita belajar perulangan for
, ada cara yang lebih efektif dan cepat untuk mendefinisikan list
, set
, maupun dict
.
Contoh Kasus
Misal didefinisikan list
dari nama-nama baru dalam new_names
berikut.
new_names = ["joko", "abdul", "toni", "marcus", "james"]
Tugas kita ada 2:
Dari
manifesto
, coba buat sebuahlist
yang diberi namalist_product
. yang berisikan produk-produk dalammanifesto
.Membuat variabel
unique_names
yang berisikan nama-nama dalamnames
yang baru dan tidak boleh ada duplikat
Untuk menyelesaikan masalah pada contoh kasus di atas, kita bisa menggunakan perulangan for
dan metode append
pada list
. Mari kita coba implementasi.
list_product = []
for product, _ in manifesto:
list_product.append(product)
print(list_product)
['bananas', 'mattresses', 'dog kennels', 'computer', 'cheeses', 'drugs']
Note
Penggunaan _
dalam pernyataan for
di atas dikarenakan kita hanya memerlukan elemen pertama dari setiap elemen tuple
dalam manifesto
, sehingga untuk menghemat memori, kita bisa pakai _
. Ini sama saja dengan mengatakan “hiraukan elemen kedua dari setiap elemen tuple
”.
Kita butuh setidaknya 3 baris untuk membuat list_product
. Dengan menggunakan list comprehension, kita hanya membutuhkan 1 baris. Bentuk list comprehension adalah sebagai berikut.
[expression for item in iterable]
expression
pada potongan kode di atasn adalah elemen yang akan mengisi list
yang sedang didefinisikan. Sedangkan, item
dan iterable
adalah pernyataan for
biasa. Sehingga, penerapan list comprehension untuk kasus pertama adalah seperti cell di bawah ini
list_product_comprehension = [product for product, _ in manifesto]
print(list_product_comprehension)
print(list_product == list_product_comprehension)
['bananas', 'mattresses', 'dog kennels', 'computer', 'cheeses', 'drugs']
True
Sangat singkat bukan?
Tip
Jika memungkinkan, dalam mendefinisikan sebuah barisan, lakukanlah list comprehension dibanding perulangan for
biasa. Hal ini karena list comprehension lebih efektif dan cepat dari segi memori dan runtime.
Implementasi set comprehension juga serupa dengan list comprehension, yang membedakan hanyalah set
menggunakan {}
. Sehingga, bentuk set comprehension adalah {expression for item in iterable}
.
Eksplorasi
Untuk kasus nomor 2, silakan dicoba sendiri. Silakan definisikan unique_names
sebagai set
.
Membuat variabel
unique_names
yang berisikan nama-nama dalamnames
yang baru dan tidak boleh ada duplikat
Untuk dictionary comprehension juga memiliki implementasi yang serupa dengan set comprehension dalam hal kurung kurawal {}
. Akan tetapi, yang membedakan adalah adanya key
dan value
yang harus ditulis dalam expression
. Sehingga, implementasi dictionary comprehension adalah sebagai berikut.
{key: value for item in iterable}
Eksplorasi
Misalkan diketahui harga produk pada setiap barang pada manifesto
adalah seperti pada tabel berikut.
product |
price |
---|---|
bananas |
5.000 |
mattresses |
100.000 |
dog kennels |
250.000 |
computer |
1.000.000 |
cheeses |
10.000 |
drugs |
50.000 |
Buatlah variabel bertipe dict
, product_to_price
, yang memetakan produk dengan harganya!
Kemudian, dari histori transaksi pada tabel di bawah ini, buatlah variabel users_spending
yang memetakan setiap nama pada names
dan total pengeluaran masing-masing orang.
name |
purchase history |
---|---|
brown |
{“bananas”: 10, “drugs”: 5} |
james |
{“drugs”: 2} |
jackson |
{“computer”: 1, “matresses”: 2} |
lee |
{“cheeses”: 5, “bananas”: 5} |
johnson |
{“computer”: 2} |
michael |
{“drugs”: 1, “bananas”: 1, “mattresses”: 2} |
stephany |
{“drugs”: 10} |
joko |
{“computer”: 2, “mattresses”: 3} |
abdul |
{“mattresses”: 5, “drugs”: 1, “computer”: 1, “dog kennels”: 2} |
toni |
{“dog kennels”: 2, “drugs”: 2} |
marcus |
{“cheeses”: 10} |