Modul 4: Perulangan

Operator logika/boolean

Selain comparison operators, ada operator lain yang sangat berperan dalam pemrograman, khususnya pada kondisi, yaitu operator logika/boolean. Sering di berbagai permasalahan, ada beberapa kondisi yang harus dicek bersamaan untuk mengetahui apakah aksi perlu dijalankan atau tidak.

Contoh sederhana adalah untuk memastikan apakah nilai mahasiswa yang diinputkan user valid atau tidak, dimana nilai yang valid adalah 0-100. Dalam hal ini kita harus memastikan dua kondisi terpenuhi (kata terpenuhi sering diasosiasikan dengan bernilai True), yaitu nilai >= 0 dan nilai <=100. Jika tanpa operator logika, kita bisa menggunakan nested if-else walau kode terlihat kurang simple.

nilai = int(input("Masukkan nilai : "))
if nilai >= 0:
    if nilai <= 100:
        print('Valid')
    else:
        print('Tidak Valid')
else:
    print('Tidak Valid')
Masukkan nilai : 1000
Tidak Valid

Bandingkan jika kita menggunakan operator logika untuk memastikan kedua kondisi tersebut True sebelum menjalankan aksi.

nilai = int(input("Masukkan nilai : "))
if nilai >= 0 and nilai <= 100:
    print('Valid')
else:
    print('Tidak Valid')
Masukkan nilai : 1000
Tidak Valid

Tentu saja akan lebih terlihat efisiensinya dari pada menggunakan nested if saat ada semakin banyak kondisi yang harus dicek.

Untuk itu, mari kita lihat satu persatu operator logika yang tersedia.

Not

Seperti pada matematika, operator Not menegasikan nilai boolean seperti pada table di bawah ini.

x

not x

True

False

False

True

x = True
y = False
print(not x)
print(not y)
False
True

Terlihat simple dan mungkin saja kita bisa tetap bisa menghasilkan output yang sama tanpa not, namun penggunaan not dapat membuat kondisi menjadi lebih mudah dimengerti oleh kita.

Sebagai contoh, misalnya kita ingin menginfokan ke user, jika ia tidak bekerja, maka ia disarankan mengikuti pelatihan. Maka tanpa not kita bisa mengakalinya dengan if seperti ini, walau terlihat tidak umum.

is_working = True
if is_working:
    pass
else:
    print('Silakan mengikuti program pelatihan peningkatan skill coding')

Karena kita tertarik (ingin melakukan aksi) pada kondisi yang False, maka kita gunakan not untuk mempersingkat kode, menjadi seperti di bawah ini.

is_working = True
if not is_working:
    print('Silakan mengikuti program pelatihan peningkatan skill coding')

And

Operator and digunakan manakala kita ingin memastikan bahwa 2 kondisi bernilai True sebelum aksi dijalankan. Jika ada satu saja kondisi bernilai False maka hasil evaluasi and akan bernilai False.

x

y

x and y

True

True

True

True

False

False

False

True

False

False

False

False

print(True and True)
print(True and False)
print(False and True)
print(False and False)
print(True and True and False)
print(4 > 5 and 5 > 4)
True
False
False
False
False
False

Mari lihat kembali solusi perhitungan bonus pada bagian nested if-else.

masa_kerja = int(input("Masa Kerja : "))
umur = int(input("Umur : "))

if masa_kerja >= 5:
    if umur >50:
        print("Anda mendapatkan bonus 20%")
    else:
        print("Anda mendapatkan bonus 10%")
else:
    print("Maaf anda belum mendapatkan bonus")

Sekarang mari kita ubah dengan menggunakan and dari pada nested if-else.

masa_kerja = int(input("Masa Kerja : "))
umur = int(input("Umur : "))

if masa_kerja >= 5 and umur > 50:               #masa_kerja dan umur diperhatikan
    print("Anda mendapatkan bonus 20%")
elif masa_kerja >=5:                            #tidak peduli dengan umur, hanya tergantung masa_kerja
    print("Anda mendapatkan bonus 10%")
else:
    print("Maaf anda belum mendapatkan bonus")
Masa Kerja : 10
Umur : 40
Anda mendapatkan bonus 10%

Kedua solusi menghasilkan output yang sama, dan di banyak permasalahan serupa anda dapat memilih menggunakan antara menggunakan nested if-else atau and.

Or

Berlawanan dengan and, operator or akan menghasilkan True jika salah satu nilai bernilai True, atau dengan kata lain akan False hanya jika kedua nilainya False.

x

