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]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()