Tutorial Python untuk bukan pengatur cara/Fungsi

Daripada Wikibooks.

Lompat ke: pandu arah, gelintar

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.