Python 03: Pengenalan Fungsi di Python

Mengetahui dan memahami cara menggunakan fungsi di Python

Dede Kurniawan
Data Science Indonesia
12 min readOct 26, 2022

--

Sejauh ini, kita telah menulis beberapa kode Python. Beberapa kode Python yang telah kita tulis, sebenarnya masih merupakan pecahan-pecahan kecil dari keseluruhan kode Python yang digunakan untuk membuat sebuah program. Pecahan-pecahan kecil dari kode Python memang bagus untuk memcahkan masalah yang kecil. Akan tetapi, apa yang seharusnya kita lakukan saat memecahakan permasalah yang besar atau membuat program menggunakan kode Python?

Image by rawpixel.com on Freepik

Jawabannya adalah menggunakan fungsi. Dengan menggunakan fungsi, kita dapat mengatur potongan-potongan kecil kode tersebut supaya lebih mudah untuk dikelola. Fungsi juga menyediakan cara untuk mengelompokkan beberapa kode ke dalam tugas-tugas kecil yang dapat dipanggil dari berbagai tempat di program [5].

Selain itu, fungsi juga mencegah kode kita menjadi semakin besar. Misalnya, ketika kalian membuat sebuah program yang kompleks, pasti akan ada beberapa kode yang kalian tulis ulang di beberapa kondisi. Hal ini malah akan membuat kode semakin besar dan sulit untuk memonitoring kode tersebut. Apalagi saat terdapat bug atau kesalahan pada kode tersebut, kalian harus memperbaiki kesalahan tersebut secara berulang dan di tempat yang berbeda. Jika kode tersebut terkandung dalam satu fungsi, kita hanya perlu memperbaikinya sekali di tempat yang sama.

Oleh karena itu, pentingnya kita memelajari tentang fungsi di Python supaya kode program dapat lebih mudah untuk ditulis, dibaca, dikelola, diuji, dan diperbaiki.

Daftar isi:
1. Definisi Fungsi di Python
2. Membuat dan Menggunakan Fungsi
3. Variabel Scope
4. Special Functions
5. Recursive Function
6. Menggunakan Fungsi pada Modul Biopython

1. Definisi Fungsi di Python

Program yang baik terdiri dari beberapa fungsi. Fungsi merupakan blok kode yang diberi nama dan dirancang untuk melakukan suatu tugas tertentu [4]. Fungsi digunakan ketika kita memiliki blok kode yang harus dieksekusi beberapa kali dalam suatu program. Dengan ini, kita dapat menghindari pengulangan dan membuat kode menjadi dapat digunakan kembali. Ini karena kita hanya perlu menulis fungsi sekali, tetapi dapat mengeksekusinya beberapa kali sesuai dengan yang kita mau.

Fungsi dibedakan menjadi dua, yaitu fungsi internal/bawaan (built in function) dan user-defined functions (fungsi eksternal) [2].

Fungsi internal/bawaan (built in function)

Fungsi bawaan merupakan fungsi yang sudah tersedia dalam bahasa pemrograman tanpa perlu mendefinisikan terlebih dahulu. Kita dapat langsung menggunakan fungsi ini dengan memanggil nama fungsi tersebut. Sebelumnya kita sudah menggunakan beberapa fungsi bawaan seperti print(), input(), int(), bool(), list(), dll.

Kumpulan fungsi bawaan pada python
Daftar fungsi bawaan yang ada di Python [4]

Untuk mengetahui penjelasan dari masing-masing fungsi bawaan tersebut, silahkan membaca dokumentasi resmi Python.

User-defined functions (fungsi eksternal)

Meskipun Python menyediakan banyak fungsi bawaan yang dapat digunakan untuk melakukan tugas tertentu, tetapi hal itu masih tidak cukup untuk mengatasi permasalahan saat membuat program. Untuk itu, kita perlu membuat/mendefinisikan fungsi sendiri. User-defined functions (fungsi eksternal) merupakan fungsi yang kita definisikan sendiri (dibuat menggunakan keyword) untuk melakukan tugas tertentu.

Kumpulan keyword atau statement di python
Daftar keyword yang ada di Python [1]

Kebanyakan fungsi yang kita definisikan sendiri digunakan untuk membuat sebuah modul terpisah dari kode program utama. Modul di Python merupakan pustaka kode yang dapat digunakan kembali dan memiliki ekstensi .py, yang mengimplementasikan sekelompok method dan statement [2]. Untuk menggunakan modul ke dalam kode program, kita harus mengimpornya terlebih dahulu menggunakan keyword import .

