Tutorial Python untuk bukan pengatur cara/Fungsi
Daripada Wikibooks.
Seterusnya, fungsi.
Isi kandungan |
[sunting] Membuat fungsi
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 hello(): print "Hello" def area(width, height): return width * height def print_welcome(name): print "Selamat datang", name hello() hello() print_welcome("Kartini") w = 4 h = 5 print "lebar =", w, "tinggi =", h, "luas =", area(w, h)
akan memaparkan:
Hello Hello 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 dari satu argumen digunakan (bergantung kepada pengaturcara). Perhatikan juga bahawa fungsi tidak semestinya mengembalikan nilai.
[sunting] Pemboleh ubah di dalam fungsi
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.
[sunting] Contoh
temperature2.py
# Menukar nilai suhu dari fahrenheit atau celsius def print_options(): print "Menu:" print " 'p' Papar pilihan" print " 'c' tukar dari celsius" print " 'f' tukar dari fahrenheit" print " 'q' keluar program" def celsius_to_fahrenheit(c_temp): return 9.0 / 5.0 * c_temp + 32 def fahrenheit_to_celsius(f_temp): return (f_temp - 32.0) * 5.0 / 9.0 choice = "p" while choice != "q": if choice == "c": temp = input("Suhu dalam Celsius: ") print "Fahrenheit:", celsius_to_fahrenheit(temp) elif choice == "f": temp = input("Suhu dalam Fahrenheit: ") print "Celsius:", fahrenheit_to_celsius(temp) elif choice != "q": print_options() choice = raw_input("pilihan anda: ")
Contoh jalanan:
> python temperature2.py Menu: 'p' Papar pilihan 'c' tukar dari celsius 'f' tukar dari 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
area2.py
# Oleh Amos Satterlee print def hello(): print 'Hello!' def area(width, height): return width * height def print_welcome(name): print 'Welcome,', name name = raw_input('Your Name: ') hello(), print_welcome(name) print print 'To find the area of a rectangle,' print 'enter the width and height below.' print w = input('Width: ') while w <= 0: print 'Must be a positive number' w = input('Width: ') h = input('Height: ') while h <= 0: print 'Must be a positive number' h = input('Height: ') print 'Width =', w, 'Height =', h, 'so Area =', area(w, h)
Contoh jalanan:
Your Name: Josh Hello! Welcome, Josh To find the area of a rectangle, enter the width and height below. Width: -4 Must be a positive number Width: 4 Height: 3 Width = 4 Height = 3 so Area = 12
[sunting] Latihan
Tulis semula atur cara temperature2.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.