Tutorial Python untuk bukan pengatur cara/Fungsi

Seterusnya, fungsi.

Membuat fungsi

sunting

Untuk memulakan bab ini, di sini ada satu contoh apa yang "boleh" tetapi "tidak patut" dilakukan (jadi tak perlu cuba):

a = 23
b = -23

if a < 0:
    a = -a
if b < 0:
    b = -b
if a == b:
    print "Nilai mutlak", a, "dan", b, "adalah sama"
else:
    print "Nilai mutlak", a, "dan", b, "berbeza"

akan menghasilkan:

Nilai mutlak 23 dan 23 adalah sama

Atur cara ini nampak berulang-ulang. (Pengaturcara sepatutnya benci mengulang-ulang benda yang sama, ia adalah tujuan utama komputer dicipta.) Namun, Python membenarkan fungsi dibuat untuk mengurangkan kod yang berulang. Contoh yang lebih pendek (sedikit):

a = 23
b = -23

def mutlak(num):
    if num < 0:
        num = -num
    return num

if mutlak(a) == mutlak(b):
    print "Nilai mutlak", a, "dan", b, "adalah sama"
else:
    print "Nilai mutlak", a, "dan", b, "berbeza"

akan memaparkan:

Nilai mutlak 23 dan -23 adalah sama

Ciri utama program di atas adalah def. def (kependekan untuk define - definisi) dituruti oleh nama fungsi (mutlak). Kemudian parameter num dihantar daripada atur cara kepada fungsi mutlak() tadi. Kenyataan selepas : akan dilaksanakan apabila fungsi dipanggil. Kenyataan di dalam fungsi akan terus dilaksanakan sehingga kata kunci return ditemui atau engsotan fungsi berakhir. return akan mengembalikan nilai kepada atur cara utama.

Perhatikan nilai a dan b di atas tidak berubah. Fungsi boleh digunakan untuk mengulangi tugas yang tidak mengembalikan apa-apa nilai. Contoh:

def helo():
    print "Helo"

def keluasan(lebar, tinggi):
    return lebar * tinggi

def cetak_selamat(nama):
    print "Selamat datang", nama
    
helo()
helo()

cetak_selamat("Kartini")
l = 4
t = 5
print "lebar =", l, "tinggi =", t, "luas =", keluasan(l, t)

akan memaparkan:

Helo
Helo
Selamat datang Kartini
lebar = 4 tinggi = 5 luas = 20

Contoh tadi menunjukkan beberapa lagi perkara yang boleh dilakukan dengan fungsi. Perhatikan bahawa tidak kisah sama ada argumen digunakan atau atau tidak, ataupun lebih daripada satu argumen digunakan (bergantung kepada pengaturcara). Perhatikan juga bahawa fungsi tidak semestinya mengembalikan nilai.

Pemboleh ubah di dalam fungsi

sunting

Apabila membuang kod yang berulang, biasanya akan ada pemboleh ubah di dalamnya. Dalam Python, pemboleh ubah akan diuruskan dengan cara yang istimewa. Setakat ini, semua pemboleh ubah yang dipakai adalah sejagat (di dalam program utama, di luar fungsi). Fungsi mempunyai sejenis pemboleh ubah istimewa yang dipanggil "pemboleh ubah setempat" (local variable). Pemboleh ubah jenis ini hanya akan wujud (secara maya) apabila fungsinya dipanggil/dijalankan. Apabila pemboleh ubah setempat mempunyai nama yang sama dengan pemboleh ubah sejagat, pemboleh ubah setempat yang akan dipanggil. Mungkin sedikit memeningkan, sila lihat contoh di bawah untuk penjelasan:

a_var = 10
b_var = 15
e_var = 25

def a_func(a_var):
    print "in a_func a_var = ", a_var
    b_var = 100 + a_var
    d_var = 2 * a_var
    print "in a_func b_var = ", b_var
    print "in a_func d_var = ", d_var
    print "in a_func e_var = ", e_var
    return b_var + 10

c_var = a_func(b_var)

print "a_var = ", a_var
print "b_var = ", b_var
print "c_var = ", c_var
print "d_var = ", d_var

Akan menghasilkan:

in a_func a_var =  15
in a_func b_var =  115
in a_func d_var =  30
in a_func e_var =  25
a_var =  10
b_var =  15
c_var =  125
d_var = 

Traceback (most recent call last):
  File "C:\Python24\def2", line 19, in -toplevel-
    print "d_var = ", d_var

NameError: name 'd_var' is not defined

Dalam contoh ini, pemboleh ubah a_var, b_var, dan d_var adalah pemboleh ubah setempat, apabila berada di dalam fungsi a_func. Selepas kenyataan return b_var + 10 dijalankan, keempat-empat pemboleh ubah tadi akan lenyap. Pemboleh ubah a_var akan secara automatik menjadi pemboleh ubah setempat kerana ia adalah parameter kepada fungsi a_func. Pemboleh ubah b_var dan d_var juga adalah pemboleh ubah setempat kerana kedua-duanya berada di sebelah kiri tanda = di dalam pernyataan b_var = 100 + a_var dan d_var = 2 * a_var.

Semasa di dalam fungsi, a_var = 15 kerana fungsi tersebut dipanggil dengan a_func(b_var). Disebabkan semasa itu b_var = 15, maka panggilan kepada fungsi tersebut menjadi a_func(15). Ini menyebabkan a_var menjadi 15 semasa ia berada di dalam a_func.