Kita akan mencoba menggunakan fungsi eksternal yang ada pada modul math. Modul math merupakan bagian dari Python standard library yang menyediakan fungsi untuk beberapa operasi matematika.

Menggunakan fungsi pada modul math (Gambar oleh penulis)

Untuk menggunakan fungsi yang ada pada modul math, kita harus mengimpornya terlebih dahulu seperti pada kode import math. Kemudian, kita harus menuliskan nama_modul.nama_fungsi() seperti pada kode math.sqrt(100)untuk menggunakan fungsi akar kuadrat (square root) pada modul tersebut.

2. Membuat dan Menggunakan Fungsi

Sebuah fungsi dapat mengambil sejumlah parameter input dan mengembalikan sejumlah hasil output. Kalian dapat melakukan dua hal dengan fungsi, antara lain mendifinisikannya dengan nol atau lebih parameter, dan memanggilnya dengan nol atau lebih argument[3]. Untuk membuat sebuah fungsi, kita mulai baris baru dengan keyword def diikuti oleh spasi, kemudian nama yang dipilih untuk fungsi tersebut, diikuti oleh sepasang tanda kurung tanpa spasi sebelum atau didalamnya, dan kemudian letakan titik dua pada akhir baris tersebut [5].

Struktur dasar suatu fungsi di Python
Struktur dasar suatu fungsi (Gambar oleh penulis)

Sebuah fungsi diawali dengan keyworddef, kemudian diikuti oleh:

  1. Nama fungsi → memiliki aturan sama seperti penamaan pada variabel.
  2. Parameter → merupakan variabel yang tercantum di dalam tanda kurung dan dipisahkan dengan tanda koma jika ada lebih dari satu (opsional).
  3. Titik dua → diperlukan pada akhir dari header. Header merupakan baris pertama dari fungsi yang mencakup nama fungsi dan parameter.
  4. Blok kode → mendefinisikan badan fungsi (body) dimulai pada baris berikutnya dari header dan harus memiliki tingkat indentasi yang sama.

Berikut kita akan mencoba membuat suatu fungsi sederhana untuk mengucapkan “selamat pagi”:

Membuat fungsi sederhana (Gambar oleh penulis)

Contoh diatas merupakan fungsi yang paling sederhana. Pada baris pertama, kita menggunakan keyworddef untuk memberitahu Python bahwa kita mendefinisikan suatu fungsi. Kemudian, kita beri nama greeting pada fungsi tersebut. Fungsi tersebut tidak membutuhkan informasi/parameter untuk melakukan tugasnya, sehingga tanda kurungnya kosong (tanda kurung tetap wajib meski kosong). Akhirnya, definisi fungsi tersebut diakhiri dengan tanda titik dua (:). Hal ini juga menandakan akhir dari header fungsi tersebut.

Selanjutnya, kita isi bagian dari body yang memiliki indentasi sama dengan suatu expression atau intruksi tertentu. Pada fungsi tersebut, baris pertama dari body kita isi dengan docstring yang menjelaskan mengenai apa yang dilakukan fungsi tersebut. Pada baris setelahnya, kita isi dengan intruksi print(“selamat pagi”). Terakhir, kita mengetikkan greeting() untuk menggunakan/memanggil fungsi yang telah kita buat.

Arguments dan parameters

Kita juga bisa melewatkan informasi untuk dikerjakan oleh suatu fungsi [5]. Untuk melakukan hal tersebut, kita harus memasukan nama parameter di dalam tanda kurung setelah nama fungsi. Parameter merupakan variabel yang tercantum di dalam tanda kurung setelah nama fungsi. Sedangkan, argument merupakan nilai yang dikirim ke fungsi ketika dipanggil.

Fungsi sederhana dengan 1 parameter (Gambar oleh penulis)

Di dalam tanda kurung dari greeting(user), user merupakan sebuah parameter. Ketika sebuah fungsi memiliki parameter, kalian harus memberikan argument saat memanggilnya atau fungsi tersebut tidak akan bekerja (error).

Error ketika tidak menambahkan argument pada fungsi yang memiliki parameter (Gambar oleh penulis)

Jadi, ketika kalian menambahkan sebuah parameter pada fungsinya, maka wajib untuk menambahkan argument ketika memanggil fungsi tersebut. Suatu fungsi bisa memiliki lebih dari satu parameter. Ketika fungsi memiliki banyak parameter, kalian juga harus menambahkan argument sebanyak jumlah parameter dari fungsi tersebut.

Fungsi yang memiliki banyak parameter (Gambar oleh penulis)

Pada contoh tersebut, terdapat dua parameter pada fungsinya. Jadi, kita harus menambahkan dua argument saat memanggil fungsi tersebut.

Fungsi yang mengembalikan suatu nilai

Sejauh ini, semua fungsi yang telah kita buat menampilkan output di layar sehingga dapat langsung memastikan fungsi tersebut berfungsi. Akan tetapi, semua dari fungsi tersebut tidak mengembalikan sebuah nilai. Jadi, ketika kita memasukan fungsi tersebut kedalam sebuah variabel, Python akan mengembalikan None.

Fungsi yang tidak mengembalikan nilai (Gambar oleh penulis)

Dalam kehidupan nyata, lebih umum bagi fungsi untuk mengembalikan beberapa nilai dan memasukkannya ke dalam variabel yang ditentukan dalam kode pemanggilan. Baris yang melakukan pengembalian suatu nilai biasanya adalah baris terakhir dari fungsi diikuti dengan spasi dan nama variabel (atau beberapa ekspresi) yang berisi nilai yang akan dikembalikan [5].

Fungsi dengan return value (Gambar oleh penulis)

Untuk membuat sebuah fungsi yang mengembalikan suatu nilai, kita dapat menggunakan keyword return. Keyword return digunakan untuk mengirim hasil kalkulasi fungsi kembali ke pemanggil. Fungsi yang tidak memiliki keyword return dinamakan void function dan dia mengembalikan None[4].

3. Variabel Scope

Sampai saat ini, kita telah menggunakan variabel di berbagai tempat kode program. Akan tetapi, tidak semua variabel dapat diakses dimanapun dalam sebuah kode program. Hal ini memunculkan sebuah konsep scope. Scope merupakan wilayah program Python di mana namespace dapat diakses secara langsung. Python memiliki dua jenis scope, yaitu local scope dan global scope.

Sebuah variabel dikatakan sebagai variabel global jika nilainya dapat diakses dan di modifikasi di seluruh kode program. Sedangkan, variabel lokal merupakan variabel yang didefinisikan di dalam sebuah fungsi (bersifat lokal). Variabel lokal di dalam definisi fungsi memiliki ruang lingkup lokal, ada selama fungsi tersebut dijalankan, dan tidak dapat diakses oleh kode apa pun di luar definisi fungsi [3].

Ilustrasi variabel global (Gambar oleh penulis)

Dari contoh di atas, kita dapat memastikan sendiri bahwa variabel global dapat diakses di tempat kode program manapun (baik di dalam fungsi maupun di luar fungsi). Sedangkan, variabel lokal hanya dapat diakses di dalam fungsi saja.

Ilustrasi variabel lokal (Gambar oleh penulis)

Akan tetapi, ketika kita mencoba mengkases variabel lokal di luar scope-nya atau di luar fungsi, maka akan menghasilkan error.

Mengakses variabel lokal di luar scopenya (Gambar oleh penulis)

Pada contoh tersebut, kami mencoba mengakses variabel y yang didefinisikan di dalam fungsi (lokal). Python akan mengembalikan error karena tidak ada nama variabel y yang berada di global scope. Dapat disimpulkan, Python akan mengevaluasi keseluruhan kode program untuk mencari sebuah variabel lokal terlebih dahulu. Selanjutnya, Python baru akan mencari variabel global jika tidak ditemukan variabel lokal tersebut. Terakhir, jika tidak ditemukan nama variabel terkait pada local scope maupun global scope, Python akan mengembalikan error.

Uniknya, Python memiliki cara untuk menjadikan sebuah variabel lokal menjadi variabel global. Hal ini bisa dilakukan menggunakan keyword global .

Penggunaan keyword global (Gambar oleh penulis)

Untuk menggunakan keyword global, kalian harus mengetikkannya terlebih dahulu kemudian nama variabel yang scope-nya akan dijadikan global (global nama_variabel).

4. Special Functions (lambda, map, filter)

Pada uraian di atas, kita telah belajar membuat sebuah fungsi menggunakan keyword def . Selanjutnya, kita akan membuat sebuah fungsi anonim (anonymous function). Python mendukung konsep fungsi anonim, juga disebut fungsi lambda. Bagian anonim dari nama tersebut didasarkan pada fakta bahwa fungsi tersebut tidak perlu memiliki nama [5].

Sintaks minimal untuk mendefinisikan fungsi lambda
Sintaks minimal untuk mendefinisikan fungsi lambda (Gambar oleh penulis)

Kita menggunakan fungsi anonim ketika kita memerlukan fungsi tanpa nama untuk jangka waktu yang singkat. Berikut adalah contoh penggunaan fungsi anonim:

Contoh sederhana fungsi anonim (Gambar oleh penulis)

Pada sintaks tersebut, kami membuat sebuah fungsi anonim sederhana yang digunakan untuk menambahkan dua nilai. Definisi fungsi anonim tersebut ditunjukan pada potongan sintaks lambda x, y: x + y dan menugaskannya pada variabel bernama penambahan. Untuk memanggil fungsi tersebut, kita harus mengetikkan nama variabel yang berisi fungsi tersebut. Karena fungsi tersebut memiliki dua parameter, kita harus menambahkan dua argument juga saat memanggil fungsi tersebut penambahan(5, 10).

Sama seperti menggunakan keyword def, lambda juga dapat menggunakan banyak parameter.

Fungsi anonim dengan banyak argument (Gambar oleh penulis)

Pada contoh tersebut, kami membuat sebuah fungsi anonim dengan dua parameter. Jadi, untuk memanggil fungsi tersebut harus menyertakan dua argument.

Pada kenyataannya, fungsi lambda banyak digunakan bersamaan dengan fungsi bawaan map() dan filter().

Fungsi map dan filter

Fungsi map() akan menerapkan fungsi yang diberikan ke setiap item dari sebuah iterable (list, tuple, dll.) dan mengembalikan sebuah hasil berupa iterable juga.

Struktur fungsi map
Struktur fungsi map (Gambar oleh penulis)

Fungsi ini membutuhkan dua parameter, yaitu fungsi dan iterable.

  • Function → fungsi yang akan dieksekusi dan diterapkan pada setiap item dari iterable yang diberikan.
  • Iterable → data yang setiap itemnya akan dikenakan sebuah fungsi.

Berikut adalah contoh implementasi penggunaan fungsi map() dan lambda secara bersamaan:

Contoh penerapan fungsi lambda dan map (Gambar oleh penulis)

Pada contoh tersebut, kami membuat fungsi untuk mengkuadratkan setiap item pada varibel data. Pertama, kami membuat sebuah iterable berupa list yang berisi data integer untuk diterapkan pada fungsi nantinya (data = [2, 3, 4, 5, 6, 7]). Pada potongan sintaks eksponensial = list(map(lambda x: x**2, data)), kami membuat sebuah fungsi kuadrat menggunakan lambdadan map() yang kemudian hasilnya ditaruh pada variabel eksponensial. Perlu diingat, fungsi map() hanya akan mengembalikan sebuah objek map. Untuk mengetahui nilai yang terkandung dalam objek tersebut, kita perlu melakukan casting, yaitu mengubah objeknya menjadi sebuah iterable (contohnya diubah menjadi tipe data list). Terakhir, potongan sintaks print(f”{data} → {eksponensial}”) menampilkan perbandingan data sebelum dan sesudah dikenakan fungsi tersebut.

Selanjutnya adalah fungsi filter(). Sama seperti namanya, fungsi filter() digunakan untuk mem-filter sebuah iterable sesuai kondisi yang ditentukan. Fungsi ini akan mem-filter iterable asli dan meneruskan item yang mengembalikan True untuk fungsi yang disediakan (fungsi yang digunakan untuk mem-filter).

Struktur fungsi filter
Struktur fungsi filter (Gambar oleh penulis)

Sama seperti map(), Fungsi ini juga membutuhkan dua parameter, yaitu fungsi dan iterable.

  • Function → fungsi untuk menguji apakah tiap item dari iterable mengembalikan True atau False.
  • Iterable → data berupa iterable yang setiap itemnya perlu difilter.

Berikut adalah contoh implementasi penggunaan fungsi filter() dan lambda secara bersamaan:

Contoh penggunaan fungsi filter dan lambda (Gambar oleh penulis)

Pada contoh tersebut, fungsi lambda digunakan dalam fungsi filter() yang memeriksa setiap item pada variabel data apakah termasuk bilangan genap atau tidak. Kemudian, fungsi tersebut kemudian akan mem-filter setiap item yang cocok dengan kriteria yang ditentukan oleh fungsi lambda dan hanya akan mengembalikan item-item yang sesuai dengan kriterianya.

5. Recursive Function

Di Python, legal bagi sebuah fungsi untuk memanggil dirinya sendiri. Fungsi yang memanggil dirinya sendiri disebut recursive, sedangkan proses eksekusinya disebut recursion [1].

Ilustrasi fungsi recursif
Ilustrasi fungsi rekursif (Gambar oleh penulis)