y

x or y

True

True

True

True

False

True

False

True

True

False

False

False

Kita biasa menggunakan operator or jika ada beberapa alternatif kondisi yang menyebabkan suatu aksi dijalankan.

Sebagai contoh kasus, misalnya kita ingin menentukan apakah seseorang berhak menerima diskon 20% atau tidak berdasarkan aturan berikut:

  • Pembeli merupakan member, atau

  • Jumlah belanja > 1 juta rupiah, atau

  • Sedang harbolnas

is_member = True
jlh_belanja = 500000
is_harbolnas = False

if is_member or jlh_belanja > 1000000 or is_harbolnas:
    print("Anda mendapat diskon 20%, jumlah bayar : ", 0.8*jlh_belanja)
else:
    print("Tidak ada diskon, jumlah bayar: ", jlh_belanja)
Anda mendapat diskon 20%, jumlah bayar :  400000.0

Update Prioritas Operator

Baik not, and, dan or tidak berada di level prioritas yang sama. Perhatikan contoh berikut, dapatkan anda menebak urutan prioritas ketiga operator tersebut?

x = True
y = False
z = False

print(x or y and z)
print(not x and y)
True
False

Jika or setara atau lebih tinggi prioritasnya dari pada and, maka seharusnya jawabannya adalah False, namun ternyata jawaban pertama adalah True, yang artinya and dieksekusi lebih dulu dari or. Sehingga dapat disimpulkan prioritas and lebih tinggi dari or.

Sedangkan pada jawaban kedua, terlihat bahwa and tidak dieksekusi lebih dulu dari pada not, artinya prioritas and tidak lebih tinggi dari not. Ternyata, di python memang prioritas not lebih tinggi dari and.

Sehingga prioritas operator kita sejuah ini adalah sebagai berikut:

Prioritas

Operator

Jenis

1.

()

2.

**

3.

+, -

unary

4.

*, /, %, //

5.

+, -

binary

6.

<, <=, >, >=, ==, !=

7.

not

8.

and

9.

or

Perulangan

Control Statements

Selain dapat memilih block statement yang akan dieksekusi oleh program, komputer juga dapat mengulang-ulang eksekusi suatu block. Kedua fitur ini biasa disebut dengan control statement pada bahasa pemrograman, karena ia dapat menentukan alur eksekusi statement-statement yang ada pada kode program.

Kegunaan Perulangan

Di contoh kode terakhir, kita sudah melihat bagaimana python dapat mengurutkan tiga buah bilangan dari besar ke kecil. Anda juga mestinya dapat membayangkan bagaimana kode python untuk mengurutkan dua bilangan dari besar ke kecil. Mungkin pertanyaannya adalah, bagaimana kalau kita ingin mengurutkan 4 angka, atau 5 angka, dan seterusnya? Apakah kita perlu membuat block kode spesifik untuk tiap banyak angka tersebut?

Tentunya hal ini tidak praktis dilakukan, bahkan tidak mungkin bisa untuk membuat block kode spesifik untuk setiap kemungkinannya. Sekedar informasi, jumlah kemungkinan urutan dari n buah angka adalah n! (faktorial), jadi untuk 5 buah angka, maka ada 5! = 120 kemungkinan urutan. Di sinilah perulangan berperan, yaitu dengan mengulang-ulang block statement tertentu sehingga kita tidak perlu menuliskan satu per satu.

Sebagai contoh lain, anda bisa melihat di game komputer, di mana sebuah karakter bisa bergerak dari satu posisi ke posisi yang lain dengan langkah kiri dan kanan berulang-ulang. Anda sudah bisa menebak, tentu saja jika ada 10 pasangan langkah kiri-kanan selama perpindahan, hal itu tidak terjadi karena kode langkah_kiri() dan langkah_kanan() (anggap ada fungsi tersebut) ditulis masing-masing 10 kali, melainkan dengan menggunakan perulangan.

Intinya, hampir di semua program komputer akan terdapat perpaduan antara pemilihan dan pengulangan, untuk itu pastikan anda benar-benar mengerti kedua hal tersebut.

#Jenis Statement Perulangan#

Ada 2 jenis statement yang dapat digunakan untuk perulangan berdasarkan keutuhan, yaitu while dan for.

Statement while

Fungsi statement while hampir mirip dengan fungsi if, yaitu aksi akan dijalankan ketika kondisi bernilai True. Perbedaannya adalah, jika if hanya akan menjalankan aksi sebanyak satu kali, while akan menjalankan aksi berulang-ulang selama kondisi bernilai True. Berikut ini adalah cara menggunakan statement while.

