Function (Fungsi)

Function (fungsi) merupakan blok perintah yang dikhususkan untuk melakukan tugas tertentu. Setiap fungsi memiliki nama, yang dapat “dipanggil” oleh bagian program lain ketika dibutuhkan. Jika sebuah program memiliki task yang sama dan dikerjakan berkali-kali, maka task tersebut dapat didefinisikan menjadi sebuah fungsi. Hal tersebut membuat program menjadi lebih efisien untuk ditulis dan dikembangkan.

Mendefinisikan Fungsi

Definisi fungsi diawali dengan keyword def, diikuti nama fungsi dan tanda kurung ( ), dan dibuka dengan titik dua :

Perhatikan contoh fungsi sederhana di bawah ini.

>>> def halo_user():
>>>     """Menampilkan pesan halo"""
>>>     print("Halo Python programmer!")
>>>
>>> halo_user()
Halo Python programmer!

Di atas adalah sebuah fungsi bernama halo_user(), yang tugasnya adalah menampilkan pesan “Halo Python programmer“. Fungsi dipanggil dengan menyebut namanya, disertai tanda kurung. Karena fungsi halo_user() tidak membutuhkan info apa-apa dalam menjalankan tugasnya, maka dalam tanda kurung variable apa-apa, alias kosong. Teks “Menampilkan pesan halo” adalah docstring, yakni deskripsi tentang tugas fungsi tersebut, untuk keperluan dokumentasi. Penulisan docstring menggunakan triple kutip (di dalam tanda “”” “””). Seluruh baris perintah yang merupakan “isi” dari suatu fungsi, ditulis dengan memajukan indentasi. Pada contoh di atas, fungsi halo_user() hanya terdiri dari 2 baris, dan tidak menerima informasi tambahan. Saat dipanggil dengan syntax halo_user(), maka perintah print dalam fungsi akan dijalankan, dan teks “Halo Python programmer” muncul di layar.


Parameter dan Argumen

Fungsi halo_user() di atas hanya menampilkan pesan “halo”, tanpa menyebut nama user yang disapa. Kita bisa sedikit memodifikasi fungsi, agar pesan yang ditampilkan juga menyebut nama si user. Ketika memanggil, fungsi harus diberi (di-passing) info berupa nama user yang akan ditampilkan. Informasi tersebut disampaikan dalam tanda kurung ( ), yang tadinya masih kosong.

