Phyton 2
Phyton 2
Sampai dengan saat ini, Anda tentu sudah menuliskan kode pemrograman
Python cukup banyak, termasuk di antaranya kode yang Anda tulis
mengalami kesalahan sintaksis atau indentasi. Lalu bagaimana agar ke
depan bisa mencegah hal tersebut terjadi?
Bergantung dengan editor yang Anda gunakan untuk menulis kode Python,
dimana salah satu fitur yang memudahkan penulisan, sehingga menghemat
banyak waktu untuk memformat kode sesuai arahan gaya penulisan (style
guide) PEP8 dan mengecek akan kemungkinan terjadinya kesalahan (error)
pada kode yang ditulis. Untuk itu akan dijelaskan sejumlah aplikasi yang
dapat Anda gunakan, dengan memanggil perintah atau sebaiknya
diintegrasikan ke editor kode yang Anda pakai, dengan tujuan untuk
membantu Anda mengecek kemungkinan kesalahan dan kesesuaian dengan
PEP8.
Lint
Lint adalah proses pengecekan kode atas kemungkinan terjadi kesalahan
(error), termasuk dalam proses ini adalah mengecek kesesuaian terhadap
arahan gaya penulisan kode (style guide) PEP8. Aplikasi yang digunakan
untuk proses ini disebut linter. Integrasi linter dengan editor kode Anda akan
membuat efisien dalam menulis kode Python. Pertimbangan ini karena
keluaran dari aplikasi linter hanya berupa teks singkat berupa keterangan
dan kode Error atau Warning atau Kesalahan Konvensi Penamaan (Naming
Conventions), akan dicontohkan selanjutnya.
Berikut akan dibahas 3 jenis aplikasi linter, silakan dicermati dahulu, tidak
harus semuanya diinstal/dicoba, hanya paket yang menurut Anda sesuai
kebutuhan saja yang digunakan. Hasil keluarannya mungkin mirip, tapi pada
kondisi tertentu akan ada keluaran atau fitur yang mungkin sesuai dengan
kebutuhan Anda menulis kode.
Pycodestyle (sebelumnya bernama pep8)
Untuk instalasi menggunakan manajer paket pip sebagai berikut : pip install
pycodestyle.
Pylint
Untuk instalasi menggunakan manajer paket pip sebagai berikut : pip install
pylint.
Flake8
Untuk instalasi menggunakan manajer paket pip sebagai berikut : pip install
flake8
Selanjutkan kita akan membahas sebuah contoh kode class sederhana yang
akan diproses lint, misal disimpan dalam sebuah file kal.py. Perhatikan di
baris 5, kolom 5 dan kolom 10. Ditulis berjeda antar huruf agar mudah dicek
penomoran kolomnya.
Jika diproses dengan pylint. Menunjukkan error (E0001) di baris 7 kolom 10.
1. pylint kal.py
2.
3. class Kalkulator:
6. self.i = _i
7.
9.
Memformat Kode
Jika proses lint atau linting hanya melakukan pengecekan, terkait arahan
gaya penulisan kode Anda bisa menggunakan aplikasi tambahan untuk
memformat kode agar sesuai PEP8. Sehingga untuk Anda yang
menggunakan editor kode yang sangat ringan dan ringkas fitur sekalipun,
misalnya tanpa fasilitas lint, tetap bisa menghasilkan kode sesuai konvensi
PEP8.
Black
Autopep8
Autopep8 adalah proyek open source (berlisensi MIT) yang termasuk paling
awal untuk memformat kode, dengan bantuan lint pycodestyle. Untuk
instalasi menggunakan manajer paket pip sebagai berikut: pip install
autopep8.
Kita akan menggunakan contoh kode sebelumnya kal.py yang berisi class
Kalkulator, versi awal sebelum diperbaiki dan dicek dengan linter, sebagai
berikut.
class Kalkulator:
self.i = _i
return self.i - _i
class Kalkulator:
self.i = _i
return self.i + _i
return self.i - _i
Kemudian jika diproses dengan yapf, tidak langsung mengubah isi file kal.py
tetapi tampil ke layar, dengan mengekseskusi perintah: yapf kal.py.
class Kalkulator:
self.i = _i
return self.i + _i
return self.i - _i
class Kalkulator:
self.i = _i
return self.i - _i
Setelah mempelajari kedua mekanisme: pengecekan gaya penulisan (style
guide) dan proses memformat kode, Anda tinggal fokus dengan penulisan
indentasi dalam kode Python, untuk format sisanya dapat dibantu oleh
aplikasi-aplikasi yang telah kita pelajari di atas.
Jika Anda menulis dengan editor kode yang sangat sederhana, anggap saja
seperti notepad di Windows atau pico/nano di Linux, maka dalam menuliskan
kode Python cukup perhatikan indentasi untuk setiap baris pernyataan
(statement). Setelah selesai menuliskan kodenya, simpan kodenya sebagai
file .py, lalu eksekusi perintah linter atau langsung eksekusi perintah aplikasi
untuk memformat kode. Hasilnya, kode Anda sudah dirapikan sesuai arahan
gaya penulisan PEP8 juga dilakukan pengecekan terhadap kemungkinan
kesalahan (jika Anda lakukan linting).
Untuk Anda yang mengikuti instalasi editor kode PyCharm pada modul
Persiapan, secara bawaan sudah menggunakan fitur inspeksi dengan
kemampuan yang kurang lebih sama, meskipun jika Anda mau, bisa juga
menambahkan aplikasi lint yang sudah dijelaskan sebagai tambahan dari
yang bawaan. Demikian juga untuk fitur format ulang kode juga tersedia
secara bawaan di aplikasi PyCharm.
Statement gabungan
Usahakan untuk tidak menggabungkan >1 statement pada baris yang sama.
Disarankan:
1. if foo == 'blah':
2. do_blah_thing()
3. do_one()
4. do_two()
5. do_three()
Tidak disarankan:
1. if foo == 'blah': do_blah_thing()
Tidak disarankan:
1. if foo == 'blah': do_blah_thing()
2. else: do_non_blah_thing()
3. try: something()
4. finally: cleanup()
Disarankan:
1. FILES = ('setup.cfg',)
Tidak disarankan:
1. FILES = 'setup.cfg',
Tidak umum jika Anda meletakkan trailing comma pada baris di mana Anda
menutup kurung/kurawal/siku, kecuali dalam tuple dengan satu elemen.
Disarankan:
1. FILES = [
2. 'setup.cfg',
3. 'tox.ini',
4. ]
5. initialize(FILES,
6. error=True,
7. )
Tidak disarankan:
1. FILES = ['setup.cfg', 'tox.ini',]
2. initialize(FILES, error=True,)
Anotasi Fungsi
Penggunaan anotasi fungsi sebaiknya menggunakan aturan baku untuk titik
dua (:) dan menggunakan spasi untuk penggunaan ->. Hal ini dijelaskan lebih
lanjut di PEP 484.
1. Yes:
4.
5. No:
7. def munge()->PosInt: …
4.
5. No:
4.
5. No:
Prinsip Overriding
Nama yang dilihat oleh user publik (misalnya API) sebaiknya merefleksikan
penggunaan/fungsinya, tidak merefleksikan implementasinya. Misal nama
fungsi berikut.
1. cariJalan()
Penamaan Deskriptif
Terdapat berbagai cara penamaan. Akan sangat membantu jika Anda telah
memilih sebuah cara penamaan, terlepas bagaimana cara tersebut
digunakan. Beberapa cara penamaan yang umum, antara lain:
Penggunaan frase atau huruf pada awal fungsi ini tidak disarankan pada
Python, atau lebih tepatnya tidak dibutuhkan, karena struktur pada Python:
ASCII
Nama Kelas
Nama Exception
Nama Variabel Global mengikuti fungsi/modul yang bersifat publik. Anda bisa
menggunakan garis bawah untuk menghindari variabel tersebut di-import jika
ia merupakan modul non-publik.
Gunakan standar penamaan Fungsi: huruf kecil dengan pemisah kata garis
bawah untuk meningkatkan keterbacaan. Tambahkan garis bawah sebagai
awalan untuk method non-publik dan variabel internal pada fungsi.
Konstanta
Kategori lain dari atribut adalah "subclass API", umumnya disebut protected
pada bahasa lain. Sebuah kelas dapat didesain untuk diwariskan (inherited-
from), misalnya untuk memodifikasi atau menjadi ekstensi dari perilaku
(behavior) kelas. Dalam mendesain kelas-kelas sejenis, pastikan untuk
membuat keputusan eksplisit, mana Variabel/Method yang memiliki atribut
publik, bagian dari subclass API, dan mana yang hanya anda gunakan
secara internal.
Interface
If
Seperti bahasa pemrograman lainnya, Python juga memiliki statemen percabangan IF. Di
Python, expression diletakkan setelah if, dan keputusan ditentukan berdasarkan nilai kebenaran
dari expression tersebut.
Tip: Python menganggap setiap nilai non-zero dan non-null sebagai True dan nilai zero/null
sebagai False.
Jika expression dievaluasi sebagai True, maka blok statement di dalam if statement akan
dieksekusi. Sesuai konvensi, blok ini memiliki indentasi masuk setelah tanda titik dua (:). Jika
expression dievaluasi sebagai False, maka blok selanjutnya (setelah statement IF) yang akan
dijalankan. Contoh:
1. kelerengku = 10
2. if kelerengku:
4. print (kelerengku)
Output:
Anda dapat menyingkat penulisan statement yang akan dieksekusi jika ia terwakili dalam 1 baris.
Misalnya:
1. if kerelengku: hitung()
Else
Statement Else dapat dikombinasikan dengan IF Statement, sebagai jalan keluar saat kondisi /
hasil evaluasi bernilai False. Else bersifat opsional dan tunggal. Mari kita implementasikan
dalam kasus pengecekan tinggi badan pengunjung di suatu wahana.
2. if tinggi_badan>=160:
4. else:
Output 1:
Output 2:
Masukkan tinggi badan Anda : 140
Maaf, Anda belum boleh masuk
Mari implementasikan pada kasus yang berbeda, kali ini kasusnya adalah pengecekan bilangan
ganjil atau genap pada suatu variabel.
1. bilangan = 4
2. if bilangan % 2 == 0:
4. else:
Output:
2. if nilai>80:
4. print("Pertahankan!")
5. elif nilai>70:
7. print("Tingkatkan!")
8. elif nilai>60:
9. print("Hmm.. Anda mendapat nilai C")
11. else:
Output 1:
Output 2:
Output 3:
Output 4:
Catatan: Jika sudah memenuhi salah satu kondisi if/elif, maka program akan keluar dari blok IF
Statement. Anda harus memastikan urutan secara logika, IF, Elif, dan Else dalam tingkatan yang
tepat. Contoh yang perlu diperhatikan adalah sebagai berikut:
if nilai>80: if nilai>0:
print("Selamat! Anda mendapat nilai A") print("Selamat! Anda mendapat nilai A")
print("Pertahankan!") print("Pertahankan!")
elif nilai>70: elif nilai<80:
print("Hore! Anda mendapat nilai B") print("Hore! Anda mendapat nilai B")
print("Tingkatkan!") print("Tingkatkan!")
elif nilai>60: elif nilai<70:
print("Hmm.. Anda mendapat nilai C") print("Hmm.. Anda mendapat nilai C")
print("Ayo semangat!") print("Ayo semangat!")
else: else:
print("Waduh, Anda mendapat nilai D") print("Waduh, Anda mendapat nilai D")
print("Yuk belajar lebih giat lagi!") print("Yuk belajar lebih giat lagi!")
Pada #Case 2, elif dan else tidak pernah dijalankan karena nilai berapapun (yang bernilai positif)
akan selalu masuk pada IF (klausa pertama).
Mari kita implementasikan pada kasus pengecekan bilangan positif, negatif, atau nol.
1. bilangan = -3
2. if bilangan > 0:
6. else:
Output:
IF Ternary
if (condition): condition_if_true if condition else condition_if_false
condition_if_true
else:
condition_if_false
Opsi lain dari ternary operators melibatkan tuples. Contoh kodenya berikut:
IF Ternary_Tuples
if (condition): (condition_if_false, condition_if_true)[condition]
condition_if_true
else:
condition_if_false
Pada tuple ini, dimanfaatkan nilai [0] sebagai False dan [1] sebagai True.
Aplikasi kedua ini menurut beberapa aktivis kurang ‘pythonic’, salah satunya karena cukup
membingungkan untuk meletakkan klausa saat True atau False. Selain itu, kedua nilai akan tetap
dievaluasi walaupun hanya dibutuhkan salah satunya. Lihat contoh berikut:
1. kondisi = True
3. #Output is 2
4.
5. print((1/0, 2)[kondisi])
Ternary-tuples sebaiknya dihindari, terutama untuk kode (dan klausa True/False) yang kompleks.
Ternary dapat digunakan untuk menyingkat kode saat klausa True/False Anda cukup pendek -
misalnya sebuah fungsi tanpa parameter.
ShortHand Ternary
Selain Ternary Operators, dikenal juga shorthand ternary tag yang mungkin membantu Anda
untuk memeriksa kode/hasil dari sebuah fungsi dan memastikan outputnya tidak menyebabkan
error (atau minimal memberikan informasi relevan saat error):
1. hasil = None
3. print(pesan)
Output:
Perulangan
For
2. print('Huruf: {}'.format(huruf))
3.
6. print('Flower: {}'.format(flower))
Output:
Huruf : D
Huruf : i
Huruf : c
Huruf : o
Huruf : d
Huruf : i
Huruf : n
Huruf : g
Flower: mawar
Flower: melati
Flower: anggrek
3. print('Flowers: {}'.format(flowers[index]))
Output:
Flower : mawar
Flower : melati
Flower : anggrek
While
Contoh:
1. count = 0
4. count = count + 1
Output:
Hitungannya adalah: 0
Hitungannya adalah: 1
Hitungannya adalah: 2
Hitungannya adalah: 3
Hitungannya adalah: 4
Hitungannya adalah: 5
Hitungannya adalah: 6
5.
6.
Potongan kode di atas tidak akan pernah bernilai False karena nilai var tidak
pernah berubah. Untuk menghentikan infinite loop, gunakan CTRL (atau
CMD⌘) - C untuk menghentikannya dan keluar dari program.
Anda juga dapat menyingkat penulisan blok statement While jika statement
Anda cukup terwakili oleh satu baris.
1. while (var1): do_something()
Perulangan Bertingkat
******
*****
****
***
**
*
Anda dapat melakukannya dengan kode berikut:
1. for i in range(0, 6):
4. print()
Tip: Tambahkan parameter end pada print untuk mengatur karakter yang
mengakhiri pencetakan string/teks Anda. Secara default, karakter end ini
adalah newline ('\n').
Kontrol Perulangan
Break
Contoh 1:
1. for huruf in 'Dico ding':
3. break
Output contoh 1:
3. if j>i:
4. print()
5. break
6. else:
7. print("*",end="")
8.
Output contoh 2:
*
**
***
****
*****
******
*******
********
*********
**********
Continue
Contoh 1:
1. for huruf in 'Dico ding':
3. continue
2. baris = 0
3. bintang = 0
6. print()
7. baris = baris+1
8. bintang=0
10. print("*",end="")
*
**
***
****
*****
******
*******
********
*********
**********
Pada Python juga dikenal fungsi else setelah for. Fungsinya diutamakan
pada perulangan yang bersifat pencarian - untuk memberikan jalan keluar
program saat pencarian tidak ditemukan.
2. if cari(item):
3. #ditemukan!
4. proses_item()
5. break
6. else:
8. not_found_in_container()
Anda mungkin melihat sesuatu yang menarik. Ada If dan Else, namun dalam
tingkatan yang berbeda, apakah mereka terkait?
2. do_something(that_thing)
3. else:
4. no_such_thing()
Contoh penggunaan dari for-else dapat dilihat pada potongan kode berikut
(jalankan di konsol sebelum melanjutkan ke bagian selanjutnya):
1. for n in range(2, 10):
3. if n % x == 0:
5. break
3. if n % x == 0:
5. break
6. else:
2. while n > 0:
3. n = n - 1
4. if n == 7:
5. break
6. print(n)
7. else:
8. print("Loop selesai")
Output:
9
8
Pada contoh diatas, loop akan di break saat nilai n == 7, saat keluar dari
perulangan, maka python tidak akan memunculkan tulisan Loop selesai,
namun jika tidak dilakukan break (perulangan berakhir dengan normal):
1. n = 10
2. while n > 0:
3. n = n - 1
4. print(n)
5. else:
6. print("Loop selesai")
Output:
9
8
7
6
5
4
3
2
1
0
Loop selesai
Pass
Pass statement adalah operasi bersifat Null (kosong), tidak ada yang terjadi
saat ia dipanggil. Contohnya:
1. def sebuahfungsi():
2. pass
Output:
#tidak ada
Jika Anda mendeklarasi sebuah fungsi tanpa kode apapun, justru akan
terjadi error:
1. def sebuahfungsi():
Output:
2. while(var1!="exit"):
4. print(int(var1))
Output:
Kita dapat membaca bahwa program gagal saat mencoba proses konversi
variabel var1. Saat program mengalami kegagalan atau exception, ia akan
langsung keluar. Bandingkan dengan pendekatan berikut (mengenai
exception, import/library sys, dan try/except akan dibahas pada modul-modul
pembelajaran berikutnya:
1. import sys
2. data=''
3. while(data!='exit'):
4. try:
7. except:
8. if data == 'exit':
10. else:
11. print('error: {}'.format(sys.exc_info()[0]))
Ada kalanya Anda perlu untuk membuat sebuah list baru dari dengan sebuah
operasi dari list sebelumnya. Misalnya membuat nilai kuadrat dari semua
item dalam list:
1. #Cara 1
2. angka = [1, 2, 3, 4]
3. pangkat = []
4. for n in angka:
5. pangkat.append(n**2)
6. print(pangkat)
2. angka = [1, 2, 3, 4]
4. print(pangkat)
Output:
[1, 4, 9, 16]
List comprehension adalah salah satu cara untuk menghasilkan list baru
berdasarkan list atau iterables yang telah ada sebelumnya. Sintaksis
dasarnya adalah sebagai berikut:
1. new_list = [expression for_loop_one_or_more conditions]
Contoh kedua di atas dapat diartikan sebagai: untuk setiap anggota angka
buatlah nilai kuadratnya. List comprehension dapat digunakan lebih lanjut,
misalnya:
1. #Contoh3 menemukan item yang ada di kedua list
4. duplikat = []
5. for a in list1:
6. for b in list2:
7. if a == b:
8. duplikat.append(a)
9.
Bandingkan dengan:
1. #Contoh4 Implementasi dengan list comprehension
4. print(small_list_a)
Output:
Anda tidak perlu bingung saat melihat kode di Internet yang menuliskan
seperti contoh di atas, karena garis bawah (underscore) termasuk
penamaan variabel yang valid. Secara umum "_" biasa digunakan
sebagai throwaway variable (variabel tidak penting).
3. print(x)
Kesalahan sintaksis terjadi ketika Python tidak dapat mengerti apa yang
Anda perintahkan. Sedangkan pengecualian (kesalahan saat beroperasi)
terjadi ketika Python mengerti apa yang Anda perintahkan tetapi
mendapatkan masalah saat mengikuti yang Anda perintahkan (terjadi saat
aplikasi sudah mulai beroperasi).
Kesalahan Sintaksis
Kesalahan sintaksis biasanya sering terjadi saat Anda masih baru memulai
belajar Python, misalnya contoh berikut adalah penempatan indentasi (spasi
di awal) yang tidak sesuai.
1. print('salah indentasi')
3. print('salah indentasi')
4. ^
4. ^
Kedua contoh di atas memiliki kelompok (tipe) kesalahan yang berbeda, yang
pertama adalah IndentationError dan yang kedua adalah SyntaxError.
Kemudian setelah penyebutannya, ada pesan detail kesalahan (keterangan),
misalnya indentasi yang tidak diharapkan (unexpected).
Jika Anda menggunakan mode pemanggilan skrip, nama file skrip dan nomor
baris di mana terjadi kesalahan akan dimunculkan. Sedangkan untuk mode
interaktif pada dua contoh di atas, nama file muncul sebagai “<stdin>”.
Berikut adalah contoh pada pemanggilan skrip bernama
contoh_salah_sintaksis.py di mana terjadi kesalahan pada baris 2.
1. python contoh_salah_sintaksis.py
4. ^
Pengecualian
Meski pernyataan atau ekspresi dari Python sudah Anda tulis dengan benar,
ada kemungkinan terjadi kesalahan ketika perintah tersebut dieksekusi.
Kesalahan yang terjadi saat proses sedang berlangsung disebut
pengecualian (exceptions) dan akan berakibat fatal jika tidak ditangani.
Kebanyakan pengecualian di Python tidak ditangani oleh aplikasi, sehingga
aplikasi terhenti kemudian muncul pesan kesalahan seperti contoh berikut.
1. print(angka)
Misalkan Anda lupa memberikan nilai pada variabel angka, tetapi Anda
langsung memanggil variabel tersebut. Secara sintaksis sudah sesuai, tapi
muncul pengecualian dengan kelompok (tipe) kesalahan NameError dan
pesan detail kesalahan yang menyatakan bahwa variabel angka tidak
terdefinisi.
Contoh lain terkait pengecualian yang sering juga terjadi adalah operasi dari
variabel yang jenisnya tidak sesuai, misalnya contoh berikut.
1. bukan_angka = '1'
2. bukan_angka + 2
Seperti terlihat bahwa pada saat terjadi pengecualian, informasi yang muncul
seperti saat terjadi kesalahan (errors), termasuk juga informasi nama file dan
nomor baris di mana kesalahan terjadi.
Penanganan Pengecualian
Pada aplikasi Python yang Anda buat bisa dilengkapi dengan penanganan
terhadap pengecualian (exceptions handling) dari kelompok (tipe) kesalahan
yang Anda tentukan. Proses penanganan pengecualian menggunakan
pernyataan try yang berpasangan dengan except.
Misalnya kita ingin menangani pengecualian yang terjadi jika ada pembagian
angka dengan nilai nol (0).
1. >>> z = 0
2. >>> 1 / z
3.
7.
8. >>> try:
9. ... x = 1 / z
13.
3. ... print(file.read())
6. ...
Pada operasi di atas, aplikasi akan membuka dan mengakses file bernama
contoh_tidak_ada.py, tetapi file tersebut tidak ada di direktori dimana aplikasi
Python tersebut berada, selanjutnya akan terjadi pengecualian (exceptions)
tetapi ditangani, dalam pasangan pernyataan try dan except, sehingga
aplikasi tidak terhenti tetapi tercetak di layar bahwa file tidak ditemukan.
2. >>> try:
8. ...
16. ...
22. ...
23. penangan kesalahan: invalid literal for int() with base 10: '10.0'
Pada contoh tersebut, yang paling awal terjadi pengecualian untuk tipe
kesalahan KeyError karena dalam dictionary d tidak memiliki kunci
(key) rata_rata, yang ada adalah kunci ratarata.
Menghasilkan Pengecualian
Dalam membuat aplikasi, ada kemungkinan Anda butuh untuk menghasilkan
pengecualian (raise exceptions), salah satu caranya bisa dengan
menggunakan pengecualian yang sudah ada, hanya ditambahkan informasi
detailnya saja.
4. ...
Fungsi
Fungsi didefinisikan dengan keyword def diikuti dengan nama fungsi dan
parameternya dalam kurung ().
1. def nama_fungsi( parameter )
2. "dokumentasi fungsi"
4. return [expression]
2. print(param1)
3. return
Sintaksis return tanpa ekspresi atau return None dapat juga tidak dituliskan.
Fungsi di atas akan sama seperti di bawah ini.
1. def cetak( param1 ):
2. print(param1)
Memanggil Fungsi
2. print(param1)
3. return
4.
5. #panggil
6. cetak("Panggilan Pertama")
7. cetak("Panggilan Kedua")
Output:
Panggilan Pertama
Panggilan Kedua
Return
5. return hasil
6.
Saat dipanggil:
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). Cobalah kode berikut ini:
1. def kuadrat(x):
2. return x*x
3. a = 10
4. k = kuadrat(a)
Contohnya:
1. def ubah(list_saya):
2. list_saya.append([1, 2, 3, 4])
4.
7. ubah(list_saya)
Dapat dilihat dalam kode diatas, objek mylist yang direferensi adalah sama.
Sehingga saat melakukan perubahan, maka perubahannya terjadi pada
mylist baik didalam maupun diluar fungsi ubah:
3. list_saya = [1, 2, 3, 4]
8. ubah(list_saya)
Variabel mylist dibuat kembali versi localnya dalam fungsi ubah dengan
operator assignment (sama dengan), sehingga nilai mylist akan berbeda
karena bersifat lokal dalam fungsi ubah saja. Hasilnya akan sebagai berikut:
Jadi parameter adalah definisi masukan yang diterima fungsi, dan argumen
adalah hal yang Anda masukkan saat memanggil fungsi tersebut.
2. #lakukansesuatudenganabc
Sebagai nilai yang akan dimasukkan pada saat fungsi dipanggil, ada dua
jenis argumen:
Contoh:
Keyword Argument
1. daftar(tanggal=1, bulan='Januari', tahun=2020)
Positional Argument
1. daftar(1,'Januari',2020)
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.
2. for a in args:
6.
7.
8. # Panggil printinfo
9. printinfo()
10. printinfo(1, 2, 3)
Output:
argumen posisi 1
argumen posisi 2
argumen posisi 3
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.
Sintaks:
1. lambda [arg1 [,arg2,.....argn]]:expression
Contoh penggunaannya jika kita bandingkan dengan fungsi kali yang berada
di modul sebelumnya
1. kali = lambda nilai1, nilai2: nilai1 * nilai2;
Hasilnya
Hasil : 231
Hasil : 4
Menulis Method dan Kelas pada Python
Module Python adalah berkas teks berekstensi .py yang berisikan kode
Python. Anda dapat mereferensi berkas .py apa pun sebagai modul. Modul-
modul umum yang disediakan oleh Python Standard Library dan mungkin
sudah terinstal secara default pada instalasi Python Anda. PIP juga dapat
dimanfaatkan untuk menginstal modul atau library berikut dengan
dependensi yang dibutuhkannya. Anda pun dapat membuat dan
menghasilkan modul Python Anda sendiri.
Menulis Modul
hello.py
1. # Define a function
2. def world():
3. print("Hello, World!")
main.py
1. #impor
2. import hello
3.
4. #panggil
5. hello.world()
Saat memanggil sebuah fungsi dari modul yang kita impor, jangan lupa untuk
menambahkan nama modulnya diikuti tanda titik, baru fungsi yang akan kita
panggil. Dalam hal ini karena kita mengimpor hello.py, maka cukup kita tulis
import hello, dan saat memanggilnya dengan hello.world(). Selain itu, kita
juga dapat menggunakan from ... import ..., dalam hal ini adalah from hello
import world dan memanggil fungsinya langsung yakni world().
Hello, World!
Menambahkan variabel
hello.py
1. def world():
2. print("Hello, World!")
3.
4. nama = "Dicoding"
main.py
1. #impor
2. import hello
3.
4. #panggil
5. hello.world()
6.
7. #cetak
8. print(hello.nama)
Saat Dijalankan:
Hello, World!
Dicoding
Menambahkan kelas
Contoh yang lain, mari tambahkan kelas di modul hello. Kita akan membuat
kelas Reviewer dengan atribut nama dan kelas, serta fungsi review() yang
akan mencetak atribut yang telah didefinisikan.
hello.py
1. def world():
2. print("Hello, World!")
3.
4. nama = "Dicoding"
5.
6. class Reviewer:
8. self.nama = nama
9. self.kelas = kelas
10.
self.kelas)
Tambahkan kelas pada main.py.
main.py
1. #impor
2. import hello
3.
4. #panggil
5. hello.world()
6.
7. #cetak
8. print(hello.nama)
9.
10. #review
12. diko.review()
Output:
Hello, World!
Dicoding
Reviewer Diko bertanggung jawab di kelas Python
Lihat kedua variabel "nama" yang dapat menghasilkan dua nilai berbeda,
karena nama yang pertama (hello.nama) melekat pada modul, sementara
diko. Nama adalah atribut nama pada kelas Reviewer. Anda harus cukup
berhati-hati dalam memastikan variabel seperti pada pembahasan fungsi
yang lalu.
Implementasi Kode
hello2.py
1. # Definisi
2. def world():
3. print("Hello, World!")
4.
5. # Panggil disini
6. world()
main.py
1. import hello2
Hello, World!
2. sys.path.append('/home/dicoding')
3.
4. import hello
5. …
Alternatif ini dapat dipilih saat Anda melakukan pemanggilan modul >1x.
Pada intinya pilihan ini akan menambahkan modul yang Anda buat pada
Path yang diperiksa oleh Python sebagai modul dan paket-paket bawaan.
Anda dapat memanfaatkan sys.path kembali untuk mengetahui posisi Anda
saat ini.
1. print(sys.path)
'/home/dicoding/my_env/lib/python3.5/site-packages'
Pindahkan hello.py pada direktori di atas. Maka Ia akan dikenali sebagai
sebuah modul yang dapat diimpor oleh siapa saja dalam environment
tersebut.
Catatan:
Class
Class merupakan sintaksis di Python yang menyediakan semua fitur-fitur
standar dari Pemrograman Berorientasi Objek atau dalam bahasa Inggris
disebut dengan Object Oriented Programming (OOP).
Definisi dari kelas menggunakan sintaksis class seperti hanya definisi fungsi
yang menggunakan sintaksis def, kemudian perlu dipanggil (dieksekusi)
dahulu sebelum dapat digunakan dan memiliki efek pada program.
1. class NamaKelas:
metode
3. i = 12345
4.
5. def f(self):
Sebagai hasil instance sebuah class, suatu objek memiliki atribut dan metode
yang didapatkan dari class. Sebuah metode atau dalam bahasa Inggris
disebut method, adalah sebuah fungsi khusus yang menjadi "milik" suatu
objek.
Class’ Constructor
Kembali membahas proses instantiation dari class, sering ditemui kebutuhan
mengeset nilai awal atau kondisi awal dari atribut yang dimiliki oleh class
tersebut, sehingga untuk kebutuhan ini digunakan sebuah fungsi khusus
yang biasa disebut sebagai pembangun atau dalam bahasa Inggris
disebut constructor. Di Python, fungsi khusus atau metode sebagai
constructor ini bernama __init__ atau biasa diucapkan sebagai "double
underscore init". Pada saat dilakukan instantiation dari class, metode __init__
ini secara otomatis akan dipanggil di terlebih dahulu.
3.
4. def __init__(self):
5. self.i = 12345
6.
7. def f(self):
3.
6.
7. def f(self):
Metode (Method)
Pembahasan lebih detail mengenai metode, selain yang dibahas
sebelumnya, kita akan membahas 3 jenis metode:
Pertama kita membahas metode dari objek, seperti yang sempat dijelaskan
secara singkat di atas mengenai metode, atau dalam bahasa Inggris disebut
method, secara umum metode adalah sebuah fungsi khusus yang menjadi
“milik” suatu objek, yakni hasil instantiation dari class.
Salah satu hal khusus yang dimiliki oleh metode dengan adanya argumen
bernama self, Anda tentu bertanya-tanya tentang argumen self pada metode-
metode dalam kelas tersebut sebetulnya apa?
Argumen pertama dari metode-metode dalam class, biasa diberikan nama
self sebagai suatu konvensi atau standar penamaan, meskipun Anda bisa
juga menggunakan nama lain. Bahkan dalam Python tidak ada arti khusus
tentang sintaksis self ini, namun sangat disarankan menggunakan konversi
ini agar program Python yang Anda buat akan lebih mudah dimengerti oleh
pemrogram lainnya.
Sebelum kita membahas yang kedua dan ketiga, yakni metode dari class dan
metode secara static, Anda tentu mengingat bahwa sebelumnya sudah
belajar fungsi-fungsi bawaan (built-in) dari Python, antara
lain: open, sorted, int, str, dan sejumlah lainnya. Terkait metode, ada dua
fungsi bawaan yang akan kita bahas, yakni classmethod dan staticmethod.
Catatan:
Referensi: https://docs.python.org/id/3.8/glossary.html#term-decorator .
3.
4. def f(self):
6.
7. @classmethod
8. def tambah_angka(cls, angka1, angka2):
argumen cls
2. print(k.tambah_angka(1, 2))
Untuk Anda yang pernah memrogram Java atau C++, metode statis ini mirip
seperti yang ada di bahasa pemrograman tersebut.
3.
4. def f(self):
6.
7. @staticmethod
Nampak pada kode, tidak ada argumen pertama yang implisit seperti halnya
pada dua metode sebelumnya.
2. print(a)
Metode statis (static method) juga dapat dipanggil dari objek, hasil
instantiation dari class Kalkulator, mirip seperti pemanggilan fungsi biasa
meskipun dipanggil dari objek.
1. k = Kalkulator()
2. a = k.kali_angka(2, 3)
3. print(a)
Dalam contoh ini, kelas A disebut sebagai kelas dasar, yakni kelas yang
memberikan warisan atau biasa juga disebut kelas yang diturunkan.
Catatan:
Frasa kelas dasar adalah terjemahan bahasa Inggris dari frasa base
class.
Frasa kelas turunan adalah terjemahan bahasa Inggris dari
frasa derived class.
Frasa menimpa metode adalah terjemahan bahasa Inggris dari frasa
method override.
Di Python, mekanisme pewarisan memungkinkan untuk memiliki lebih
dari satu kelas dasar (kelas orang tua, yang diwarisi).
Referensi: https://docs.python.org/id/3.8/tutorial/classes.html#multiple-
inheritance
diubah!"""
3.
5. self.nilai = nilai
6.
sampai 9
{}'.format(self.nilai))
Kemudian kita punya kebutuhan membuat sebuah kelas yang punya fitur
perkalian tapi juga punya fitur penambahan, dalam contoh ini misalnya kita
tidak boleh mengubah kalkulator yang sudah ada. Dibandingkan dengan
membuat kelas baru kemudian menuliskan kembali implementasi
penambahan angka, maka mewarisi kelas yang sudah ada akan lebih efisien.
3.
6. return self.nilai
Dengan pemanggilan class KalkulatorKali sebagai berikut.
1. kk = KalkulatorKali()
kali_angka
3. print(a)
4.
6. print(b)
Dalam proses pewarisan, kita bisa menimpa (override) definisi metode yang
dimiliki oleh kelas dasar (kelas orang tua, yang diwarisi) dengan nama
metode yang sama. Misalnya kita menimpa metode tambah_angka untuk
menghilangkan batasan yang dimiliki.
1. class KalkulatorKali(Kalkulator):
3.
6. return self.nilai
7.
Kemudian kita coba kembali, apakah batasan yang dimiliki sudah hilang?
1. kk = KalkulatorKali()
2.
KalkulatorKali
4. print(b)
3.
9. return self.nilai
3.
4. don = Pegawai() # membuat Pegawai baru menjadi objek bernama don
5.
8. don.bagian = 'IT'
9. don.gaji = 999
Unit Testing
Sampai di tahap ini, sudah banyak modul pemrograman Python yang kita
dipelajari. Kita telah mengenal operasi-operasi dasar di Python seperti
perulangan, fungsi, hingga OOP pada Python.
Pada saat membuat fungsi baru ataupun mengubah fungsi yang sudah ada,
tentunya perlu dipastikan bahwa fungsionalitas aplikasi yang sebelumnya
tidak terganggu dengan adanya perubahan baru tersebut. Bagaimana jika
fungsionalitas bukan hanya 5 atau 10, tapi lebih dari itu? Tentu menyulitkan
sekali untuk mengeceknya satu per satu setiap kita melakukan perubahan.
Di sinilah kita butuh pengujian (test) untuk fungsi-fungsi tersebut yang dapat
dilakukan secara otomatis. Kita dapat melakukan ini dengan salah
satu library bawaan Python yaitu unittest, yang penamaannya sesuai
dengan tugas yang dilakukannya. Unittest merupakan proses pengujian
perangkat lunak yang memastikan setiap unit/fungsi dari program teruji. Jika
fungsionalitas dari aplikasi yang kita bangun terdiri dari prosedur-prosedur
dan fungsi-fungsi yang kita tulis, maka kita perlu melakukan unit test untuk
setiap prosedur atau fungsi yang ada.
2.
3. class TestStringMethods(unittest.TestCase):
4.
5. def test_strip(self):
6.
self.assertEqual('www.dicoding.com'.strip('c.mow'), 'dicoding')
7.
8. def test_isalnum(self):
9. self.assertTrue('c0d1ng'.isalnum())
10. self.assertFalse('c0d!ng'.isalnum())
11.
12. def test_index(self):
13. s = 'dicoding'
14. self.assertEqual(s.index('coding'), 2)
16. with self.assertRaises(ValueError):
17. s.index('decode')
18.
19. if __name__ == '__main__':
20. unittest.main()
Anda bisa mencoba melihat keluaran lain dengan membuat gagal salah
satu test. Misalnya pada metode test_isalnum keduanya akan diubah
menggunakan assertTrue sehingga salah satu fungsi akan gagal. Kodenya
bisa Anda lihat di bawah.
1. def test_isalnum(self):
Berikut penjelasannya:
Seperti yang sudah Anda duga bahwa, akan ada pengujian yang gagal,
sehingga tertulis .F. yang menggambarkan bahwa pengujian metode
kedua gagal (FAIL).
Rekap totalnya ada 3 tests yang dilakukan dalam 0.01 detik. Kemudian
secara umum test menghasilkan 1 buah kegagalan (failure).
Cukup mudah dimengerti bukan? Kita dapat melihat sendiri bahwa pengujian
hasilnya gagal. Tapi kali ini gagalnya memang sesuai dengan harapan kita.
Sekarang kita coba pengujian dengan contoh yang lebih nyata, misalnya kita
memiliki class User di mana kita akan menguji aktif atau tidaknya user
dengan melihat apakah dia terkoneksi ke basis data (DB) atau tidak.
2.
3. def koneksi_ke_db():
4. print('[terhubung ke db]')
5. def putus_koneksi_db(db):
7.
8. class User:
9. username = ''
15.
16. class TestUser(unittest.TestCase):
18. db = koneksi_ke_db()
default
21. putus_koneksi_db(db)
22.
24. db = koneksi_ke_db()
27. self.assertTrue(dicoding.aktif)
28. putus_koneksi_db(db)
29.
30. if __name__ == '__main__':
31. unittest.main()
2. def setUp(self):
3. self.db = koneksi_ke_db()
5.
6. def tearDown(self):
7. putus_koneksi_db(self.db)
8.
9. def test_user_default_not_active(self):
default
11.
14. self.assertTrue(self.dicoding.aktif)
Dengan kemampuan pengujian ini, aplikasi yang Anda buat jadi lebih lebih
teruji atau orang biasa bilang dengan istilah lebih tahan banting (robust).
Library Populer pada Python
Kali ini kita akan membahas Modul dan Library yang sering digunakan pada
Python. Artikel ini akan terus di-update sesuai dengan perkembangan dan
jika diperlukan akan ditambah. Modul yang sering dipakai secara umum
dalam scripting sehari-hari antara lain:
String
Dokumentasi: https://docs.python.org/3/library/string.html .
String merupakan salah satu modul bawaan Python yang tidak perlu
dideklarasikan. Modul yang sudah bawaan dari Python disebut modul built-in
(https://docs.python.org/3/library/stdtypes.html ). Termasuk di dalam modul
built in antara lain adalah string, list, range, boolean operator, dan
sebagainya. Pada modul string terdapat fungsi-fungsi yang dapat
dioperasikan pada variabel bertipe string seperti di bawah.
OS
Dokumentasi: https://docs.python.org/3/library/os.html
Modul OS pada Python merupakan modul untuk fungsi-fungsi yang berkaitan
dengan sistem operasi, misalnya open(), path(), getcwd(), dan fungsi lainnya.
Modul ini memungkinkan Anda untuk memanfaatkan fungsi yang sama dan
mengeksekusi fungsi terkait OS yang mungkin berbeda di setiap sistem
operasi. Terdapat beberapa fitur yang hanya bekerja pada sistem operasi
tertentu.
2. print(os.getcwd())
File Input/Output
Dokumentasi: https://docs.python.org/3/tutorial/inputoutput.html .
Pickle
Dokumentasi: https://docs.python.org/3/library/pickle.html.
Jika Anda memiliki sebuah list yang ingin disimpan atau ditransmisikan tanpa
khawatir bentuknya akan rusak atau kacau, Anda dapat memanfaatkan
fungsi dari library pickle. Pickle merupakan fungsi Object Serialization pada
Python. Pickling adalah istilah untuk mengubah objek menjadi byte stream,
sedangkan Unpickling adalah perlakuan sebaliknya.
3. pickle_keluar = open("dict.pickle","wb")
4. pickle.dump(contoh_dictionary, pickle_keluar)
5. pickle_keluar.close()
2. contoh_dictionary = pickle.load(pickle_masuk)
JSON
Dokumentasi: https://docs.python.org/3/library/json.html .
Seperti yang telah disebutkan sebelumnya, JSON adalah format text yang
ditujukan untuk serialization. Agar data dapat dengan mudah ditransmisikan
antar berbagai sumber tanpa khawatir bentuknya kacau, menggunakan
JSON adalah salah satu pilihan yang tepat.
JSON memiliki format yang hampir mirip dengan dictionary di mana data
disimpan dengan format key & value pair. Namun tentunya JSON jauh lebih
kompleks dari dictionary. Dapat dilihat dari contoh JSON untuk data
pembelian di bawah. Dengan JSON kita dapat menyimpan data dengan lebih
terorganisir. Sebuah key seperti children di bawah dapat memiliki sebuah
dictionary baru yang berisi informasi terkait objek children tersebut tersebut.
Untuk membuat JSON sederhana ketik seperti kode di bawah.
1. import json
2.
3. # contoh JSON:
4. x = '{ "nama":"Buchori",
5. "umur":22,
6. "Kota":"New York"}'
7.
8. # parse x:
9. y = json.loads(x)
10.
11. print(y["umur"])
Scrapper
Dokumentasi urllib: https://docs.python.org/3/library/urllib.html .
Dokumentasi
beautifulsoup4: https://www.crummy.com/software/BeautifulSoup/bs4/
doc/.
2. page = urlopen(url)
3. html = page.read().decode("utf-8")
5. end_index = html.find("</title>")
6. title = html[start_index:end_index]
7. title
2. page = urlopen(url)
3. html = page.read().decode("utf-8")
4. soup = BeautifulSoup(html, "html.parser")
5. soup.title
Regex
Dokumentasi: https://docs.python.org/3/library/re.html .
Regex atau regular expression adalah sebuah cara untuk mencari teks
berdasarkan pola tertentu. Ketika kita ingin mencari sebuah kata dalam
kamus, misalnya arti dari kata parsing, kita akan mencari kata tersebut di
halaman yang yang memiliki kata dengan awalan p, atau pa. Regex bekerja
dengan konsep yang sama. Pada regex, kita mencari sebuah kata atau
kumpulan kata dengan memberikan pola yang kita inginkan. Contoh umum
regex adalah pada email di mana kita dapat menggunakan regex untuk
mengecek apakah karakter @ ada pada email atau tidak.
3. pola= '^a...s$'
4. string_tes= 'abyss'
6.
7. if hasil:
8. print("Pencarian berhasil.")
9. else:
Argument Parser
Dokumentasi Getopt: https://docs.python.org/3.8/library/getopt.html .
Dokumentasi ArgParse: https://docs.python.org/3.8/library/argparse.html.
Argument parser bermanfaat jika kita ingin membuat program atau skrip kecil
yang langsung menerima parameter pada saat pemanggilan program. Hal ini
biasa digunakan dalam pemanggilan aplikasi atau skrip di CLI/terminal *nix-
based misalnya linux dan MacOS. Contoh perintah dimaksud adalah:
1. python panggildicoding.py -o
file: panggildicoding.py
1. import argparse
2.
3. parser = argparse.ArgumentParser()
4. parser.add_argument('-o', '--output', action='store_true',
help="tampilkan output")
5. args = parser.parse_args()
6.
7. if args.output:
2.
3. parser = argparse.ArgumentParser()
4. parser.add_argument('-n', '--nama', required=True, help="Masukkan Nama
Anda")
5. args = parser.parse_args()
6.