while <kondisi>:
    <aksi>

Perhatikan contoh berikut:

count = 0
while count < 2:
    print(count)
    count = count + 1
print('Selesai')
0
1
Selesai

Dari output terlihat bahwa perintah print(count) dieksekusi sebanyak 2 kali, yaitu ketika nilai count adalah 0 dan 1. Perubahan nilai count terjadi karena ada perintah count = count + 1 yang tentunya juga dieksekusi sebanyak 2 kali (karena berada di block yang sama dengan print(count)).

Jika kita jabarkan, maka perintah yang dijalankan oleh program adalah sebagai berikut:

count = 0
while count < 2   #count adalah 0, sehingga kondisi True
print(count)      #print(0)
count = count + 1 #count = 0 + 1, maka count = 1
while count < 2   #count adalah 1, sehingga kondisi True
print(count)      #print(1)
count = count + 1 #count = 1 + 1, maka count = 2
while count < 2   #count adalah 2, sehingga kondisi False
print('Selesai')  

Perhatikan bahwa program selalu mengecek kondisi terlebih dahulu sebelum menjalankan aksi dari while, begitu kondisi bernilai False, maka program akan keluar dari statement while dan melanjutkan ke perintah berikutnya (print('Selesai')).

Sekarang anda tentu sudah dapat menebak apa yang terjadi jika kita ubah nilai count yang awalnya 0 menjadi 2… Ya, tentu saja output yang terlihat hanyalah Selesai, hal ini karena kondisi while saat pertama kali dicek sudah bernilai False sehingga tidak ada aksi (atau juga disebut body) dari while yang dieksekusi.

Kombinasi while dan if

Seperti yang sudah dijelaskan di bagian block, bahwa mungkin saja terdapat block di dalam block. Dalam hal ini, kita bisa menempatkan if pada body dari while atau pun sebaliknya.

Perhatikan contoh berikut ini:

x = 1
jlh_genap = 0
jlh_ganjil = 0
while x <= 10:
    if x % 2 == 0:
        jlh_genap = jlh_genap + x
    else:
        jlh_ganjil = jlh_ganjil +x
    x = x + 1

print("Jumlah bilangan genap dari 1-10 adalah :", jlh_genap)
print("Jumlah bilangan ganjil dari 1-10 adalah :", jlh_ganjil)
Jumlah bilangan genap dari 1-10 adalah : 30
Jumlah bilangan ganjil dari 1-10 adalah : 25

Statement for

Meskipun sama-sama untuk pengulangan, while dan for memiliki bentuk yang berbeda, yaitu while mengulang berdasarkan kondisi, sementara for mengulang berdasarkan item di dalam sebuah sequence (kumpulan objek). Pembahasan lebih dalam tentang jenis-jenis sequence dalam Python akan di bahas kemudian. Berikut adalah konstruksi dari statement for:

for var in <sequence>:
    <aksi>

List dan Range

Untuk saat ini, kita cukup mengetahui dua bentuk sequence, yaitu range dan list.

  • [data_1, data_2, ..., data_n] : adalah bentuk list dengan n data. Data bisa berupa integer dan sebagainya, bahkan bisa berbeda-beda tipe data di dalam satu list. Untuk membentuk list cukup dengan [].

  • range(stop) : fungsi yang akan membentuk sequence integer berisi 0, 1, ..., stop-1

Terdapat bentuk kedua dari range yaitu:

  • range(start, stop, step) : membentuk sequence yang dimulai dari start, start+step, start+step+step, ..., stop-1, atau jika step negatif, maka berakhir sampai stop+1.

Perhatikan contoh berikut ini:

a = [1, 2, 3]       # terbentuk sebuah list dengan 3 item
print(a)
print(type(a))      # terlihat bahwa type data a adalah list


b = range(3)        # akan terbentuk range dengan 3 item yaitu 0, 1, 2
print(b)            # menampilkan objek range
print(list(b))      # untuk menampilkan isi, kita perlu ubah menjadi type list

c = range(10, 0, -1)
print(list(c))
[1, 2, 3]
<class 'list'>
range(0, 3)
[0, 1, 2]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Penggunaan for dengan list

for biasa digunakan bersama list jika kita ingin menggunakan satu persatu item di dalam list untuk aksi yang sama, mulai dari yang paling simple seperti print atau proses lainnya yang lebih komplek.

Perhatikan beberapa contoh penggunaan for dengan list berikut ini:

a = [3, 2, 1]
for i in a:
    print(i)
3
2
1
# buat list nama-nama hari
list_hari = ['senin', 'selasa', 'rabu', 'kamis', 'jumat', 'sabtu', 'minggu']

# print nama hari satu per satu
for hari in list_hari:
    print(hari)
senin
selasa
rabu
kamis
jumat
sabtu
minggu
# buat list nilai
list_nilai = [100, 20, 45, 80, 90, 30]

# hitung banyak nilai di bawah 50
u_50 = 0
for nilai in list_nilai:
    if nilai < 50:
        u_50 += 1

print(u_50)
3

Penggunaan for dengan range

Selain pengulangan berdasarkan item di dalam list, ada juga kondisi di mana kita ingin melakukan dengan jumlah yang sudah ditentukan di awal, misalnya 10 kali atau 20 kali dan seterusnya. Salah satu cara mudah adalah dengan menggunakan kombinasi for dengan range seperti contoh di bawah ini:

for i in range(10):
    print(i, "Cinta Telkom University")
0 Cinta Telkom University
1 Cinta Telkom University
2 Cinta Telkom University
3 Cinta Telkom University
4 Cinta Telkom University
5 Cinta Telkom University
6 Cinta Telkom University
7 Cinta Telkom University
8 Cinta Telkom University
9 Cinta Telkom University

fungsi range juga bisa diberikan parameter sesuai kebutuhan aksi dalam pengulangan, seperti contoh berikut:

bulan = ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"]
# Cetak bulan ganjil saja
for i in range(0, len(bulan), 2):
    print(bulan[i])
Januari
Maret
Mei
Juli
September
November

Augmented Assignment (+= & -=)

Mengingat pada pengulangan kita sering menambahkan atau mengurangi nilai variable counter (e.g., x = x + 1) untuk melakukan tracking jumlah pengulangan, Python menyediakan cara yang sedikit lebih singkat, yaitu yang disebut dengan augmented assignment yang terdiri dari += dan -=. Perhatikan contoh berikut ini:

a = 0
a += 1 #sama dengan a = a + 1
print(a)
a += 2 #sama dengan a = a + 2
print(a) 
a -= 1 #sama dengan a = a - 1
print(a)
1
3
2

Sehingga kita bisa ganti penggunaan increment variable counter pada contoh sebelumnya dengan augmented assignment.

count = 0
while count < 2:
    print(count)
    count +=1   #sebelumnya count = count + 1
print('Selesai')
0
1
Selesai

Sekedar informasi, pada beberapa bahasa lainnya seperti C/C++/Java, terdapat operator khusus untuk menambah atau mengurangi nilai variable dengan 1, yang biasa disebut dengan increment dan decrement operator yang biasa ditulis dengan ++ dan --, misalnya count++. Python tidak memiliki operator ini dan sebagai gantinya dapat menggunakan augmented assignment di atas.

Nested Loop

Untuk melakukan nested loop sama seperti nested if-else, misalnya seperti contoh berikut ini:

i = 0
while i < 3:    # while ke-1
    print("Loop i =",i)
    j = 0
    while j < 2:    # while ke-2
        print("Loop j =",j)
        j += 1 
    i += 1
Loop i = 0
Loop j = 0
Loop j = 1
Loop i = 1
Loop j = 0
Loop j = 1
Loop i = 2
Loop j = 0
Loop j = 1

Pertama mari kita perhatikan dan pahami output dari program di atas, karena nested loop bisa menjadi sangat kompleks dan banyak menimbulkan kesalahan pada program.

  • Program pertama-tama akan cek kondisi pada while ke-1 (i < 3), jika True, maka satu per satu statement di body while tersebut akan dijalankan.

  • karena pertama kali nilai i = 0, Loop i = 0 akan tercetak

  • j = 0

  • statement while ke-2 dieksekusi. Karena j < 2 bernilai True, maka Loop j = 0 tercetak

  • j = 0 + 1, sehingga j = 1

  • ini adalah bagian krusial yang programmer pemula sering salah atau terlupa, bahwa setelah menambahkan nilai j, maka berikutnya adalah pengecekan kembali ke kondisi while ke-2, bukan mengeksekusi i += 1.

  • karena j = 1, sehingga 1 < 2 adalah True, maka Loop j = 1 tercetak

  • berikutnya j = 1 + 1, sehingga j = 2

  • kembali lagi ke pengecekan kondisi while ke-2, karena j = 2, sehingga 2 < 2 bernilai False.

  • bagian krusial berikutnya. Selalu ingat, bahwa ketika False pada while ke-2, maka yang selesai hanyalah statement while ke-2. Selanjutnya program akan mengeksekusi baris statement (bagian block while ke-1) setelah block while ke-2, atau jika tidak ada statement lain, program akan kembali ke pengecekan kondisi while ke-1. Pada contoh di atas, program akan mengeksekusi satu statement lain yaitu i = 0 + 1', sehingga i = 1`

  • i += 1 adalah statement terakhir dari block while ke-1, maka sekarang program akan kembali ke pengecekan kondisi while ke-1. Karena i = 1, maka 1 < 3 bernilai True

  • Loop i = 1 akan tercetak

  • j = 0. Perhatikan bahwa nilai j diset kembali, bukan melanjutkan dari nilai j sebelumnya yaitu 2.

  • kondisi while ke-2 bernilai True

  • Loop j = 0 tercetak

  • j += 1, sehingga j = 1

  • kondisi while ke-2 bernilai True

  • Loop j = 1 tercetak

  • j += 1, sehingga j = 2

  • kondisi while ke-2 bernilai False

  • i += 1, sehingga i = 2

  • kondisi while ke-1 bernilai True

  • Loop i = 2 akan tercetak

  • j += 1, sehingga j = 0

  • kondisi while ke-2 bernilai True

  • Loop j = 0 tercetak

  • j += 1, sehingga j = 1

  • kondisi while ke-2 bernilai True

  • Loop j = 1 tercetak

  • j += 1, sehingga j = 2

  • kondisi while ke-2 bernilai False

  • i += 1, sehingga i = 3

  • kondisi while ke-1 bernilai False yaitu 3 < 3, program selesai.

Catatan:

  • aksi print("Loop i ... dilakukan sebanyak 3 kali, yaitu menghasilkan Loop i = 0, Loop i = 1, dan Loop i = 2

  • aksi print("Loop j ... dilakukan sebanyak 6 kali, yaitu 2 kali untuk setiap kali menjalankan print("Loop i ...

Jika anda sudah mengerti dengan contoh di atas, dapatkan anda menebak output dari program di bawah ini?

i = 0
while i < 3:    # while ke-1
    print("Loop i =",i)
    j = 0
    while j < i:    # while ke-2
        print("Loop j =",j)
        j += 1 
    i += 1
Loop i = 0
Loop i = 1
Loop j = 0
Loop i = 2
Loop j = 0
Loop j = 1

Penggunaan Nested Loop

Contoh penggunaan nested loop yaitu misalnya pada fungsi untuk mengurutkan nilai dalam list, penambahan nilai pada matriks (1 loop untuk baris, 1 loop untuk kolom), pada program yang kompleks seperti game (1 loop untuk keseluruhan aplikasi game, 1 loop untuk masing-masing mode permainan tertentu. Jika exit di satu bagian game, maka seperti exit di sebuah loop), atau program numerik seperti pengecekan prima. Saat ini kita hanya melihat satu contoh penggunaan nested loop, yaitu untuk mengurutkan nilai seperti kode di bawah ini, tapi anda dipersilakan untuk eksplore sendiri di Internet.

nilai = [7, 2, 4, 9, 1, 6, 0, 5]

print("Sebelum diurutkan:", nilai)

for i in range(len(nilai)-1):
    idx_min = i
    # cari posisi nilai minimum pada range index ke-i sampai akhir
    for j in range(i+1, len(nilai)):
        # jika nilai ke-j lebih kecil dari nilai min saat ini (yg ditunjuk idx_min)
        # simpan posisi j sebagai idx_min yang baru
        if nilai[j] < nilai[idx_min]:
            idx_min = j
    # tukar posisi nilai minimum ke posisi ke-i
    temp = nilai[idx_min]
    nilai[idx_min] = nilai[i]
    nilai[i] = temp

    # tukar posisi pada python bisa juga dengan cara berikut:
    # nilai[i], nilai[idx_min] = nilai[idx_min], nilai[i]

print("Setelah diurutkan:", nilai)
Sebelum diurutkan: [7, 2, 4, 9, 1, 6, 0, 5]
Setelah diurutkan: [0, 1, 2, 4, 5, 6, 7, 9]

Terakhir, bisa terdapat lebih dari 2 loop pada nested loop, dan bisa menggabungkan antara while dan for.

Selamat anda telah menyelesaikan Modul 4!!

Mohon berkenan memberikan Rating dan Feedback agar kami dapat meningkatkan kualitas modul ini!