Minggu, 15 Mei 2022

Tutorial Lengkap tentang Function di Python


Fungsi adalah blok kode yang terorganisasi dengan baik sehingga dapat digunakan kembali (reusable). 

Beberapa syarat umum fungsi adalah modularisasi dan fungsionalitasnya. Jadi sebaiknya fungsi hanya memiliki satu kegunaan spesifik namun dapat digunakan kembali. 
Fungsi-fungsi umum telah disediakan oleh Python misalnya print(). Namun Anda dapat selalu mendefinisikan fungsi Anda sendiri.

Mendefinisikan fungsi
Fungsi didefinisikan dengan keyword def diikuti dengan nama fungsi dan parameternya dalam kurung (). Secara opsional, Anda dapat menambahkan docstring - string dokumentasi dari fungsi. Blok kode dalam setiap fungsi dimulai dengan titik dua dan menggunakan indentasi. Fungsi berhenti ketika terdapat statement return [expression]. Mengembalikan [expression] kepada pemanggilnya. Sebuah return statement yang tidak membawa [expression] apapun sama dengan return None.
Sintaksis fungsi pada Python:


  1. def functionname( parameters ):

  2.    "function_docstring"

  3.    function_suite

  4.    return [expression]



Secara default, Python akan memposisikan setiap parameter sesuai dengan urutan pendaftaran pada saat didefinisikan, dan harus dipanggil sesuai dengan urutan tersebut. Contoh:
Fungsi berikut akan menerima sebuah string sebagai parameter dan mencetaknya.


  1. def printme( str ):

  2.    print(str)

  3.    return


Sintaksis return tanpa ekspresi dapat juga tidak dituliskan. Fungsi di atas akan sama seperti di bawah ini.


  1. def printme(str):

  2.     print(str)


Memanggil Fungsi

Mendefinisikan sebuah fungsi hanya memberikan namanya, menentukan parameter yang ingin menjadi bagian dari fungsi dan struktur dasar kode tersebut. Setelah struktur dasar terpenuhi, Anda dapat memanggilnya pada fungsi yang lain atau dari Python prompt. Contoh berikut untuk memanggil fungsi printme().


  1. def printme( str ):

  2.     print(str)

  3.     return

  4. #panggil

  5. printme("Panggilan Pertama")

  6. printme("Panggilan Kedua")


Saat kode diatas dijalankan, akan menghasilkan berikut:
Output:
Panggilan Pertama
Panggilan Kedua

Return

Pernyataan return [expression] akan membuat eksekusi program keluar dari fungsi saat itu, sekaligus mengembalikan nilai tertentu. Nilai return yang tidak mengembalikan (ekspresi) nilai bersifat sama dengan contoh di bawah ini. 


  1. return None


Contoh fungsi dengan return:


  1. def sum(arg1, arg2):

  2.     # Add both the parameters and return them.

  3.     total = arg1 + arg2

  4.     print('Inside the function: {}'.format(total))

  5.     return total

  6. # Panggil sum

  7. total = sum(10, 20);

  8. print('Outside the function: {}'.format(total))


Saat dipanggil:
Inside the function :  30
Outside the function : 30

Nilai kembalian dari sebuah fungsi dapat disimpan dalam sebuah variabel. Ini yang akan membedakan sebuah fungsi yang mengembalikan nilai dengan sebuah fungsi yang tidak mengembalikan nilai (sering disebut sebagai prosedur).


  1. def kuadrat(x):

  2.     return x*x

  3. a = 10

  4. k = kuadrat(a)

  5. print('nilai kuadrat dari {} adalah {}'.format(a, k))



Pass by reference vs value

Seluruh parameter (argumen) pada bahasa Python bersifat “passed by reference”. Artinya saat Anda mengubah sebuah variabel, maka data yang mereferensi padanya juga akan berubah, baik di dalam fungsi, maupun di luar fungsi pemanggil. Kecuali jika anda melakukan operasi assignment yang akan mengubah reference parameter.
Contohnya:


  1. def changeme(mylist):

  2.     mylist.append([1, 2, 3, 4])

  3.     print('Nilai di dalam fungsi: {}'.format(mylist))

  4.  

  5. # Panggil changeme

  6. mylist = [10, 20, 30]

  7. changeme(mylist)

  8. print('Nilai di luar fungsi: {}'.format(mylist))


Dapat dilihat dalam kode diatas, objek yang direferensi adalah sama. Sehingga nilai tersebut:
Nilai di dalam fungsi:  [10, 20, 30, [1, 2, 3, 4]]
Nilai di luar fungsi:  [10, 20, 30, [1, 2, 3, 4]]

Contoh lain di mana argumen ditimpa dalam fungsi:


  1. # Function definition is here

  2. def changeme(mylist):

  3.     "Variabel mylist berikut hanya dikenali (berlaku) di dalam fungsi"

  4.     mylist = [1, 2, 3, 4]  # This would assign new reference in mylist

  5.     print ('Nilai di dalam fungsi: {}'.format(mylist))

  6.  

  7. # Panggil fungsi changeme

  8. mylist = [10, 20, 30]

  9. changeme(mylist)

  10. print('Nilai di luar fungsi: {}'.format(mylist))