>>> def halo_user(username):
>>>     """Menyapa username""
>>>     print("Halo " + username + "!")
>>>
>>> halo_user("Mike")
Halo Mike!

Saat perintah halo_user(“Mike”) dieksekusi, berarti program memanggil fungsi halo_user sambil memberi (mem-passing) String bernilai “Mike”. Fungsi menerima informasi tersebut dan menyimpannya dalam variable username. Kemudian fungsi menjalankan perintah print yang menampilkan pesan “halo” menggunakan username, sehingga teks “Halo Mike!” tampil di layar.

Variable username pada di atas adalah contoh dari parameter, yakni sebuah informasi yang dibutuhkan oleh fungsi untuk melakukan tugasnya. Sedangkan String “Mike” yang digunakan ketika memanggil fungsi halo_user(“Mike”), disebut dengan argumen. Argumen adalah sebuah informasi yang yang di-passing ketika memanggil suatu fungsi. Kita perlu mengetahui parameter apa yang dibutuhkan oleh fungsi, agar dapat memberikan argumen yang sesuai ketika memanggil.


Passing Arguments

Sebuah fungsi dapat memiliki beberapa parameter, sehingga argumen yang “dikirim” ketika memanggil fungsi tersebut juga perlu disesuaikan. Ada 2 metode mem-passing argumen ke sebuah fungsi, yakni positional, dan keyword.

Positional Arguments

Ketika memanggil sebuah fungsi, Python mencocokkan setiap argumen dengan parameter yang diminta oleh fungsi tersebut. Cara yang paling mudah adalah sesuai urutan argumen yang disediakan. Argumen yang ditulis pertama, adalah nilai untuk parameter pertama. Argumen yang ditulis kedua, adalah nilai untuk parameter kedua, demikian seterusnya. Inilah yang disebut positional arguments. Mari kita lihat contoh fungsi yang menggunakan positional arguments dalam sebuah program.

Fungsi Fav Fruit
Contoh Positional Argument dalam Fungsi

Pada program di atas, baris ke-1 dan ke-2 adalah definisih sebuah fungsi, bernama fav_fruit. Fungsi fav_fruit membutuhkan 2 buah parameter, yakni person_name dan fruit. Fungsi tersebut akan menampilkan teks nama seseorang (person_name) dan apa buah kesukaannya (fruit). Baris ke-4 dan ke-5 adalah pemanggilan fungsi fav_fruit. Dalam contoh ini, fungsi dipanggil sebanyak 2 kali, sehinggal teks yang dihasilkan pada tab Output juga ada 2 baris. Perhatikan ketika fav_fruit dipanggil, 2 buah argumen berupa String di-passing. String pertama adalah nama orang, dan String kedua adalah nama buah-buahan. Posisi argumen yang dikirimkan, disesuaikan dengan posisi parameter dari fungsi tersebut, inilah positional arguments. Metode ini memperhatikan urutan penulisan argumen. Jika urutan argumen yang di-passing tidak tepat, misalkan “Grape” ditulis terlebih dahulu sebelum “Anne”, tentunya teks yang ditampilkan akan terlihat konyol.

Keyword Arguments

Dalam metode keyword arguments, ketika memanggil sebuah fungsi, argumen yang di-passing secara langsung dispesifikasikan untuk parameter yang mana. Hal ini berguna, untuk menghindari kesalahan mengirim argumen yang sesuai dengan urutan parameter sebuah fungsi. Perhatikan contoh program berikut.

Fungsi Keyword Arguments
Contoh Keyword Arguments dalam Fungsi

Pada contoh di atas, kita masih menggunakan fungsi yang sama, yakni fav_fruit. Perbedaannya terletak pada cara memanggil fungsi, yakni baris ke-4 dan baris ke-5. Di dalam tanda kurung ( ), argumen berupa String nama orang dan nama buah, secara spesifik “dipasangkan” dengan parameter yang diminta oleh fungsi fav_fruit, yakni person_name dan fruit. Pada baris ke-5, merupakan contoh memanggil fungsi dengan urutan argumen yang tidak sesuai dengan urutan parameter pada fungsi fav_fruit. Namun, karena masing-masing argumen sudah “dipasangkan” dengan keyword parameter-nya, maka hal tersebut tidak menjadi masalah.

Nilai Default (Default Values)

Ketika membuat sebuah fungsi, kita bisa mendefinisikan nilai default untuk parameter-parameter-nya. Bila parameter sebuah fungsi mempunyai nilai default, maka ketika fungsi dipanggil, argumen untuk parameter tersebut boleh dikosongkan alias tidak di-passing. Jika tidak ada argumen yang di-passing, maka fungsi akan tetap berjalan menggunakan nilai default tadi. Namun, jika argumen di-passing, maka fungsi akan menggunakan nilai argumen baru yang dikirimkan. Perhatikan contoh program di bawah ini.

Fungsi Default Value
Contoh Default Value pada Parameter Fungsi

Program di atas masih menggunakan fungsi fav_fruit, dengan sedikit modifikasi. Perhatikan parameter fruit pada baris ke-1. Di sini fruit di beri nilai “Apple”. Artinya, ketika fungsi fav_fruit dipanggil, jika tidak ada nilai argumen yang diberikan untuk si fruit, maka secara default, fungsi akan menganggap fruit bernilai “Apple”. Baris ke-6, adalah contoh pemanggilan fungsi fav_fruit tanpa mengirimkan argumen fruit. Fungsi tetap berjalan dengan normal meski hanya menerima 1 argumen, yakni nama orang (person_name). Dapat dilihat pada tab Output, ketika menjalankan tugasnya, fungsi fav_fruit menggunakan nilai default-nya yaitu “Apple”, sebagai buah favorit “Charlie”. Perhatikan bahwa parameter person_name, tidak memiliki nilai default. Artinya argumen untuk parameter tersebut tetap harus dikirimkan nilainya, agar fungsi berjalan normal.

Jumlah Passing Argumen

Kadangkala ditemukan skenario, di mana programmer tidak mengetahui, berapa banyak jumlah argumen yang akan di-passing ke sebuah fungsi. Untungnya, Python dapat mengatasi kondisi tersebut. Programmer dapat mendefinisikan sebuah fungsi, dan mengantisipasi passing argumen yang jumlahnya belum pasti. Mari simak contoh sederhana berikut ini.

>>> def display_menu(*menus):
>>>     """Menampilkan daftar menu"""
>>>     for menu in menus:
>>>         print(menu)
>>>
>>> display_menu("Pizza")
Pizza
>>> display_menu("Pizza", "Burger", "Steak", "Pasta")
Pizza
Burger
Steak
Pasta

Pada contoh di atas, fungsi display_menu dapat menerima berapapun jumlah argumen yang dikirimkan. Kita bisa memanggilnya dengan 2, 5, 10, bahkan 100 argumen sekalipun, untuk ditampilkan ke layar.


Mengembalikan Nilai (Return Values)

Sebuah fungsi, tidak selalu berisi perintah print atau menampilkan output ke layar. Ada kalanya, fungsi hanya menerima data dan mengolahnya, lalu mengembalikan hasilnya. Inilah yang disebut dengan return values. Keyword return akan mengirim suatu nilai dari dalam fungsi ke baris perintah yang memanggil fungsi tersebut. Karena ada nilai yang dikirimkan, maka baris perintah yang memanggil fungsi, perlu disimpan ke dalam sebuah variable. Mari kita lihat contoh sederhana berikut.

>>> def multiply(operand1, operand2):
>>>     result = operand1 * operand2
>>>     return result
>>>
>>> hasil = multiply(5, 7)
>>> print("5 kali 7 = " + hasil)
35

Pada contoh di atas, terdapat sebuah fungsi bernama multiply. Dari nama dan isinya dapat diketahui, bahwa fungsi tersebut berguna untuk mengalikan 2 buah parameter numerik yang diterimanya, yakni operand1 dan operand2. Hasil perkalian keduanya, disimpan dalam variable result. Kemudian, fungsi mengembalikan nilai variable result menggunakan keyword return result. Pada baris berikutnya, fungsi dipanggil menggunakan 2 buah argumen numerik, yakni angka 5 dan 7. Karena fungsi multiply akan mengembalikan nilai, maka pemanggilan fungsi disimpan ke sebuah variable bernama hasil. Pada akhirnya, hasil perkalian ditampilkan ke layar menggunakan perintah print.

Sebuah fungsi, dapat mengembalikan nilai apa saja, termasuk tipe data yang kompleks seperti List dan Dictionary. Perhatikan contoh di bawah.

>>> def person_profile(first_name, last_name):
>>>     person = { 'firstname' = first_name, 'lastname' = last_name}
>>>     return person
>>>
>>> volunteer = person_profile("Bruce", "Handerson")
>>> print(volunteer)
{'firstname': 'Bruce', 'lastname': 'Handerson'}

Fungsi person_profile di atas menerima 2 buah parameter String, yakni first_name dan last_name. Parameter-parameter tersebut digunakan oleh fungsi, untuk membangun sebuah dictionary bernama person, yang kemudian dikirimkan ke si pemanggil fungsi, menggunakan keyword return person. Baris berikutnya, fungsi person_profile dipanggil dengan argumen “Bruce” dan “Handerson”, dan disimpan return value-nya ke variable volunteer. Ketika di-print, volunteer adalah sebuah dictionary.


Fungsi dan Looping

Fungsi dapat dipanggil atau memanggil berbagai jenis perintah yang telah kita pelajari sebelumnya, yakni conditional statement, ataupun looping for dan while. Mari kita lihat contoh program yang menggunakan fungsi, conditional statement, dan looping secara bersamaan.

While and Function
Contoh Fungsi dalam While

Pada program di atas, terdapat fungsi person_profile, yang menerima 3 buah parameter, yakni first_name, last_name dan age. Parameter age memiliki nilai default 0. Artinya, ketika fungsi ini dipanggil, argumen age boleh kosong (tidak di-passing). Fungsi ini akan membuat sebuah dictionary person, menggunakan parameter-parameter tadi, dan mengembalikannya (return person).

Baris ke-9 sampai ke-25 adalah program utama yang akan menggunakan fungsi person_profile. Pada awal program, kita definisikan sebuah List kosong, bernama volunteers. Kemudian looping while True dipanggil, untuk membaca input dari user, yakni first_name, last_name, dan age. Looping akan berhenti (break) bilamana user memberi input karakter ‘q’. Jika tidak, maka input-input tadi dipakai sebagai argumen untuk memanggil fungsi person_profile. Perhatikan pasangan kondisi if-else pada baris ke 18 sampai 21. Pada baris-baris tersebut, dilakukan pengecekkan apabila user tidak memberi tahu usianya. Jika age diisi, maka fungsi dipanggil dengan 3 buah argumen. Jika tidak, maka fungsi hanya dipanggil dengan 2 buah argumen, dan parameter age menggunakan nilai default-nya yakni 0. Nilai yang dikembalikan fungsi person_profile akan disimpan ke variable new_volunteer. Setiap profile volunteer yang terbentuk, ditambahkan ke List volunteers pada baris ke-22. Jika pada akhirnya, user memutuskan untuk berhenti memberi input (karakter ‘q’ dimasukkan), maka looping berakhir, dan daftar volunteers akan ditampilkan ke layar (baris ke-24 dan 25). Silahkan ketik ulang contoh program di atas, dan jalankan pada editor masing-masing untuk lebih memahaminya.


Passing List

List juga bisa menjadi argumen dalam fungsi. Ketika List di-passing, maka fungsi mendapat akses langsung ke data List tersebut. Jika terjadi perubahan data List dalam fungsi, maka perubahan tersebut bersifat permanen. Sehingga kita tidak perlu menggunakan keyword return untuk mengembalikan data List yang sudah ter-update. Untuk lebih jelasnya, perhatikan contoh program berikut ini.

List as Argumen
Contoh Argumen List

Pada program utama, didefinisikan 2 buah List, yakni new_orders, berisi daftar menu baru yang perlu “dimasak”, dan completed_orders, akan diisi dengan daftar menu yang telah selesai “dimasak”. Untuk menjalankan tugasnya, program utama memanggil 2 buah fungsi, yakni fungsi cooking_order dan cooked_order. Pertama-tama, untuk “memasak” menu, program memanggil fungsi cooking_order, dengan mengirim daftar makanan yang perlu di masak (new_orders), sekaligus menyediakan daftar untuk menyimpan menu yang telah siap (completed_orders). Menu-menu yang telah selesai dimasak dalam daftar completed_orders, “disajikan” ke layar dengan memanggil fungsi cooked_order. Perhatikan bahwa data dari List completed_orders ditambahkan dalam sebuah fungsi. Setelah fungsi selesai dipanggil dan List digunakan oleh fungsi lainnya, data dari proses yang terakhir tetap ada. Silahkan salin ulang contoh program di atas, dan jalankan pada editor masing-masing untuk lebih memahaminya.

Bila ingin mempertahankan data argumen bertipe List, agar tidak berubah setelah fungsi dipanggil, maka kita perlu meng-copy List tersebut ke sebuah List baru. Kemudian, kita gunakan List yang baru tersebut, ketika melakukan proses perubahan di dalam fungsi. Dengan demikian, data dalam List sebelumnya, tidak akan berubah setelah fungsi dipanggil. Cara meng-copy List sudah pernah dibahas pada materi List lanjutan.


Fungsi dalam Module

Dari contoh-contoh penggunaan fungsi di atas, kita bisa melihat bahwa fungsi merupakan blok perintah yang sebetulnya dapat dipisahkan dari blok program utama. Dengan memberi nama yang jelas pada sebuah fungsi, program utama terlihat lebih sederhana dan mudah dipahami. Untuk “membungkus” program utama agar lebih ringkas dan teratur, kita dapat menyimpan fungsi dan program utama ke dalam file yang berbeda. File untuk menyimpan fungsi, disebut dengan module (modul). Ketika program utama ingin menggunakan fungsi dari modul tertentu, program bisa meng-import modul tersebut. Meng-import suatu modul, artinya membuat fungsi-fungsi dalam modul tersebut agar tersedia bagi program utama. Ada beberapa cara untuk meng-import modul. Mari kita bahas satu per satu.

Mengimport Seluruh Module

Sebelum meng-import modul, tentunya kita harus menyiapkan modul-nya terlebih dahulu. Kita akan menggunakan contoh program sebelumnya, yakni program “mempersiapkan” menu pesanan. Sama halnya dengan program utama, sebuah modul Python disimpan dalam file berekstensi .py. Sebuah modul dapat berisi satu atau beberapa fungsi. Misalkan kita membuat modul file bernama cooking.py. Modul tersebut memiliki sebuah fungsi sebagai berikut.

>>> def cooking_order(new_orders, completed_orders):
>>>     """Cooking new orders and put them in list of completed orders"""
>>>     print("Preparing orders:")
>>>     while new_orders:
>>>         curr_order = new_orders.pop()
>>>         print("Cooking "+ curr_order +"...")
>>>         completed_orders.append(curr_order)

Sekarang kita akan membuat program utama, yang meng-import modul cooking.py, sehingga program utama bisa menggunakan fungsi cooking_order di atas. Perhatikan contoh program utama berikut ini.

>>> import cooking
>>> new_orders = ['Beef Lasagna', 'Chicken Soup', 'Pumpkin Pie']
>>> completed_orders = []
>>> cooking.cooking_order(new_orders, completed_orders)

Pada baris pertama, program meng-import modul cooking.py dengan perintah: import cooking. Keyword import adalah syntax untuk mengambil suatu modul agar fungsi-fungsinya digunakan oleh program utama. Sedangkan cooking adalah nama file modul tersebut, tanpa akhiran .py. Setelah modul di-import, program bisa memanggil fungsi cooking_orders dengan syntax nama_modul.nama_fungsi. Untuk contoh di atas menjadi cooking.cooking_orders. Karena fungsi cooking_orders membutuhkan 2 parameter List, maka ketika dipanggil, program utama menyertakan 2 argumen List yakni new_orders dan completed_orders. Hasil program ini akan sama dengan contoh sebelumnya, di mana setelah fungsi selesai dipanggil, maka List completed_orders akan berisi nama-nama menu yang sudah “dimasak”.

Sebagai bahan latihan, buatlah file modul yang sama dengan contoh ini. Lalu, tambahkan fungsi kedua yakni cooked_orders (silahkan copy isi fungsi dari contoh sebelumnya) ke dalam modul cooking.py. Kemudian buatlah program utama, yang secara berurutan memanggil 2 buah fungsi dari modul cooking.py.

Mengimport Fungsi Tertentu

Setelah melakukan latihan di atas, sekarang kita mempunya modul cooking.py dengan 2 buah fungsi di dalamnya, yakni cooking_orders dan cooked_orders. Misalkan saja, ada program utama yang hanya akan memakai salah satu fungsi tersebut. Maka, program utama dapat meng-import nama fungsi yang akan dipakai dari modul cooking. Syntax untuk meng-import sebuah fungsi dari modul tertentu adalah: from nama_modul import nama_fungsi. Berikut contohnya.

>>> from cooking import cooking_orders
>>> new_orders = ['Beef Lasagna', 'Chicken Soup', 'Pumpkin Pie']
>>> completed_orders = []
>>> cooking_order(new_orders, completed_orders)

Baris pertama, program meng-import fungsi cooking_orders dari modul cooking. Kemudian di baris terakhir, program memanggil fungsi cooking_orders, tanpa perlu menyebut nama modulnya, tetapi langsung nama fungsi. Di sinilah letak perbedaan dari metode meng-import fungsi secara spesifik.

Mengimport Seluruh Fungsi

Katakanlah modul cooking mempunyai 10 buah fungsi di dalamnya. Kemudian, kita akan membuat program utama yang memakai beberapa fungsi dari modul tersebut. Agar program utama terlihat simple, kita ingin memanggil langsung nama fungsi, tanpa menyebut modul. Apakah itu berarti kita perlu membuat beberapa baris import diikut nama fungsi satu per satu? Jawabannya Tidak. Kita bisa menggunakan simbol * (wildcards) ketika meng-import, yang artinya mengambil semua fungsi dari modul. Perhatikan contoh di bawah ini.

>>> from cooking import *
>>> new_orders = ['Beef Lasagna', 'Chicken Soup', 'Pumpkin Pie']
>>> completed_orders = []
>>> cooking_orders(new_orders, completed_orders)
>>> cooked_orders(completed_orders)

Baris pertama program di atas bermakna, dari (from) modul cooking, import seluruh fungsi. Dengan metode demikian, ketika memanggil fungsi, kita tetap bisa langsung menyebut nama fungsi, tanpa diawali nama modul.

Menggunakan Alias Suatu Module

Alias disini artinya memberi nama lain ketika meng-import sebuah modul. Jika modul diberi nama alias, maka ketika modul tersebut akan dipanggil, nama alias-lah yang akan digunakan. Berikut contoh sederhana penggunaan alias pada modul.

>>> import cooking as ck
>>> new_orders = ['Beef Lasagna', 'Chicken Soup', 'Pumpkin Pie']
>>> completed_orders = []
>>> ck.cooking_orders(new_orders, completed_orders)

Pada baris pertama, modul cooking di-import dan diberi nama alias ck. Pada baris terakhir, ketika program memanggil modul dan fungsinya, digunakan nama alias modul yakni ck. Tujuan penggunaan alias di sini tidak lain hanya untuk mempersingkat pengetikkan perintah.

Menggunakan Alias Suatu Fungsi

Sama halnya dengan modul, fungsi juga bisa diberikan nama alias ketika di-import. Hal ini bisa dilakukan, jika nama fungsi dianggap terlalu panjang. Langsung saja kita lihat contohnya berikut ini.

>>> from cooking import cooking_orders as cookorder
>>> new_orders = ['Beef Lasagna', 'Chicken Soup', 'Pumpkin Pie']
>>> completed_orders = []
>>> cookorder(new_orders, completed_orders)

Pada baris pertama, karena fungsi cooking_orders diberi nama alias cookorder ketika di-import, maka pemanggilan fungsi di baris terakhir menggunakan nama alias, alih-alih menggunakan nama fungsi sebenarnya.


Pada materi ini, kita sudah melihat bagaimana membuat dan menggunakan fungsi. Program yang baik bukan hanya sekedar program yang tepat hasil, namun juga jelas, singkat, dan efisien. Fungsi mampu menjawab kebutuhan tersebut. Ketika kita menyimpan fungsi dalam modul, maka fungsi tersebut bisa digunakan oleh program-program lainnya. Hal ini membuat pekerjaan menjadi lebih rapih dan terstruktur, apalagi dalam pengerjaan program-program skala besar.

Pada materi selanjutnya, kita akan belajar membuat program dengan pola pikir objektif (object-oriented programming). Kita akan mengenal Kelas (Classes), yakni kombinasi data dan fungsi dalam satu paket, yang dapat digunakan secara fleksible dan efisien.

What do you think? Leave a Comment Below.

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Up ↑

%d bloggers like this: