Hasil UTSP Secara keseluruhan UTSP UTSP1 60 120 50 100 40 80 30 60 20 40 10 20 0 0 10 20 30 40 50 60 70 80 90 100 10 20 30 40 UTSP2 50 60 70 80 90 100 60 70 80 90 100 UTSP3 140 200 120 150 100 80 100 60 40 50 20 0 0 10 20 30 40 50 60 70 80 90 100 10 20 30 40 50 Per kelas UTSP UTSP1 50% 70% 60% 40% 50% 30% 20% STK 40% STK MAT 30% MAT FIS 20% FIS 10% 10% 0% 0% 10 20 30 40 50 60 70 80 90 100 10 20 30 40 UTSP2 50 60 70 80 90 100 UTSP3 90% 80% 70% 60% 50% 40% 30% 20% 10% 0% 100% 80% STK MAT 60% STK MAT 40% FIS FIS 20% 0% 10 20 30 40 50 60 70 80 90 100 10 20 30 40 50 60 70 80 90 100 Fungsi KOM202 – Algoritme dan Pemrograman Motivasi • Suatu program yang besar dapat terdiri atas potongan kode yang dilakukan di berbagai bagian program • Suatu program untuk menggambar grafik batang perlu membuat garis-garis yang membentuk sumbu dan juga yang membentuk batang • Suatu program pengolah data perlu menghitung jumlah dari sekumpulan data untuk berbagai formula • Jika dituliskan berulang di berbagai bagian yang berbeda: • Ada risiko kesalahan penulisan karena mungkin nama variabel yang digunakan berbeda. • Jika ada perbaikan pada potongan kode tersebut, perbaikan harus diulang untuk semua lokasi yang menggunakannya. Fungsi • Potongan kode tersebut dapat kita bungkus dalam suatu fungsi. • Suatu fungsi dapat dipanggil oleh fungsi lain. • Sebenarnya kita telah menggunakan fungsi seperti input, print , dan int walau bukan kita yang mendefinisikannya. • Seperti halnya variabel, tiap fungsi memiliki nama, misalnya input, print, dan int. • Hal-hal yang perlu diketahui oleh suatu fungsi dapat disediakan melalui parameter (disebut juga argumen). Contoh penggunaan fungsi • Perhatikan potongan kode berikut: message = "Please enter an integer: " n = int(input(message)) # 1 # 2 • Perhatikan baris kedua: • Variabel message menjadi parameter untuk fungsi input. • Fungsi input memiliki hasil, disebut juga return value (nilai kembalian), yang kemudian menjadi parameter untuk fungsi int. • Nilai kembalian fungsi int kemudian disimpan ke variabel n Contoh: segitiga bintang • Sebagai contoh, kita buat lagi program segitiga bintang, tetapi kini menggunakan fungsi. * ** *** **** ***** Segitiga Bintang Tanpa Fungsi n = int(input()) for i in range(n): for j in range(i+1): print('*', end='') print('') # # # # # 1 2 3 4 5 • Komponen program: 1. Minta masukan untuk tinggi segitiga (1) 2. Loop untuk per baris (2-5) 3. Loop untuk mencetak sejumlah bintang (3-4) → kita coba jadikan fungsi Fungsi untuk mencetak sejumlah bintang • Apa nama fungsi yang akan dibuat? print_asterisks • Apa yang perlu diketahui? n untuk banyaknya bintang yang dicetak • Fungsi print_asterisks dapat didefinisikan sebagai berikut: def print_asterisks (n): for i in range(n): print('*', end='') # function header # function body # ... PEP 8: https://www.python.org/dev/peps/pep-0008/ Function names should be lowercase, with words separated by underscores as necessary to improve readability. Bagaimana cara menggunakan fungsi? • Fungsi print_asterisks dapat digunakan sebagai berikut: n = int(input()) for i in range(n): print_asterisks(i+1) print('') # i menjadi parameter Program lengkap tahap 1 def print_asterisks (n): for i in range(n): print('*', end='') # 1 # 2 # 3 n = int(input()) # 4 for i in range(n): # 5 print_asterisks(i+1) # 6 print('') # 7 • Baris 1 – 3 merupakan definisi fungsi print_asterisks • Baris 4 – 7 merupakan program utama yang dijalankan • Fungsi print_asterisks ditempatkan di awal agar dikenali (seperti halnya variabel yang harus dikenal agar dapat digunakan) • Perhatikan bahwa variabel n di program utama dan di fungsi print_asterisks merupakan makhluk yang berbeda. Akan dibahas di subtopik variabel lokal vs global. Fungsi segitiga bintang (v1) def print_triangle_1 (n): for i in range(n): for j in range(i+1): print('*', end='') print('') n = int(input()) print_triangle_1 (n) Fungsi segitiga bintang (v2) def print_asterisks (n): for i in range(n): print('*', end='') def print_triangle_1 (n): for i in range(n): print_asterisks(i+1) print('') n = int(input()) print_triangle_1 (n) Latihan • print_triangle_2 **** *** ** * • print_triangle_3 * ** *** **** • print_triangle_4 **** *** ** * • print_box_1 ******* ******* ******* ******* • print_box_2 ******* * * * * ******* Fungsi dengan nilai kembalian • • • • Fungsi mencetak bintang dan segitiga tidak perlu mengembalikan suatu nilai Ada banyak fungsi yang perlu mengembalikan nilai: input, int, abs Kata kunci return menentukan nilai yang dikembalikan Contoh sederhana: fungsi perkalian def kali (x, y): return x * y a = 5 b = 6 print(kali(a, b)) Contoh lain • Fungsi diff def diff(x, y): if x >= y: return x – y else: return y – x • Fungsi factorial def factorial(x): f = 1 while (x): f *= x x -= 1 return f Latihan • sum_x (x): 0 + 1 + 2 + 3 + … + x jika x >= 0, selainnya kembalikan None. • sum_x_y (x, y): jumlah semua bilangan integer dalam rentang [x, y] jika x <= y atau dalam rentang [y, x] jika x > y "Ongkos" penggunaan fungsi def kali (x, y): return x * y import time x = 0 start = time.process_time() for i in range(10000000): x += kali(i, i) elapsed = time.process_time() – start print(x, elapsed) x = 0 start = time.process_time() for i in range(10000000): x += i * i elapsed = time.process_time() – start print(x, elapsed) • Setiap pemanggilan fungsi melibatkan akses memori untuk menyimpan alamat kembali ke stack • Memori lebih lambat dari prosesor • Akses memori yang terlalu banyak akan memperlambat program • Untuk itu, fungsi yang dibuat perlu diatur agar tidak terlalu kecil sehingga terlalu boros dan juga tidak terlalu besar sehingga menyulitkan proses debugging Variabel global vs lokal • Setiap variabel memiliki ruang lingkup (scope) • Variabel yang dibuat di tingkat modul bersifat global • Variabel yang dibuat di tingkat fungsi bersifat lokal • Isi variabel yang dikirimkan sebagai parameter disalin ke variabel di tingkat fungsi → lokal • Disebut juga call by value • Penggunaan variabel global terutama yang nilainya diubah di dalam fungsi TIDAK disarankan karena akan mempersulit debugging Apa keluarannya? def func1(): return (x + 5) def func2(): x += 1 return (x + 5) x = 3 print(func1(), x) x = 3 print(func2(), x) • func1: 8 3 • Variabel global x dibaca saja (tidak diubah) • func2: UnboundLocalError: local variable 'x' referenced before assignment • Variabel lokal x diharapkan Apa keluarannya? def func3(): global x x += 1 return (x + 5) x = 3 print(func3(), x) def func4(): x = 1 return (x + 5) x = 3 print(func4(), x) • func3: 9 4 • Variabel global x diubah, harus menggunakan kata kunci global • func4: 6 3 • Variabel lokal x digunakan Parameter Opsional • Ingat fungsi print. Ada parameter end yang bersifat opsional. • Bagaimana jika kita ingin pengguna boleh menggunakan karakter lain untuk segitiga? Jika tidak ditentukan, gunakan asterisk. def print_triangle_1 (n, ch='*'): for i in range(n): for j in range(i+1): print(ch, end='') print('') n = int(input()) print_triangle_1 (n) print_triangle_1 (n, '#') Latihan • print_number_triangle(n, start): mencetak segitiga angka setinggi n dan dimulai oleh bilangan start (opsional, jika tidak disertakan , mulai dari 0). • print_number_triangle(3) 0 12 345 • print_number_triangle(3, 7) 7 89 012 Operasi assignment pada list • Suatu list merupakan objek, berbeda dengan variabel biasa • Apa keluaran potongan kode berikut? a = [1, 2] b = a c = [a] * 3 a[1] = 3 print(a, b, c, sep='\n') Operasi assignment pada list • Operasi assignment pada objek, termasuk list, tidak menyalin isi, tetapi membuat objek di sisi kiri merujuk ke objek di sisi kanan. • Perubahan pada objek di sisi kanan berarti mengubah nilai yang dirujuk • Pada contoh sebelumnya, perubahan pada a[1] juga terefleksi pada b[1] karena b merujuk ke a • Agar nilai disalin, gunakan alternative berikut: b = a[:] b = list(a) • Asumsi: list tidak memiliki anggota berupa list Deepcopy • Jika list yang ingin disalin memiliki anggota berupa list, gunakan operasi deepcopy. from copy import deepcopy a = [[1, 1], 2] b = deepcopy(a) a[1] = 3 a[0][1] = 3 print(a, b) List sebagai parameter fungsi def double_list(l): for i in range(len(l)): if isinstance(l[i], int) or \ isinstance(l[i], float): l[i] *= 2 a = [1, 2, [3, 4]] print(a) double_list(a) print(a) [1, 2, [3, 4]] [2, 4, [3, 4]] • Alamat yang merujuk ke list a dikirimkan ke fungsi double_list • List l di fungsi double_list merujuk ke alamat yang sama dengan list a • Perubahan pada list l terefleksi pada list a List sebagai nilai kembalian fungsi def generate_even_list(start, stop): l = [] if start%2: start += 1 if stop%2: stop -= 1 for i in range(start, stop+1, 2): l.append(i) return l a = generate_even_list(0, 20) print(a) Latihan • Ubah fungsi generate_even_list agar dapat menerima stop yang lebih kecil dari start dan menghasilkan list yang menurun • Contoh: print(generate_even_list(31, 19)) • Keluaran: [30, 28, 26, 24, 22, 20]