Reference parameter mylist diperbarui dalam fungsi changeme dengan operator assignment (sama dengan), sehingga nilai mylist akan berbeda karena bersifat lokal dalam fungsi changeme saja. Hasilnya akan sebagai berikut:
Nilai di dalam fungsi:  [1, 2, 3, 4]
Nilai di luar fungsi:  [10, 20, 30]

Argumen Fungsi

Beberapa argumen yang umum digunakan dalam fungsi:
  • Required arguments : Argumen yang wajib disertakan dan disusun secara terurut dalam pemanggilan fungsi.
  • Keyword arguments : Argumen yang ditambahkan dengan menyertakan nama variabel/keywordnya dalam pemanggilan fungsi.
  • Default arguments : Argumen yang bersifat tidak wajib diisi, karena telah memiliki nilai default.
  • Variable-length arguments : Argumen yang bersifat opsional namun dapat disesuaikan banyaknya dan tidak didefinisikan secara spesifik dalam definisi fungsi.

Contoh Fungsi dengan Required arguments
Untuk memanggil fungsi printme(), Anda wajib menyertakan satu parameter string saat pemanggilan. Misalnya Anda tidak menyertakan parameter -- hanya memanggil printme.


  1. printme()


Maka akan muncul error sebagai berikut:
Traceback (most recent call last):
File "test.py", line 11, in <module>
printme();
TypeError: printme() takes exactly 1 argument (0 given)
Bagian ini hanya memberikan gambaran tentang pemanggilan fungsi, Anda akan mempelajari lebih jauh tentang kesalahan (Error) di modul Penanganan Kesalahan.

Contoh Fungsi dengan Keyword arguments


  1. printme(str = "My string")


Dan sesuai definisi, fungsi akan mencetak seperti di bawah ini.
My String
Jika Anda memanggil fungsi dengan argumen kata kunci (keyword) atau dengan menyebutkan nama variabelnya, Anda tidak wajib meletakkan urutan variabel sesuai dengan urutan saat fungsi didefinisikan. Contoh:


  1. def printinfo(name, age):

  2.    "This prints a passed info into this function"

  3.    print('Name: ', name)

  4.    print('Age: ', age)

  5.  

  6. # Now you can call printinfo function (with age argument first)

  7. printinfo(age=5, name="Dicoding")


Saat dieksekusi, hasilnya:
Name:  Dicoding
Age:  5

Contoh Fungsi dengan Default arguments
Sebuah fungsi yang memiliki sejumlah argumen, dapat diatur nilai bawaannya (default), agar pada saat pemanggilan nilainya bisa menjadi opsional untuk diisi.
Argumen dengan nilai bawaan harus didefinisikan setelah argumen yang tidak memiliki nilai bawaan.


  1. def printinfo(name, age=35):

  2.    "This prints a passed info into this function"

  3.    print('Name: ', name)

  4.    print ('Age: ', age)

  5.  

  6. # Now you can call printinfo function (with optional argument age)

  7. printinfo(age=5, name='Dicoding')

  8. printinfo(name='Data')


Saat dieksekusi akan menghasilkan:
Name: Dicoding
Age: 5
Name: Data
Age: 35


  1. # fungsi berikut ini akan error saat didefinisikan

  2. # argumen dengan nilai bawaan harus setelah argumen tanpa bawaaan

  3. def printinfo(name='Data', age):

  4.    "This prints a passed info into this function"

  5.    print('Name: ', name)

  6.    print ('Age: ', age)


Output:
SyntaxError: non-default argument follows default argument

Bagian ini hanya memberikan gambaran tentang pemanggilan fungsi, Anda akan mempelajari lebih jauh tentang kesalahan (Error) di modul Penanganan Kesalahan

Contoh Implementasi Variable-length arguments
Contoh Implementasi argument dengan panjang yang dinamis (variable-length). Seperti yang telah dijelaskan, sebuah fungsi dapat memiliki argumen posisi juga argumen kata kunci (keyword). Keduanya memiliki kemampuan untuk bersifat dinamis, sehingga masukan fungsi dan panjang argumen dapat berubah-ubah.

  1. def functionname([formal_args,] *var_args_tuple ):

  2.    "function_docstring"

  3.    function_suite

  4.    return [expression]


Argumen posisi dapat bersifat dinamis dengan menambahkan sintaksis tanda bintang (*), untuk menampung kontainer (Tuple). Kontainer (Tuple) ini bisa bersifat opsional, artinya tidak wajib diisi (boleh kosong), jika memang tidak ada argumen yang perlu ditambahkan. Pada saat diisi, seperti layaknya Tuple dapat memiliki jumlah/panjang yang dinamis.

  1. def printinfo(fixedarg, *args):

  2.     "This prints a variable passed arguments"

  3.     print('Output: fixedarg {}'.format(fixedarg))

  4.     for a in args:

  5.         print('argumen posisi {}'.format(a))

  6.  

  7. # Panggil printinfo 

  8. printinfo(10)

  9. printinfo(70, 60, 50)