Seperti yang dapat dilihat, sebaik sahaja fungsi a_func habis dijalankan, pemboleh ubah setempat a_var dan b_var akan hilang dan digantikan dengan pemboleh ubah yang asal. Kenyataan print "a_var = ", a_var akan memaparkan nilai 10 (bukan 15) kerana pemboleh ubah setempat telah hilang.

Perhatikan juga NameError yang berlaku. Pemboleh ubah d_var tidak lagi wujud kerana a_func telah habis dijalankan. Jika terdapat nilai yang dikehendaki dari sesuatu fungsi, bolehlah menggunakan return, contohnya return a_var.

Satu perkara lagi, perhatikan nilai e_var yang tidak berubah semasa di dalam a_func kerana ia tidak menjadi parameter dan tiada kenyataan di dalam fungsi tersebut yang mengubah nilainya.

Sesuatu fungsi membenarkan pemboleh ubah setempat wujud hanya di dalam fungsi itu sahaja. Ia juga akan menyorokkan pemboleh ubah yang mempunyai nama yang sama di luar fungsi tersebut.

Contoh

sunting

suhu2.py

# Menukar nilai suhu daripada Fahrenheit atau Celsius

def cetak_pilihan():
    print "Menu:"
    print " 'p' Papar pilihan"
    print " 'c' tukar daripada celsius"
    print " 'f' tukar daripada fahrenheit"
    print " 'q' keluar program"

def celsius_ke_fahrenheit(suhu_c):
    return 9.0 / 5.0 * suhu_c + 32

def fahrenheit_ke_celsius(suhu_f):
    return (suhu_f - 32.0) * 5.0 / 9.0

pilihan = "p"
while pilihan != "q":
    if pilihan == "c":
        suhu = input("Suhu dalam Celsius: ")
        print "Fahrenheit:", celsius_ke_fahrenheit(suhu)
    elif pilihan == "f":
        suhu = input("Suhu dalam Fahrenheit: ")
        print "Celsius:", fahrenheit_ke_celsius(suhu)
    elif pilihan != "q":
        cetak_pilihan()
    pilihan = raw_input("pilihan anda: ")

Contoh pelaksanaan:

> python suhu2.py
Menu:
 'p' Papar pilihan
 'c' tukar daripada celsius
 'f' tukar daripada fahrenheit
 'q' keluar program
pilihan anda: c
Suhu dalam Celsius: 30
Fahrenheit: 86.0
pilihan anda: f
Suhu dalam Fahrenheit: 60
Celsius: 15.5555555556
pilihan anda: q

keluasan2.py

# Oleh Amos Satterlee
print
def helo():
    print 'Helo!'

def keluasan(lebar, tinggi):
    return lebar * tinggi

def cetak_selamat(nama):
    print 'Selamat datang, ', nama

nama = raw_input('Nama Anda: ')
helo(),
cetak_selamat(nama)
print
print 'Untuk mendapatkan keluasan segi empat tepat,'
print 'masukkan lebar dan tinggi di bawah.'
print
l = input('Lebar: ')
while l <= 0:
    print 'Nombor positif sahaja'
    l = input('Lebar: ')
t = input('Tinggi: ')
while t <= 0:
    print 'Nombor positif sahaja'
    t = input('Tinggi: ')
print 'Lebar =', l, 'Tinggi =', t, 'jadi Keluasan =', keluasan(l, t)

Contoh pelaksanaan:

Nama Anda: Josh
Helo!
Selamat datang, Josh

Untuk mendapatkan keluasan segi empat tepat,
masukkan lebar dan tinggi di bawah.

Lebar: -4
Nombor positif sahaja
Lebar: 4
Tinggi: 3
Lebar = 4 Tinggi = 3 jadi Keluasan = 12

Latihan

sunting

Tulis semula atur cara keluasan2.py dalam Contoh di atas untuk mempunyai fungsi berasingan untuk luas segi empat sama, segi empat tepat dan bulatan (3.14 * jejari**2). Atur cara ini haruslah memiliki antara muka menu.

Penyelesaian

sunting
Penyelesaian

Tulis semula atur cara keluasan2.py dalam Contoh di atas untuk mempunyai fungsi berasingan untuk luas segi empat sama, segi empat tepat dan bulatan (3.14 * jejari**2). Atur cara ini haruslah memiliki antara muka menu.

def segi_empat_sama(7):
    return 7 * 7

def segi_empat_tepat(6,8):
    return 6 * 8

def bulatan(10):
    return 3.14 * jejari ** 2

def pilihan(r):
    print
    print "Pilihan:"
    print "s = kira keluasan segi empat sama."
    print "c = kira keluasan bulatan."
    print "r = kira keluasan segi empat tepat."
    print "q = keluar"
    print

print "Program ini akan mengira keluasan segi empat sama, bulatan atau segi empat tepat."
pilih  = "x"
pilihan()
while pilih != "q":
    pilih = raw_input("Sila masukkan pilihan anda: ")
    if pilih == "s":
        panjang = input("Panjang segi empat sama: ")
        print "Keluasan segi empat sama ini ialah", segi_empat_sama(panjang)
        pilihan()
    elif pilih == "c":
        jejari = input("Jejari bulatan: ")
        print "Keluasan bulatan ialah", bulatan(jejari)
        pilihan()
    elif pilih  == "r":
        lebar = input("Masukkan lebar segi empat tepat: ")
        tinggi = input("Tinggi segi empat tepat: ")
        print "Keluasan segi empat tepat ialah", segi_empat_tepat(lebar, tinggi)
        pilihan()
    elif pilih == "q":
        print "",
    else:
        print "Pilihan yang tidak diketahui."
        pilihan()