Salah satu contoh paling umum digunakan dari fungsi rekursif adalah menghitung nilai faktorial. Faktorial (n!) adalah hasil kali semua bilangan dari 1 sampai dengan n. Misalnya, 5! = 5*4*3*2*1 = 120 dan ketentuan untuk 0! = 1. Perlu diperhatikan, misalnya, 5! = 5*4!, dan secara umum, n! = n - (n-1)!. Jadi fungsi faktorial dapat didefinisikan dalam istilah dirinya sendiri. Berikut merupakan contoh penggunaan fungsi rekursif untuk menghitung faktorial:

Contoh implementasi fungsi rekursif (Gambar oleh penulis)

Supaya fungsi rekursif tidak memanggil dirinya sendiri secara terus menerus, kita juga harus menentukan kasus disaat nilai n = 0. Pada contoh tersebut, kita mengetikkan sintaks return 1 pada saat n = 0. Jika sebuah fungsi rekursif tidak pernah mencapai base case, ia akan terus melakukan pemanggilan rekursif selamanya, dan program akan terus berjalan. Hal ini disebut sebagai infinite recursion [1].

6. Menggunakan Fungsi pada Library Biopython

Setelah memahami tentang fungsi, kita akan mencoba menggunakan fungsi-fungsi yang ada pada libary Biopython.

Logo biopython
Sumber: https://biopython.org/

Biopython merupakan salah satu library Python yang menyediakan berbagai alat untuk biologi molekuler maupun biologi komputasi. Untuk mengetahui lebih lanjut silahkan kunjungi laman resmi dari library Biopython di https://biopython.org/.

Selanjutnya, kami akan mencoba mengimplementasikan penggunaan method dan fungsi dalam pemrosesan sekuens DNA sederhana. Bayangkan ketika kalian memiliki sekuens atau urutan nukleotida DNA yang dimulai dari 5' ke 3' seperti “CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATC”. Kemudian, kalian ingin menemukan komplemen (3' ke 5') dari DNA tersebut dan mengubahnya menjadi untaian RNA.

Untuk menggunakan library Biopython, kalian harus melakukan instalisasi terlebih dahulu. Menginstal Biopython sangatlah mudah, yaitu dengan mengetikkan !pip install biopython pada collab notebook kalian masing-masing.

Instalisasi library Biopython (Gambar oleh penulis)

Setelah sukses terinstal, kita sudah dapat menggunakan fungsi-fungsi yang ada pada modul tersebut. Di sini kita akan fokus pada seq objek karena bekerja dengan sekuens DNA.

Pemrosesan nukleotida DNA dengan biopython (Gambar oleh penulis)

Pada penyelesaian tersebut, kita melakuan serangkaian proses yang mungkin sedikit sulit dimengerti. Pertama, kami mengimpor modul yang diperlukan, yaitu untuk mengubah string menjadi sebuah objek Seq supaya kita dapat memproses untai nukleotida DNA. Kemudian, kami menuslikan variabel dna untuk menyimpan untai nukelotida DNA yang akan kita proses. Karena variabel dna masih berupa tipe data string, hal ini perlu kita ubah dulu menjadi objek Seq dengan mengcastingnya menggunakan fungsi Seq(dna) dan akhirnya menyimpannya ke variabel seq_dna.

Setelah menyelesaikan proses tersebut, kita sudah siap untuk melakan komputasi terhadap untai nukleotida DNA tersebut dengan mencari komplemennya dan hasil transkrpsi RNA-nya. Untuk mencari komplemen dari DNA tersebut, kita bisa menggunakan method .complement(). Sedangkan, method .transcribe() digunakan untuk mentranskripsikannya menjadi RNA. Terakhir, kami menampilkan hasil komputasi tersebut dengan fungsi print().

Menampilkan hasil komputasi untai nukleotida DNA (Gambar oleh penulis)

Dasar Dasar Pemrograman Python

8 stories

Daftar Pustaka:

[1] Downey, A. B. (2015). Think Python: How to Think Like a Computer Scientist. O’Reilly Media.

[2] Gowrishankar S. and Veena A. (2019). Introduction to Python Programming. CRC.

[3] Lubanovic, B. (2019). Introducing Python: Modern Computing in Simple Packages. O’Reilly Media.

[4] Matthes, E. (2019). Python Crash Course (2nd ed.). No Starch Press.

[5] Simpson, A. and Shovic, J. (2021). Python All-in-One For Dummies (2nd ed.). For Dummies.

--

--

Dede Kurniawan
Data Science Indonesia

A writer who focuses on the topics of Python 🐍, Data Science 📊, and Biology 🧬. My LinkedIn: https://www.linkedin.com/in/dede-kurniawann/