Saat dipanggil, hasilnya:
Output: fixedarg 10                                                                                            
Output: fixedarg 70                                                                                            
argumen posisi 60                                                                                              
argumen posisi 50
Argumen kata kunci (keyword) dapat bersifat dinamis dengan menambahkan sintaksis dua tanda bintang (**) untuk menampung kontainer (Dictionary).
Kontainer (Dictionary) ini bisa bersifat opsional, artinya tidak wajib diisi (boleh kosong), jika memang tidak ada argumen yang perlu ditambahkan. Pada saat diisi, seperti layaknya Dictionary dapat memiliki jumlah/panjang yang dinamis, dengan pasangan kunci-nilai (key-value) yang bervariasi. Jika ada argumen posisi dinamis dan argument kata kunci (keyword) dinamis, maka urutannya adalah argumen posisi dahulu, baru argumen kata kunci.

  1. def printinfo(*args, **kwargs):

  2.     for a in args:

  3.         print('argumen posisi {}'.format(a))

  4.     for key, value in kwargs.items():

  5.         print('argument kata kunci {}:{}'.format(key, value))

  6.  

  7.  

  8. # Panggil printinfo

  9. printinfo()

  10. printinfo(1, 2, 3)

  11. printinfo(i=7, j=8, k=9)

  12. printinfo(1, 2, j=8, k=9)

  13. printinfo(*(2, 3), **{'i':7, 'j':8})


Output:
# printinfo() --> kosong
argumen posisi 1
argumen posisi 2
argumen posisi 3
argumen kata kunci i:7
argumen kata kunci j:8
argumen kata kunci k:9
argumen posisi 1
argumen posisi 2
argumen kata kunci j:8
argumen kata kunci k:9
argumen posisi 2
argumen posisi 3
argumen kata kunci i:7
argumen kata kunci j:8


Fungsi Anonim

Fungsi Anonim (anonymous) tidak dideklarasikan seperti halnya fungsi pada umumnya dengan kata kunci def, melainkan menggunakan kata kunci (keyword) lambda. Sebuah fungsi lambda dapat menerima argumen dalam jumlah berapa pun, namun hanya mengembalikan satu nilai expression. Fungsi Lambda tidak dapat memuat perintah atau ekspresi lainnya, misalnya tidak bisa melakukan print.
Fungsi lambda bersifat mandiri, memiliki namespace-nya sendiri, dan tidak dapat mengakses nilai apapun selain yang berada dalam parameter list dan variabel global. Meskipun mirip, Lambda tidak dapat disamakan dengan inline statement pada bahasa C/C++.
Sintaks:

  1. lambda [arg1 [,arg2,.....argn]]:expression


Contoh penggunaannya:

  1. #!/usr/bin/python

  2. sum = lambda arg1, arg2: arg1 + arg2;



  1. print ("Value of total : ", sum( 10, 20 ))

  2. print ("Value of total : ", sum( 20, 20 ))


Hasilnya
Value of total : 30
Value of total : 40


Cakupan Variabel

Variabel dapat didesain untuk diakses atau tidak dapat diakses dalam lokasi atau cakupan (scope) tertentu. Hal ini bergantung lokasi Anda mendeklarasikan variabel. Cakupan variabel secara umum dibagi menjadi dua, yakni variabel Lokal dan variabel Global.
Variabel yang didefinisikan dalam fungsi bersifat lokal (di fungsi tersebut), dan yang didefinisikan di luar fungsi bersifat global. Perbandingkan kode berikut pada bagian yang ditebalkan dan keluarannya.
Artinya, variabel Lokal hanya dapat diakses dan dioperasikan dalam fungsi tempat variabel tersebut dideklarasikan. 

  1. total = 0 # ini variabel global

  2. def sum(arg1, arg2):

  3. # tambahkan kedua parameter dan return

  4. total = arg1 + arg2

  5. print('Inside the function: {}'.format(total))

  6. return total

  7. # panggil sum

  8. sum(10, 20)

  9. print('Outside the function: {}'.format(total))


Output:
Inside the function local total :  30
Outside the function global total :  0
Untuk mengenali variabel Global, tambahkan kata kunci (keyword) global saat memanggil nama variabel.
Penggunaan variabel global dinilai sebagai praktek yang tidak baik dalam pemrograman, karena tingkat kesulitan saat pencarian kesalahan (debugging) untuk variabel yang memiliki cakupan global akan lebih rumit dibanding variabel lokal.

  1. total = 0  # This is global variable.

  2. # fungsi didefinisikan di bawah ini

  3. def sum(arg1, arg2):

  4.     global total

  5.     total = arg1 + arg2 # variabel lokal total

  6.     print('Inside the function local total: ', total)

  7.     return total

  8.  

  9. sum(10, 20)

  10. print('Outside the function (global) total: ', total)



Output:
Inside the function local total : 30
Outside the function global total :  30

Posting Komentar