Uploaded by User44245

K8 AlproPy 2016 Fungsi

advertisement
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]
Download