Pengenalan Python
Pengenalan Python
Python 3.0 adalah versi perubahan mayor yang dirilis pada Desember
2008, yang didesain sebagai versi yang tidak backward-
compatible dengan versi-versi sebelumnya. Beberapa
sintaksis/statement yang sebelumnya berjalan di versi 2.x, kini tidak
lagi berjalan. Semua hal ini didasarkan pada keinginan bahasa
Python yang kembali ke “inti”, yakni readable, consistent &
explicit. Contohnya, fungsi print yang sebelumnya adalah statement di
python 2.x, menjadi function di python 3.x.
http://docs.python.org/release/3.0.1/whatsnew/3.0.html.
Versi terbaru Python pada saat pembaruan modul ini adalah 3.8 yang
dirilis pada 14 Oktober 2019. Pada saat tulisan ini dibuat, Python 3.9
sedang dikembangkan dan berstatus 3.9.0 alpha 1.
Sejarah / Overview
Mengapa Python?
Efektivitas Python cukup terbukti dengan banyaknya jumlah
pengguna Bahasa Pemrograman ini. Berbagai survei memasukkan
Python dalam top-3 sebagai bahasa dengan penggunaan terbanyak,
bersaing dengan Java dan PHP. Python dapat digunakan dalam
mengakomodasi berbagai gaya pemrograman, termasuk structured,
prosedural, berorientasi-objek, maupun fungsional. Python juga dapat
berjalan pada berbagai sistem operasi yang tersedia. Beberapa
pemanfaatan bahasa Python di antaranya:
Dan lain-lain.
Saat ini, Python juga menjadi salah satu bahasa pilihan untuk masuk
ke dunia Data Science. Tiga hal utama pada Data Science - machine
learning, data analysis, dan data visualization banyak disediakan
berbasis Python. Sejumlah pustaka paling banyak digunakan dalam
machine learning berbasis Python, misalnya: Scikit-Learn,
Tensorflow, dan PyTorch.
Persiapan
Pada Linux dan Mac, umumnya Python sudah terinstal secara
otomatis. Untuk memastikan python sudah terinstal atau memeriksa
versi python yang terinstal, silakan panggil perintah berikut di konsol
atau command prompt:
1. python --version
atau
1. python3 --version
Jika telah terinstal, maka akan tampil versi Python yang terinstal
sebagai berikut (Klik tab pada tabel untuk melihat tampilan di masing-
masing sistem operasi).
Semua contoh dan tutorial pada kelas ini akan menggunakan versi
3.7.3 atau lebih tinggi. Python versi terbaru dapat diakses
di https://www.python.org/downloads/. Apabila pada komputer anda
terinstal Python 2.x, Anda umumnya dapat menginstal versi 3.x
secara berdampingan tanpa mengubah konfigurasi apapun. Untuk
konfigurasi lanjut yang memungkinkan Anda menggunakan lebih dari
satu versi python secara bergantian, silakan merujuk
ke https://docs.python.org/id/3.8/library/venv.html.
Windows
Ubuntu (Update)
Mac (Update)
| Catatan: sebaiknya klik disable path length limit untuk mengatasi problem path yang melebihi 255 k
terlalu panjang).
4.
Link Penting
Apabila Anda mengalami kesulitan, silakan merujuk ke
halaman https://docs.python.org/id/3.8/installing/index.html atau
gunakan mesin pencarian untuk mencari solusi apabila Anda
mengalami kendala dalam instalasi. Anda juga dapat memanfaatkan
forum diskusi apabila diperlukan.
IDE
Jupyter
Selain itu Anda juga dapat memanfaatkan notebook lain misalnya
Jupyter atau sejenisnya. Instalasi Jupyter Notebook dapat dilakukan
dengan beberapa cara. Silakan ikuti panduan
di https://jupyter.readthedocs.io/en/latest/install.html untuk lebih
detailnya. Instalasi notebook ini tidak wajib. Anda juga dapat
menggunakan notebook yang bersifat gratis misalnya IBM Watson
Studio dan Google Colab.
Google Colab
Untuk mulai menggunakan Google Colab, Anda dapat langsung
mengunjungi tautan
berikut: https://colab.research.google.com/notebooks/
16. Pekerjaan yang telah Anda simpan dapat Anda lihat pada
menu Assets di bagian Notebooks.
Interactive
Berbeda dengan bahasa pemrograman lainnya, bahasa Python yang
berbasis interpreter memungkinkan kita untuk menjalankan perintah
secara interaktif. Mode ini dapat diakses di bagian bawah PyCharm
atau dengan memanggil perintah python di command
prompt/terminal.
Apa saja yang dapat Anda lakukan pada python interactive ini?
Seluruh kode python dapat Anda jalankan secara berurutan pada sesi
interaktif ini. Variabel juga akan tetap disimpan. Anda juga dapat
memanggil (import) library. Sehingga salah satu penggunaan utama
pada sesi interaktif ini adalah untuk rapid-prototyping.
InteractiveExample: Calculator
Script
Mode yang lain dan sering dipergunakan pada python adalah script
(scripting). Pada mode ini kita menggunakan sebuah berkas teks
(umumnya berekstensi .py) dan kemudian akan dieksekusi oleh
compiler/interpreter. Contoh yang sama untuk ketiga hal yang kita
coba pada mode interactive adalah sebagai berikut:
RunnableExample: Calculator
RunnableExample: Print
RunnableExample: import library dan mendapatkan Current
working directory
Notebook
Alternatif
Alternatif yang lain, Anda dapat menggunakan tools online untuk
menjalankan kode-kode Python Anda. beberapa yang umum
digunakan di industri antara lain IBM Watson Studio, Google Colab,
glot.io, REPL.it, dan ideone.com.
Watson Studio
Glot.io
Repl.it
Anda dapat menggunakan yang mana saja dalam proses
pembelajaran ini. Di industri, teknik yang dipilih adalah yang paling
efisien (misalnya untuk research, kebanyakan menggunakan
notebook), sementara untuk backend atau infrastructure
management, dipilih script.
Indentasi
Baris Lanjutan
1. # Opsi 1
2. # Rata kiri dengan kurung atau pemisah dengan argumen utama
3. foo = long_function_name(var_one, var_two,
4. var_three, var_four)
5.
6. # Opsi 2
7. # Tambahkan indentasi ekstra - (level indentasi baru) untuk
memisahkan parameter/argument dari bagian lainnya
8. def long_function_name(
9. var_one, var_two, var_three,
10. var_four):
11. print(var_one)
12.
13. # Opsi 3
14. # Hanging indents dengan penambahan level indentasi saja
15. foo = long_function_name(
16. var_one, var_two,
17. var_three, var_four)
Tidak Disarankan:
1. # Contoh kesalahan 1
2. # Tidak rata kiri dengan bagian yang relevan
3. foo = long_function_name(var_one, var_two,
4. var_three, var_four)
5.
6. # Contoh kesalahan 2
7. # Sulit dibedakan antara baris lanjutan atau fungsi baru
8. def long_function_name(
9. var_one, var_two, var_three,
10. var_four):
11. print(var_one)
Kondisional (If)
Bagian ini hanya memberikan gambaran mengenai standar penulisan,
pembahasan mengenai kondisional ada di modul Percabangan.
Baris kosong
Import
Kecuali, jika anda memerlukan lebih dari satu sub-library dari library
yang sama.
1. from subprocess import Popen, PIPE
1. Standard Library
2. Library Pihak Ketiga
3. Local/Library spesifik
Tanda Petik
Petik tunggal (‘) dan petik ganda (“) dianggap sama oleh Python, dan
tidak memiliki preferensi khusus untuk penggunaannya. Hal ini
dikarenakan ada kemungkinan string yang memuat salah satunya.
Anda disarankan untuk menggunakan salah satunya secara
konsisten.
Rekomendasi lainnya
1. Assignment (=),
2. Augmented assignment (+=, -=etc.),
3. Comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not),
4. Booleans (and, or, not).
Komentar
Dalam sebuah kode Python, Anda diajak untuk memastikan kode
Anda terbaca oleh programmer lain. Salah satu caranya adalah
dengan menggunakan fitur komentar untuk memberitahu fungsi atau
informasi lain terkait kode Anda. Pastikan komentar Anda ter-update
dan tidak mengalami kontradiksi dengan kode yang ada.
Blok komentar
Komentar Inline
Komentar Inline pada Python umumnya diletakkan pada baris yang
sama dengan kode. Umumnya dipisahkan dan dirapikan dengan jarak
dua spasi dari kode yang dimaksud, diawali # dan sebuah spasi.
Komentar inline dapat juga digunakan di atas baris yang ingin
diberikan komentar, agar tidak mengurangi jumlah karakter yang
dapat dituliskan dalam sebuah baris. Untuk semua jenis komentar,
jangan menuliskan komentar untuk hal yang sudah langsung dapat
dibaca dari kodenya, seperti contoh berikut:
Tidak disarankan:
1. x = x + 1 # Tambahkan x
Disarankan (kontekstual):
1. x = x + 1 # Mengakomodasi layar ukuran Z
Dokumentasi
Tipe Data
Dasar dari mempelajari Bahasa Pemrograman yang baru adalah
pemahaman terhadap tipe data. Di sini Anda akan diajarkan tentang
tipe data bawaan yang ada di Python 3 beserta contoh
penggunaannya.
Numbers
Output seharusnya:
Output:
1. 33644764876431783266621612005107543310302148460680063906564769974
68008144216666236815559551363373402558206533268083615937373479048
38652682630408924630564318873545443695598274916066020998841839338
64652731300088830269235673613135117579297437854413752130520504347
70160226475831890652789085515436615958298727968298751063120057542
87834532155151038708182989697916131278562650331954871402142875326
98187962046936097879900350962302291026368131493195275630227837628
44154036058440257211433496118002309120828704608892396232883546150
57765832712525460935911282039252853934346209042452489294039017062
33888991085841065183173360437470737908552631764325733993712871937
58774689747992630583706574283016163740896917842637862421283525811
28205163702980893320999057079200643674262023897831114700540749984
59250360633560933883831923386783056136435351892133279732908133732
64265263398976392272340788292817795358057099369104917547080893184
10561463223382174656373212482263830921032977016480547262438423748
62411453093812206564914032751086643394517512161526545361333111314
04243685480510676584349352383695965342807176877532834823434555736
67197313927462736291082106792807847180353291311767789246590899386
35459327894523777674406192240337638674004021330343297496902028328
14593341882681768389307200363479562311710310129195316979460763273
75892535307725523759437884345040677155557790564504430166401194625
80972216729758615026968443146952034614932291105970676243268515992
83470989128470674086200858713501626031207190317208609408129832158
10772820763531866246112782455372085323653057759564300725177443150
51539600905168603220349163222640885248852433158051534849622434848
29938090507048348244932745373262456775587908918719080366205800959
47431500524025327097469953187707243768259074199396322659841474981
93609285223945039707165443156421328157688908058783183404917434556
27052022356484649519611246026831397097506938264870661326450766507
46115126775227486215986425307112984411826226610571635150692600298
61704945425047491378115154139941550671256271197133252763631939606
90289565028826860836224108205056243070179497617112123306607331005
9947366875
0.12345678901234568
Output:
1234567890123456789
Output:
(1+5j)
Strings
Bool/Boolean
Tipe data bool atau Boolean merupakan turunan dari bilangan bulat
(integer atau int) yang hanya punya dua nilai konstanta: True dan
False.
Nilai Boolean
Nilai konstanta False dan True merepresentasikan nilai kebenaran
(truth values), meskipun ada nilai-nilai lain yang juga dianggap benar
atau salah. Di dalam konteks angka, misalnya digunakan sebagai
argumen dari operator matematika aritmatika, kedua nilai ini berlaku
seperti halnya bilangan bulat 0 dan 1, sesuai False dan True.
Ada fungsi bawaan bool() yang dapat mengubah nilai menjadi nilai
Boolean, apabila nilai tersebut dapat direpresentasikan sebagai nilai
kebenaran (truth values).
Nilai kebenaran adalah sebuah nilai yang dapat diuji sebagai benar
atau salah, untuk digunakan di sintaksis kondisi if atau while atau
sebagai operan dari operasi Boolean.
Operasi Boolean
Operasi dan fungsi bawaan yang memiliki hasil Boolean akan selalu
mengembalikan 0 atau False untuk yang bernilai salah,
serta 1 atau True untuk yang bernilai benar, kecuali dinyatakan
berbeda dalam dokumentasi.
30
40
[20, 25]
[5, 10, 15, 20, 25]
[30, 35, 40]
[10, 20, 30]
Elemen pada list dapat diubah atau ditambahkan. Misalnya untuk
melakukan perubahan kemudian penambahan:
1. x = [1,2,3]
2. x[2]=4
3. print (x)
Output:
[1, 2, 4]
1. x = [1,2,3]
2. x[2]=4
3. x.append(5)
4. print(x)
Output:
[1, 2, 4, 5]
Untuk menghapus item pada list, gunakan fungsi del. Ingat bahwa
Indeks Python dimulai dari 0:
1. binatang = ['kucing', 'rusa', 'badak', 'gajah']
2. del binatang[2]
3. print(binatang)
Output:
Output:
['kucing', 'rusa']
Slicing pada String
Karena string mirip dengan list, maka slicing operator [ ] juga dapat
digunakan pada string untuk mengambil isinya atau bahkan substring.
Sebuah string utuh bersifat mutable (bisa diubah), namun elemennya
bersifat immutable (tidak bisa diubah).
1. s = "Hello World!"
2. print(s[4]) #ambil karakter kelima dari string s
3. print(s[6:11]) #ambil karakter ketujuh hingga sebelas
dari string s
4. s[5]="d" #ubah karakter keenam dari string s
menjadi "d", seharusnya gagal karena immutable
5. s = "Halo Dunia!" #ubah isi string s menjadi "Halo Dunia!",
seharusnya berhasil karena mutable
6. print (s)
Output:
'o'
'World'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
'Halo Dunia!'
Tuple
Tuple adalah jenis dari list yang tidak dapat diubah elemennya.
Umumnya tuple digunakan untuk data yang bersifat sekali tulis, dan
dapat dieksekusi lebih cepat. Tuple didefinisikan dengan kurung dan
elemen yang dipisahkan dengan koma.
1. t = (5,'program', 1+3j)
Seperti list, kita dapat melakukan slicing, namun pada tuple kita tidak
dapat melakukan perubahan:
1. t = (5,'program', 1+3j)
2. print(t[1])
3. print(t[0:3])
4. print(t[0]=10)
Output:
'program'
(5, 'program', (1+3j))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Set
Set adalah kumpulan item bersifat unik dan tanpa urutan (unordered
collection). Didefinisikan dengan kurawal dan elemennya dipisahkan
dengan koma. Pada Set kita dapat melakukan union dan intersection,
sekaligus otomatis melakukan penghapusan data duplikat.
1. a = {1,2,2,3,3,3}
2. print(a)
Output:
{1, 2, 3}
Karena set bersifat unordered, maka kita tidak bisa mengambil
sebagian data / elemen datanya menggunakan proses slicing.
1. a = {1,2,3}
2. print(a[1])
Output:
Dictionary
Output:
<class 'dict'>
1. d = {1:'value','key':2}
2. print(type(d))
3. print("d[1] = ", d[1]);
4. print("d['key'] = ", d['key']);
Output:
<class 'dict'>
d[1] = value
d['key'] = 2
Dictionary bukan termasuk dalam implementasi urutan (sequences),
sehingga tidak bisa dipanggil dengan urutan indeks. Misalnya dalam
contoh berikut dicoba dengan indeks 2, tetapi menghasilkan error
(KeyError) karena tidak ada kunci (key) 2:
1. d = {1:'value','key':2}
2. print(type(d))
3. print("d[1] = ", d[1]);
4. print("d['key'] = ", d['key']);
5.
6. # Generates error
7. print("d[2] = ", d[2]);
Output:
<class 'dict'>
d[1] = value
d['key'] = 2
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-7-4b566e677ca2> in <module>()
1 d = {1:'value','key':2}
----> 2 print("d[2] = ", d[2]);
KeyError: 2
Output:
5.0
Konversi float ke int akan bersifat floor/truncating atau menghilangkan
nilai di belakang koma.
1. print(int(10.6))
Output:
10
1. print(int(-10.6))
Output:
-10
Konversi dari-dan-ke string akan melalui pengujian dan dipastikan
validitasnya.
1. print(float('2.5'))
Output:
2.5
1. print(str(25))
Output:
'25'
1. print(int('1p'))
Output:
Output:
{1, 2, 3}
1. print(tuple({5,6,7}))
Output:
(5, 6, 7)
1. print(list('hello'))
Output:
List dari beberapa List yang isinya pasangan nilai menjadi Dictionary.
Serta konversi List dari beberapa Tuple yang isinya pasangan nilai
menjadi Dictionary.
1. print(dict([[1,2],[3,4]]))
Output:
{1: 2, 3: 4}
1. print(dict([(3,26),(4,44)]))
Output:
Input/Output
Di bagian ini Anda akan mempelajari tentang mekanisme
Input/Output, misalnya meminta masukan dari pengguna, menyimpan
nilai pada variabel dan mencetak nilai ke layar.
Setelah sebelumnya mempelajari tipe data, selanjutnya Anda akan
belajar tentang variabel. Variabel adalah sebuah tempat (di memori
komputer) untuk menyimpan nilai dengan tipe data tertentu.
Misalnya: x = 1.
Output
Print
Output:
Hello, World!
Output:
Output:
Halo, Dicoding!
Contoh menambahkan string dan integer:
1. nama = "Dicoding"
2. umur = 5
3. print("Umur %s adalah %d tahun." % (nama, umur))
Output:
Output:
Output:
(10, 11)
a: a and b: B
Referensi yang dapat dipelajari:
https://docs.python.org/id/3.8/library/string.html#format-specification-
mini-language
Input
input()
Output:
Masukkan angka : 90
1. print(nilai)
Output:
'90'
Secara default, input dari user adalah string (walaupun pada contoh di
atas, 90 sebenarnya dimaksudkan sebagai integer) yang ditandai
dengan petik. Untuk itu diperlukan fungsi konversi yang akan dibahas
pada modul-modul selanjutnya, misalnya int() dan float().
1. print(int(nilai))
Output:
90
1. print(float(nilai))
Output:
90.0
Jika input merupakan string berisi ekspresi matematika, maka
konversi dengan int() atau float() akan menghasilkan error. Anda
dapat menggunakan fungsi eval() yang sekaligus juga berfungsi
menyelesaikan ekspresi matematika. Anda akan mempelajari lebih
jauh mengenai fungsi pada modul Fungsi.
1. print(int('90+10'))
Output:
1. print(eval('90+10'))
Output:
100
Command-line arguments
Python memungkinkan Anda untuk membuat sebuah "skrip" berupa
deretan kode program kemudian disimpan dalam sebuah berkas
dengan nama akhiran .py (misal: skrip.py).
Hal ini difasilitasi oleh module sys yang telah dibawa secara default
pada Python. Untuk menggunakannya, jangan lupa lakukan import
terlebih dahulu:
1. import sys
Output:
Contoh:
1. # Ketika kita memberikan nilai 6 pada variabel x
2. x = 6
3. print(type(x))
4. # Kemudian Berikan string “hello” pada variabel x di baris
selanjutnya
5. x = 'hello'
6. print(type(x))
Output:
<class 'int'>
<class 'str'>
Output:
10
Padahal jika kita jalankan 9 + "satu":
1. 9 + "satu"
Output:
<class 'str'>
1. contoh = 19.7
2. print(type(contoh))
Output:
<class 'float'>
Seperti dijelaskan sebelumnya, fungsi type() dapat digunakan untuk
mengidentifikasi tipe variabel pada saat ia diperiksa. Contoh di atas
menunjukkan bahwa tipe dari variabel “contoh” dapat berubah dan
Python dapat menerima perubahan ini pada saat program dijalankan.
Duck Typing
Python juga sering diafiliasikan dengan metode duck typing, yang
merefleksikan pada frase:
“if it walks like a duck and it quacks like a duck, then it must be a
duck”
Duck typing adalah sebuah konsep, tipe atau kelas dari sebuah objek
tidak lebih penting daripada metode yang menjadi perilakunya. Duck
typing ini tidak terkait langsung dengan dynamic typing atau static
typing, ini hanya memberikan keleluasaan pada developer untuk tidak
perlu mencemaskan tentang tipe atau kelas dari sebuah objek, yang
lebih penting adalah kemampuan melakukan operasinya. Sehingga
untuk memeriksa dan mengetahui tipe sebuah objek, Anda cukup
memastikan metode/fungsi/behavior dari objek tersebut. Misalnya
fungsi len() untuk mengetahui panjang string, yang tidak berlaku pada
variabel numerik (misalnya integer).
1. x=546
2. print(len(x))
Output:
Dalam kategori ini terdapat beberapa metode yang dapat kita gunakan untuk menjadikan
sebuah string menjadi huruf besar atau kecil yaitu menggunakan upper() atau lower().
Penasaran bagaimana penerapan upper() dan lower()? Simak uraian di bawah ini ya.
upper()
Pembahasan pertama kita mulai dari upper(). Metode upper() dapat digunakan untuk
mengonversi karakter atau string dari huruf kecil ke huruf besar. Namun, jika huruf asalnya
adalah huruf besar, maka huruf tersebut tidak berubah. Perhatikan contoh kode di bawah ini:
1. kata = 'dicoding'
2. kata = kata.upper()
3. print(kata)
Output:
DICODING
lower()
Selanjutnya kita akan membahas lower(). Metode ini kebalikan dari upper() yang dapat
mengonversi karakter atau string dari huruf besar ke huruf kecil. Namun jika huruf asalnya
adalah huruf kecil, maka huruf tersebut tidak berubah.
1. kata = ‘DICODING’
2. kata = kata.lower()
3. print(kata)
Output:
dicoding
Catatan: Jika terdapat karakter bukan huruf (seperti simbol atau angka) yang tidak memiliki
opsi kapital, maka karakter tersebut tidak diubah.
rstrip()
Metode pertama yang kita bahas dari kategori awalan dan akhiran adalah rstrip(). Metode ini
akan menghapus whitespace pada sebelah kanan string atau akhir string. Berikut contoh
penerapan kode pada rstrip().
1. print('Dicoding '.rstrip())
Output:
Dicoding
lstrip()
Selanjutnya kita bahas tentang lstrip() yang bertugas untuk menghapus whitespace pada
sebelah kiri atau awal string. Berikut contoh penerapan kodenya:
1. print(' Dicoding'.lstrip())
Output:
Dicoding
strip()
Metode strip() akan menghapus whitespace pada bagian awal atau akhir string.
Output:
Dicoding
Anda juga bisa menentukan mana karakter atau bagian yang ingin dihilangkan, misalnya:
1. kata = 'CodeCodeDicodingCodeCode'
2. print(kata.strip('Code'))
Output:
Dicoding
Ketika kita masukkan ‘Code’ sebagai parameter, maka setiap kata ‘Code’ akan terhapus di
awal maupun di akhir.
startswith()
Metode startswith() akan mengembalikan nilai True jika string diawali dengan kata awalan
tertentu yang kita inginkan, jika tidak maka akan mengembalikan nilai False.
1. print('Dicoding Indonesia'.startswith('Dicoding'))
Output:
True
endswith()
Metode endswith() ini kebalikannya dari metode startswith(), metode ini akan
mengembalikan nilai True jika string diakhiri dengan kata akhiran tertentu yang kita
inginkan, jika tidak maka akan mengembalikan nilai False.
1. print('Dicoding Indonesia'.endswith('Indonesia'))
Output:
True
Dengan metode ini, Anda dapat melakukan perbandingan string berupa awal atau akhirannya
saja, sehingga tidak perlu memisahkan string-nya dan menggunakan operator equal to (==).
Memisah dan Menggabung String
Kategori selanjutnya adalah memisah dan menggabung string. Dalam kategori ini terdapat
beberapa metode yaitu join() untuk menggabungkan string dan split() untuk memisahkan
string. Berikut uraian lengkap dari kedua metode tersebut.
join()
Metode join() adalah metode yang dipakai untuk menggabungkan sejumlah string.
Output:
Dicoding Indonesia !
Contoh lain:
Output:
'Dicoding123Indonesia123!'
Mari kita bahas. String dengan operasi join() akan disisipkan di antara string yang berada di
parameter. Seperti whitespace pada 'Dicoding Indonesia !' atau seperti angka 123
pada 'Dicoding123Indonesia123!'
split()
Sebaliknya, metode split() adalah metode yang memisahkan substring berdasarkan delimiter
tertentu (defaultnya adalah whitespace, tab, atau newline).
Output:
1. print('Dicoding123Indonesia123!'.split('123'))
Output:
1. print('''Halo,
2. aku ikan,
3. aku suka sekali menyelam
4. aku tinggal di perairan.
5. Badanku licin dan renangku cepat.
6. Senang berkenalan denganmu.'''.split('\n'))
Output:
['Halo,', 'aku ikan,', 'aku suka sekali menyelam', 'aku tinggal di perairan.', 'Badanku licin dan renangku cepat.'
Kali ini kita masuk dalam kategori mengganti elemen string yang di dalamnya terdapat
metode replace(). Seperti apakah contoh kode dari metode replace()? Yuk, simak
penjelasannya di bawah ini.
replace()
Metode replace() dapat mengembalikan string baru dalam kondisi substring telah tergantikan
dengan parameter yang dimasukkan. Berikut contoh kodenya.
Output:
Opsional: Parameter ketiga pada replace dapat diisi jumlah substring yang ingin diganti
seperti di bawah ini.
Output:
Ayo belajar Pemrograman di Dicoding karena Coding adalah bahasa masa depan
Perhatikan bahwa "Coding" kedua tidak diubah.
Pengecekan String
Selanjutnya kita akan membahas kategori pengecekan string. Dalam kategori pengecekan
string kita akan mengecek boolean dari sebuah string. Metode-metodenya antara
lain, isupper(), islower(), isalpha(), isalnum(), isdecimal(), dan sebagainya. Berikut uraian
lengkapnya.
isupper()
Metode isupper() akan mengembalikan nilai True jika semua huruf dalam string adalah huruf
besar, dan akan mengembalikan nilai False jika terdapat satu saja huruf kecil di dalam string
tersebut.
1. kata = ‘DICODING’
2. kata.isupper()
Output:
True
1. kata = ‘Dicoding’
2. kata.isupper()
Output:
False
islower()
Metode islower() adalah kebalikan dari metode isupper(), metode ini akan mengembalikan
nilai True jika semua huruf dalam string adalah huruf kecil, dan akan mengembalikan nilai
False jika terdapat satu saja huruf besar di dalam string tersebut.
1. kata = ‘dicoding’
2. kata.islower()
Output:
True
Contoh yang akan mengembalikan nilai False:
1. kata = ‘Dicoding’
2. kata.islower()
Output:
False
Bahkan Anda bisa melakukan operasi pada hasil operasinya (chain of method). Seperti
contoh berikut:
Contoh:
1. print('Dicoding'.upper().lower())
2. print('Dicoding'.lower().upper())
3. print('DICODING'.upper().lower().islower())
4. print('DICODING'.upper().lower().isupper())
Output:
‘dicoding’
‘DICODING’
True
False
isalpha()
Metode ini akan mengembalikan nilai True jika semua karakter dalam string adalah huruf
alfabet, jika tidak maka akan mengembalikan nilai False.
1. ‘dicoding’.isalpha()
Output :
True
isalnum()
Metode ini akan mengembalikan nilai True jika karakter dalam string adalah alfanumerik
yaitu hanya huruf atau hanya angka atau berisi keduanya, jika tidak maka akan
mengembalikan nilai False.
1. ‘dicoding123’.isalnum()
Output :
True
isdecimal()
Metode ini akan mengembalikan nilai True jika karakter dalam string berisi hanya
angka/numerik, jika tidak maka akan mengembalikan nilai False.
1. ‘12345’.isdecimal()
Output :
True
isspace()
Metode ini akan mengembalikan nilai True jika string berisi hanya karakter whitespace,
seperti spasi, tab, newline, atau karakter whitespaces lainnya, jika tidak maka akan
mengembalikan nilai False.
1. ‘ ’.isspace()
Output :
True
istitle()
Metode ini akan mengembalikan True jika string berisi huruf kapital di setiap kata dan
dilanjutkan dengan huruf kecil seterusnya, jika tidak maka akan mengembalikan nilai False.
1. ‘Dicoding Indonesia’.istitle()
Output :
True
Catatan: Semua method di atas mengembalikan nilai boolean dan tidak boleh kosong.
Jika Anda menginginkan suatu metode validasi input user, maka metode-metode di atas akan
sangat membantu. Anda bisa mencobanya dengan contoh berikut.
Buatlah file baru pada notepad atau IDE, dan pastikan Anda menggunakan Python 3 untuk
mencobanya (akan ada error saat menggunakan Python 2.7).
1. while True:
2. print('Masukkan nama Anda:')
3. name = input()
4. if name.isalpha():
5. print("Halo", name)
6. break
7. print('Masukkan nama Anda dengan benar.')
Mari kita bahas. Pada kode di atas, program akan meminta pengguna untuk memasukkan
namanya, yang mana diharuskan berisi huruf alfabet semua. Jika valid, maka program akan
mencetak ‘Halo ‘ disertai nama pengguna dan kemudian program berhenti. Tapi jika tidak,
program meminta pengguna kembali memasukkan namanya dengan benar. Ketika dijalankan
akan seperti berikut:
Output:
dicoding123
dicoding
Halo dicoding
Dengan cara ini, Anda dapat melakukan validasi input user. Anda bisa bereksplorasi lebih
lanjut dengan menambahkan metode isdecimal(), isalnum(), istitle(), dan lain lain.
Kategori terakhir yang akan kita bahas pada modul kali ini adalah formatting pada string.
Dalam kategori ini terdapat beberapa metode yaitu zfill(), rjust(), ljust(), center(), dll. Semua
metode yang akan dijelaskan secara detail di bawah ini, simak baik-baik ya.
zfill()
Selain metode-metode yang telah kita pelajari di atas, ada juga metode yang dapat
menambahkan nilai numerik berupa 0 di sebelah kiri sebuah angka atau string menggunakan
metode zfill(). Penggunaan metode zfill() ini bisa diterapkan untuk nomor nota atau nomor
antrian. Anda akan menemui kebutuhan untuk menambahkan awalan 0 misalnya seperti,
0001 untuk angka awalan 1, 0101 untuk angka awalan 101, dan sebagainya.
Nilai kembalian yang dihasilkan oleh zfill jumlah karakternya kurang dari atau sama dengan
value yang kita masukkan pada metode zfill. Misalnya jika kita memberi value 10, maka nanti
akan ditulis zfill(10) yang berarti nilai numerik berupa 0 dan angka atau string yang ada,
jumlah karakternya harus kurang dari atau sama dengan value zfill tersebut.
Bingung bagaimana maksud pernyataan di atas? Mari kita langsung praktikkan seperti di
bawah ini:
Ketika kode di atas dijalankan, outputnya akan terlihat seperti di bawah ini:
00005
00300
-0.45
-000.45
Masing-masing contoh di atas menghasilkan output yang berbeda-beda. Kita akan
membahasnya satu per satu.
Pada contoh pertama menghasilkan output 00005. Jumlah nol yang berada di sebelah kiri
angka lima adalah 4. Mengapa hanya 4 saja? Hal tersebut dikarenakan kita telah
mendefinisikan nilai zfill(5), sehingga ‘nol’ akan ditambahkan selama jumlah karakternya
kurang dari atau sama dengan 5.
Kita beralih ke contoh kedua yaitu angka 300 yang masih menggunakan zfill(5). Kemudian
menghasilkan output 00300. Angka 300 sendiri sudah terdapat 3 karakter, sehingga nilai ‘nol’
yang perlu ditambahkan berjumlah 2.
Selanjutnya pada contoh ketiga yang memiliki angka -0.45 dengan zfill(5) menghasilkan
output yang sama yaitu -0.45. Mengapa bisa demikian? Hal tersebut dikarenakan jumlah
karakter yang ada sudah berjumlah 5 yang di mana karakter koma (“,”) dan negatif (“-”) juga
dihitung. Sehingga tidak ada nilai 0 yang ditambahkan pada sebelah kiri dari data angka.
Namun, bagaimana jika pada contoh ketiga nilai zfill kita ubah menjadi 7 sehingga tertulis
zfill(7). Maka semuanya akan terjawab di contoh keempat yang menghasilkan -000.45 yang
menambahkan dua nilai ‘nol’ pada sebelah kiri data angka. Zfill otomatis mendeteksi tanda
negatif (“-”) pada sebuah nilai sehingga otomatis nilai ‘nol’ ditempatkan setelah tanda
negatif.
1. # Contoh 1
2. kata = 'aku'
3. print (kata.zfill(5));
4. # Contoh 2
5. kata = 'kamu'
6. print (kata.zfill(5));
7. # Contoh 3
8. kata = 'dirinya'
9. print (kata.zfill(5));
Ketika kode di atas dijalankan, outputnya akan terlihat seperti di bawah ini:
00aku
0kamu
dirinya
Masing-masing contoh di atas menghasilkan output yang berbeda-beda. Kita akan
membahasnya satu per satu.
Pada contoh pertama menghasilkan output 00aku. Hal tersebut dikarenakan kita
menggunakan nilai zfill(5) yang di mana karakternya hanya ada 3 yaitu a, k, dan u. Sehingga
nilai ‘nol’ yang berjumlah 2 akan ditambahkan sebelum kata “aku”.
Sama halnya seperti sebelumnya, pada contoh kedua ini kurang lebih menghasilkan output
yang sama. Namun, bedanya adalah jumlah karakter yang ada pada contoh kedua ini
berjumlah 4 yaitu k,a,m, dan u. Sehingga dengan nilai zfill(5) menghasilkan output 0kamu.
Kemudian pada contoh ketiga menghasilkan output string yang sama dengan aslinya yaitu
string “dirinya” menghasilkan output “dirinya” juga. Mengapa bisa demikian? Hal tersebut
karena jumlah karakter pada kata “dirinya” lebih dari nilai zfill(5). Sehingga nilai string yang
dikembalikan utuh seperti aslinya (tanpa dikurangi atau ditambahkan 0).
rjust()
Berikut penerapan rjust() dan contoh kodenya. Pembahasan lengkap akan dijelaskan di
bawah setelah uraian kodenya ya.
1. 'Dicoding'.rjust(20)
Output:
' Dicoding'
Contoh metode ljust():
1. 'Dicoding'.ljust(20)
Output:
'Dicoding '
Mari kita bahas. 'Dicoding'.rjust(20) dapat diartikan sebagai kita ingin menuliskan ‘Dicoding’
dengan mode rata kanan yang total panjang stringnya adalah 20. Karena panjang ‘Dicoding’
adalah 8 karakter, maka 12 spasi akan ditambahkan di sebelah kiri.
Begitu pula pada 'Dicoding'.rjust(20). Kita ingin menuliskan ‘Dicoding’ dengan mode rata
kiri yang total panjang stringnya adalah 20. Karena panjang ‘Dicoding’ adalah 8 karakter,
maka 12 spasi akan ditambahkan di sebelah kanan.
Selain spasi, Anda juga bisa menambahkan karakter lain dengan mengisikan parameter kedua
pada fungsi rjust() atau ljust() seperti berikut:
1. 'Dicoding'.ljust(20, '!')
Output:
'Dicoding!!!!!!!!!!!!'
center()
Metode center() seperti namanya akan membuat teks menjadi rata tengah.
1. 'Dicoding'.center(20)
Output:
1. 'Dicoding'.center(20, '-')
Output:
'------Dicoding------'
Jika Anda memprogram aplikasi berbasis konsol (CLI), maka fungsi-fungsi di atas akan
sangat berguna saat membuat tabulasi/tabel.
String Literals
Umumnya, string ditulis dengan mudah di Python, diapit oleh tanda petik tunggal. Tetapi,
dalam kondisi tertentu, dibutuhkan petik tunggal di tengah string (misalnya struktur
kepemilikan dalam Bahasa Inggris - Dicoding’s Cat atau penyebutan Jum’at pada hari dalam
bahasa Indonesia).
1. st1 = ‘Jum’at’
Maka Python akan salah mengira bahwa string berakhir setelah huruf m dan selebihnya
merupakan kode yang invalid. Namun Python memperbolehkan Anda menggunakan petik
dua seperti Anda menggunakan petik tunggal. Dalam kasus sebelumnya, Anda cukup
mengetikkan:
1. st1 = "Jum’at"
Dan dalam contoh tersebut, Python mengenali bahwa petik tunggal adalah bagian tidak
terpisahkan dari string tersebut. Bagaimana jika kita memerlukan kedua jenis petik dalam
string tunggal? Python menyediakan escape character.
Escape Character memungkinkan Anda untuk menggunakan karakter yang sebelumnya tidak
bisa dimasukkan dalam string. Umumnya diawali dengan backslash (\) dan diikuti karakter
tertentu yang diinginkan. Contohnya, untuk petik tunggal Anda dapat menambahkan
seperti: \'.
Cara ini merupakan cara paling aman untuk melakukan penambahan atau penyuntingan
dalam variabel. Contohnya sebagai berikut:
1. st1 = 'Jum\'at'
Output:
Halo!
multi_line = """Halo!
Kapan terakhir kali kita bertemu?
Kita bertemu hari Jum’at yang lalu."""
print(multi_line)
Output:
Halo!
Raw Strings
Python juga menyediakan cara untuk mencetak string sesuai dengan apa pun input atau teks
yang diberikan. Metode ini dinamakan Raw Strings. Umumnya digunakan untuk regex atau
beberapa implementasi lain yang sangat bergantung pada keberadaan backslash. Untuk
mengimplementasikan raw strings, sisipkan huruf r sebelum pembuka string:
1. print(r'Dicoding\tIndonesia')
Output:
Dicoding\tIndonesia
Seharusnya, perintah \t akan membuat tab dan menghasilkan Dicoding Indonesia, tapi
karena kita menggunakan raw strings, maka kalimat tersebut secara mentah tercetak apa
adanya.
len()
1. Output:
[1, 3, 3, 5, 5, 5, 7, 7, 9]
{1, 3, 5, 7, 9}
Belajar Python
14
Output:
96
Count
Untuk mengetahui berapa kali suatu objek muncul dalam list, Anda
dapat menggunakan fungsi count().
1. genap = [2, 4, 4, 6, 6, 6, 8, 10, 10]
2. print(genap.count(6))
3. string = "Belajar Python di Dicoding sangat menyenangkan"
4. substring = "a"
5. print(string.count(substring))
Output:
Output:
Contoh replikasi:
1. learn = ['P', 'Y', 'T', 'H', 'O', 'N']
2. replikasi = learn * 2
3. print(replikasi)
Output:
['P', 'Y', 'T', 'H', 'O', 'N', 'P', 'Y', 'T', 'H', 'O', 'N']
Fungsi pengali juga dapat Anda manfaatkan untuk inisialisasi List.
1. tujuh = [7]*7
2. print(len(tujuh))
3. print(tujuh)
Output:
7
[7, 7, 7, 7, 7, 7, 7]
Range
Fungsi range() memberikan deret bilangan dengan pola tertentu.
Untuk melakukan perulangan (misalnya for) dalam mengakses
elemen list, Anda dapat menggunakan fungsi range() pada Python.
Lebih detail mengenai operasi perulangan akan dibahas pada modul
Perulangan dan Kontrol Perulangan.
Output:
4
2. Range dengan 2 parameter n,p: membuat deret bilangan yang
dimulai dari n, hingga sebelum p (bilangan p tidak ikut). Sering
disebut sebagai inklusif n (deret dimulai bilangan n) dan
eksklusif p (deret tidak menyertakan bilangan p).
1. for i in range(1, 11):
2. print(i)
Output:
3
4
10
Output:
in dan not in
Untuk mengetahui sebuah nilai atau objek ada dalam list, Anda dapat
menggunakan operator in dan not in. Fungsi ini akan mengembalikan
nilai boolean True atau False. Contohnya adalah sebagai berikut:
1. kalimat = "Belajar Python di Dicoding sangat menyenangkan"
2. print('Dicoding' in kalimat)
3. print('tidak' in kalimat)
4. print('Dicoding' not in kalimat)
5. print('tidak' not in kalimat)
Output:
True
False
False
True
Memberikan nilai untuk multiple variable
Anda kadang memiliki beberapa variabel dan perlu memberikan nilai
pada variabel-variabel tersebut. Secara konvensional, Anda bisa
menandai variabel-variabel dengan nilai yang Anda inginkan, satu per
satu. Python memiliki cara yang lebih praktis! Anda dapat
memberikan nilai untuk beberapa variabel sekaligus dari
elemen List atau Tuple tanpa perlu menandai satu per satu seperti:
1. data = ['shirt', 'white', 'L']
2. apparel = data[0]
3. color = data[1]
4. size = data[2]
Output:
<ipython-input-60-de8a162c18fd> in <module>
----> 2 apparel, color, size, price = list
Output:
White
shirt
Sort
Jika Anda ingin mengurutkan angka atau urutan huruf, maka Anda
bisa menggunakan metode sort(). Metode sort() ini bisa mengurutkan
List. Perhatikan contoh di bawah:
Contoh:
1. angka = [100, 1000, 500, 200, 5]
2. angka.sort()
3. print(angka)
Output:
Contoh lain:
1. kendaraan = ['motor', 'mobil', 'helikopter', 'pesawat']
2. kendaraan.sort()
3. print(kendaraan)
Output:
Output:
Output:
Anda akan mengalami eror seperti berikut:
urutan.sort()
Output:
Contoh:
4. kendaraan = ['Motor', 'Mobil', 'helikopter', 'pesawat']
5. kendaraan.sort(key=str.lower)
6. print(kendaraan)
Output:
Output:
1. print(3 * 5)
Output:
15
Jenis-jenis operator
Matematika dan string
+ (tambah)
o Menambahkan dua objek.
o 3 + 5 menghasilkan 8
o 'a' + 'b' menghasilkan 'ab'.
- (kurang)
o Mengurangkan operand kedua dari operand pertama. Jika
hanya satu operand, diasumsikan nilai operand pertama
adalah 0.
o -5.2 adalah expression yang sama dengan 0 - 5.2
menghasilkan -5.2.
o 50 - 24 menghasilkan 26.
o Tidak berlaku untuk string, akan menghasilkan
error unsupported operand.
* (perkalian)
o Mengembalikan hasil perkalian angka atau
mengembalikan string yang diulang sejumlah tertentu.
o 2 * 3 menghasilkan 6.
o 'la' * 3 menghasilkan 'lalala'.
** (pangkat)
o Mengembalikan operand pertama pangkat operand kedua.
o 3 ** 4 menghasilkan 81 (sama dengan 3 * 3 * 3 * 3).
/ (pembagian)
o Mengembalikan hasil pembagian operand pertama dengan
operand kedua (float).
o 13 / 3 menghasilkan 4.333333333333333.
// (pembagian habis dibagi / div)
o Mengembalikan hasil pembagian operand pertama dengan
operand kedua (bilangan bulat), kecuali jika salah satu
operand adalah float, akan menghasilkan float.
o 13 // 3 menghasilkan 4.
o -13 // 3 menghasilkan -5.
o 9//1.81 menghasilkan 4.0.
% (modulo)
o Mengembalikan sisa bagi.
o 13 % 3 menghasilkan 1.
o -25.5 % 2.25 menghasilkan 1.5.
Operasi Bit
Perbandingan
Output:
Kelereng Hijau = 5
Kelereng Kuning = 10
lt(hijau, kuning): True
le(hijau, kuning): True
eq(hijau, kuning): False
ne(hijau, kuning): True
ge(hijau, kuning): False
gt(hijau, kuning): False
Boolean Operator
or Boolean OR
in, not in, is, is not, <, <=, >, >=, !=, == Comparisons, including membership tests and identity tests
| Bitwise OR
^ Bitwise XOR
** Exponentiation
(expressions...), [expressions...], {key: value...}, Binding or tuple display, list display, dictionary display, set dis
{expressions...}
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.
Dengan lint atau linting akan meminimalkan kode Anda mengalami error, sebagai contoh salah satunya karena kesalahan
indentasi di Python. Sebelum kode Anda diprotes oleh interpreter Python dengan IndentationError, lint akan
memberitahukannya lebih dahulu ke Anda.
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.
Untuk instalasi menggunakan manajer paket pip sebagai berikut: pip install pycodestyle.
Pylint
Pylint adalah aplikasi open source (berlisensi GPL v2) untuk melakukan analisis kode Python, mengecek untuk kesalahan
(error) pemrograman, memaksakan standar penulisan kode dengan mengecek penulisan kode yang tidak baik, serta
memberikan saran untuk refactoring sederhana.
Untuk instalasi menggunakan manajer paket pip sebagai berikut: pip install pylint.
Flake8
Flake8 adalah aplikasi open source (berlisensi MIT) yang membungkus sejumlah kemampuan aplikasi lain seperti pycodestyle,
pyflakes, dan sejumlah (skrip/fitur) lainnya.
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 pycodestyle. Menunjukkan error (E301) di baris 5 kolom 5, serta error (E112) di baris 7 kolom 5.
1. pycodestyle kal.py
2. kal.py:5:5: E301 expected 1 blank line, found 0
3. kal.py:7:5: E112 expected an indented block
Jika diproses dengan pylint. Menunjukkan error (E0001) di baris 7 kolom 10.
1. pylint kal.py
2. ************* Module kal
3. kal.py:7:10: E0001: invalid syntax (<unknown>, line 7) (syntax-error)
Jika diproses dengan flake8. Menunjukkan error (E301) di baris 5 kolom 5, error (E112) di baris 7 kolom 5, serta error (E999) di
baris 7 kolom 10.
1. flake8 kal.py
2. kal.py:5:5: E301 expected 1 blank line, found 0
3. kal.py:7:5: E112 expected an indented block
4. kal.py:7:10: E999 IndentationError: expected an indented block
Setelah kodenya diperbaiki, kali ini diubah secara manual dengan mengetikkan, pada pembahasan berikutnya mengenai
memformat kode akan menangani hal ini dengan otomatis.
1. """kalkulator"""
2.
3. class Kalkulator:
4. """kalkulator tambah kurang"""
5. def __init__(self, _i):
6. self.i = _i
7.
8. def tambah(self, _i): return self.i + _i
9.
10. def kurang(self, _i):
11. return self.i - _i
Kemudian diproses kembali dengan pycodestyle dan flake8 tidak memunculkan pesan lagi.
Diproses dengan pylint menghasilkan peringatan tentang lebih dari satu pernyataan (statement) dalam satu baris, serta kedua
fungsi belum dilengkapi dengan dokumentasi. Hasilnya pylint memberikan skor 5.71 dari 10.
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.
Proses memformat kode dengan menggunakan aplikasi, cukup sederhana, setelah melakukan instalasi, akan muncul perintah
dengan nama yang sama dengan nama aplikasinya. Kemudian perintah itu dapat dieksekusi untuk memformat satu file
ataupun satu direktori kode Python.
Berikut akan dibahas 3 jenis aplikasi untuk memformat kode, silakan dicermati dahulu, tidak harus semuanya diinstal, hanya
paket yang menurut Anda sesuai kebutuhan saja yang digunakan.
Black
Black adalah proyek open source yang dikembangkan di repository Python Software Foundation (PSF) dengan lisensi MIT.
Untuk mendapatkan gambaran, versi online (tidak resmi) ada di https://black.now.sh.
Untuk instalasi menggunakan manajer paket pip sebagai berikut: pip install black.
Untuk instalasi menggunakan manajer paket pip sebagai berikut: pip install yapf.
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.
1. class Kalkulator:
2. """kalkulator tambah kurang"""
3. def __init__(self, _i=0):
4. self.i = _i
5. def tambah(self, _i): return self.i + _i
6. def kurang(self, _i):
7. return self.i - _i
Berikut adalah hasil kode diproses dengan black, dengan mengeksekusi perintah: black kal.py
1. class Kalkulator:
2. """kalkulator tambah kurang"""
3.
4. def __init__(self, _i=0):
5. self.i = _i
6.
7. def tambah(self, _i):
8. return self.i + _i
9.
10. def kurang(self, _i):
11. 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.
1. class Kalkulator:
2. """kalkulator tambah kurang"""
3. def __init__(self, _i=0):
4. self.i = _i
5.
6. def tambah(self, _i):
7. return self.i + _i
8.
9. def kurang(self, _i):
10. return self.i - _i
Sama dengan yapf, untuk pemrosesan dengan autopep8, tidak langsung mengubah isi file kal.py tetapi tampil ke layar, dengan
mengeksekusi perintah: autopep8 kal.py.
1. class Kalkulator:
2. """kalkulator tambah kurang"""
3.
4. def __init__(self, _i=0):
5. self.i = _i
6.
7. def tambah(self, _i): return self.i + _i
8.
9. def kurang(self, _i):
10. 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:
Anda diperbolehkan untuk membuat sebuah konten/isi dari if/for/while yang cukup pendek untuk diletakkan dalam satu baris
(program tetap berjalan). Namun pastikan tidak melakukannya jika if/for/while Anda bertingkat atau bersifat multi clause,
misalnya if-else, try-finally, dan sebagainya.
Tidak disarankan:
Disarankan:
1. FILES = ('setup.cfg',)
Tidak disarankan:
1. FILES = 'setup.cfg',
Saat trailing comma bersifat redundan, Anda akan merasakan kemudahannya saat menggunakan VCS (Version Control
System), atau pada kode yang mungkin Anda tambahkan dalam beberapa waktu kedepan. Pola yang disarankan adalah
meletakkan nilai atau string pada sebuah baris baru, mengikuti indentasi yang ada, dan menambahkan trailing comma, dan
menutup kurung/kurawal/siku pada baris selanjutnya.
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:
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:
2. def munge(input: AnyStr): ...
3. def munge() -> AnyStr: ...
4.
5. No:
6. def munge(input:AnyStr): ...
7. def munge()->PosInt: …
Tidak menggunakan tanda sama dengan (=) untuk mengindikasikan keyword argumen atau nilai dasar/default pada parameter
fungsi tanpa menggunakan anotasi.
1. Yes:
2. def complex(real, imag=0.0):
3. return magic(r=real, i=imag)
4.
5. No:
6. def complex(real, imag = 0.0):
7. return magic(r = real, i = imag)
Ketika melakukan kombinasi argumen anotasi dan nilai dasar/default, Anda justru disarankan untuk menggunakan spasi
sebelum dan setelah tanda =.
1. Yes:
2. def munge(sep: AnyStr = None): ...
3. def munge(input: AnyStr, sep: AnyStr = None, limit=1000): ...
4.
5. No:
6. def munge(input: AnyStr=None): ...
7. def munge(input: AnyStr, limit = 1000): …
Penamaan
Penamaan pada pustaka (library) Python agak sulit dibuat konsisten, mengingat jumlah paketnya sudah banyak dan terdapat
beberapa library eksternal yang sudah tidak lagi dikelola. Namun, berikut adalah beberapa rekomendasi untuk penamaan.
Modul dan Paket-paket yang baru (termasuk framework) sebaiknya ditulis dengan standar baru ini. Namun Anda juga dapat
memilih mempertahankan styling pada pustaka lama yang sudah Anda gunakan sebelumnya. Sekali lagi, konsistensi internal
lebih diutamakan.
Prinsip Overriding
Nama yang dilihat oleh user publik (misalnya API) sebaiknya merefleksikan penggunaan/fungsinya, tidak merefleksikan
implementasinya. Misal nama fungsi berikut.
1. cariJalan()
1. aStarSearch()
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:
Pada beberapa pustaka juga digunakan frase awalan pendek untuk mengelompokkan beberapa fungsi atau variabel yang
berelasi atau berasal dari satu induk. Misalnya pada fungsi os.stat(), seluruh parameter menggunakan awalan st karena pada
prinsipnya, fungsi tersebut akan memanggil properti pada struct (st_size, st_mode, st_mtime, dll). Atau pustaka X11 yang
menggunakan awalan X pada seluruh fungsi publiknya.
Penggunaan frase atau huruf pada awal fungsi ini tidak disarankan pada Python, atau lebih tepatnya tidak dibutuhkan, karena
struktur pada Python:
Beberapa bentuk khusus yang umum ditemukan (dapat digabungkan dengan case convention):
1. _diawali_sebuah_garis_bawah: weak "internal use" indicator. impor fungsi
from M import * tidak akan mengimpor objek dengan awalan garis bawah.
2. diakhiri_sebuah_garis bawah_: digunakan untuk mengatasi redundant dengan keyword / reserved words di Python,
misal:
Tkinter.Toplevel(master, class_='ClassName').
3. __diawali_dua_garis bawah: menegaskan bahwa sebuah objek merupakan bagian dari kelas tertentu (pada kelas
FooBar, fungsi __boo menjadi _FooBar__boo).
4. __diawali_dan_diakhiri_dua_garis bawah__: Objek atau atribut tertentu yang diciptakan Python untuk digunakan
dalam program: __init__, __import__ or __file__. Jangan membuatnya sendiri, hanya gunakan yang telah
didokumentasikan.
ASCII
Identifiers yang digunakan pada library standar harus ASCII-Compatible - lihat PEP 3131.
Nama Kelas
Gunakan CamelCase atau CapWords convention. Pastikan semua akronim (misal HTTP) ditulis keseluruhan dengan huruf
besar.
1. T, AnyStr, Num
Jika terdapat covariant atau contravariant dari sebuah variabel, tambahkan di akhir variabel untuk mempermudah pembacaan.
Nama Exception
Karena exception seharusnya bertipe kelas, Anda juga menerapkan konvensi penamaan kelas pada exception. Bedanya,
tambahkan “Error” atau nama deskriptif lain pada nama exception Anda.
Jika nama argument fungsi merupakan reserved keyword, tambahkan garis bawah di akhir nama argument. Jangan
mengorbankan keterbacaan nama dengan menyingkatnya. Mengganti argumen bernama class dengan class_ atau kelas, lebih
baik daripada clss, misalnya.
Untuk menghindari kesamaan dengan subkelas, gunakan __dimulai_dua_garis_nama_method untuk memanggil proses yang
tepat. Python menggabungkan nama modul dengan nama kelas. Jika kelas Foo memiliki atribut __a, maka kita tidak dapat
mengaksesnya melalui Foo.__a, melainkan Foo._Foo__a. Mulai dengan dua garis bawah hanya digunakan jika terjadi konflik
dengan atribut di kelas atau subkelas lainnya.
Konstanta
Konstanta umumnya didefinisikan pada bagian atas modul dengan huruf besar, misalnya MAX_OVERFLOW dan TOTAL.
Method/Variabel Publik dipersiapkan untuk pihak eksternal menggunakan kelas Anda. Anda juga otomatis berkomitmen untuk
menghindari adanya incompatible backward changes. Sebaliknya, Method/Variabel dengan atribut non-publik hanya digunakan
oleh Anda sebagai developer, dan tidak memberikan garansi kepada siapapun bahwa Anda tidak akan mengubah atau
menghapusnya. Di sini kita tidak menggunakan atribut Private karena di Python tidak ada atribut yang benar-
benar Private.
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
Umumnya, garansi backward compatibility hanya diaplikasikan pada interface publik. Untuk itu pengguna harus dapat
membedakan dengan jelas, interface publik dan internal/non-publik. Interface yang didokumentasikan umumnya dianggap
sebagai interface publik, kecuali dijelaskan secara eksplisit. Sebaliknya, setiap interface yang tidak terdokumentasi, umumnya
dianggap bersifat internal.
Untuk keterbacaan, modul sebaiknya mendeklarasikan nama interface/API melalui atribut __all__. Jika __all__ kosong, artinya
modul tersebut tidak memiliki interface/API Publik. Selain __all__ yang diisi dengan sesuai, internal interface (paket, modul,
kelas, fungsi, atribut, atau nama lainnya), sebaiknya tetap dituliskan dengan diawali garis bawah.
Sebuah interface otomatis dianggap internal, jika namespace (paket, modul, atau kelasnya) bersifat internal.
Nama yang di-import harap selalu dianggap sebagai detail implementasi. Modul lainnya tidak diperbolehkan untuk melakukan
akses tidak langsung untuk nama-nama tersebut, kecuali jika sudah didokumentasikan, misalnya os.path atau modul __init__
yang mengekspos fungsionalitas dari submodul.
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:
3. print ("Cetak ini jika benar")
4. print (kelerengku)
Output:
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.
Output 1:
1. bilangan = 4
2. if bilangan % 2 == 0:
3. print('Bilangan {} adalah genap'.format(bilangan))
4. else:
5. print('Bilangan {} adalah ganjil'.format(bilangan))
Output:
Output 1:
Mari kita implementasikan pada kasus pengecekan bilangan positif, negatif, atau nol.
1. bilangan = -3
2. if bilangan > 0:
3. print('Bilangan {} adalah positif'.format(bilangan))
4. elif bilangan < 0:
5. print('Bilangan {} adalah negatif'.format(bilangan))
6. else:
7. print('Bilangan {} adalah nol'.format(bilangan))
Output:
Ternary Operators
Ternary operator lebih dikenal sebagai conditional expressions pada Python. Operator menentukan sesuatu berdasarkan
kondisi True atau False. Jika statement atau klausa if Anda cukup sederhana, maka ternary Operators akan sangat membantu.
IF Ternary
if (condition): condition_if_true if condition else condition_if_false
condition_if_true
else:
condition_if_false
lulus = True lulus = True
if (lulus): kata = "selamat" if lulus else "perbaiki"
kata = ”selamat”
else:
kata = “perbaiki”
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
lulus = True nice = True
if (lulus): kata= ("perbaiki", "selamat")[lulus]
kata=”selamat”
else:
kata=“perbaiki”
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
2. print(2 if kondisi else 1/0)
3. #Output is 2
4.
5. print((1/0, 2)[kondisi])
6. #Eror Pembagian Nol akan muncul
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
2. pesan = hasil or "Tidak ada data"
3. print(pesan)
Output:
For
Seperti di bahasa pemrograman lainnya, Python juga memiliki fungsi for. Bedanya di Python, For tidak hanya untuk perulangan
dengan jumlah finite (terbatas), melainkan lebih ke fungsi yang dapat melakukan perulangan pada setiap jenis variabel berupa
kumpulan atau urutan. Variabel yang dimaksud bisa berupa list, string, ataupun range. Jika sebuah list atau urutan berisi
expression, maka Ia akan dievaluasi terlebih dahulu. Kemudian item pertama pada urutan/list akan diassign sebagai variabel
iterating_var. Setelahnya, blok statement akan dieksekusi, berlanjut ke item berikutnya, berulang, hingga seluruh urutan habis.
Output:
Huruf : D
Huruf : i
Huruf : c
Huruf : o
Huruf : d
Huruf : i
Huruf : n
Huruf : g
Flower: mawar
Flower: melati
Flower: anggrek
Anda juga dapat melakukan perulangan berdasarkan indeks atau range dengan memanfaatkan fungsi len():
Output:
Flower : mawar
Flower : melati
Flower : anggrek
While
While pada bahasa Python digunakan untuk mengeksekusi statement selama kondisi yang diberikan terpenuhi (True). Kondisi
dapat berupa expression apapun, dan harap diingat bahwa True di Python termasuk semua nilai non-zero. Saat kondisi
menjadi False, program akan melanjutkan ke baris setelah blok statement.
Contoh:
1. count = 0
2. while (count < 7):
3. print('Hitungannya adalah: {}'.format(count))
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
Seperti pada bahasa lainnya, eksekusi statement while mungkin bersifat infinit / infinite loop saat sebuah kondisi tidak pernah
bernilai False. Contohnya sebagai berikut:
1. var = 1
2. while var == 1: # This constructs an infinite loop
3. num = input('Masukkan angka: ')
4. print('Anda memasukkan angka: {}'.format(num))
5.
6.
7. while True: # This constructs an infinite loop
8. num = input('Masukkan angka: ')
9. print('Anda memasukkan angka: {}'.format(num))
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.
Perulangan Bertingkat
Ada kalanya Anda perlu untuk melakukan perulangan bertingkat, misalnya untuk menghasilkan contoh print-out berikut:
******
*****
****
***
**
*
Anda dapat melakukannya dengan kode berikut:
Tip: Tambahkan parameter end pada print untuk mengatur karakter yang mengakhiri pencetakan string/teks Anda. Secara
default, karakter end ini adalah newline ('\n').
Break
Pernyataan break menghentikan perulangan kemudian keluar, dilanjutkan dengan mengeksekusi pernyataan (statement)
setelah blok perulangan. Salah satu penggunaannya yang paling sering adalah sebuah kondisi eksternal yang membutuhkan
program untuk keluar dari perulangan. Jika Anda memiliki perulangan bertingkat, break akan menghentikan perulangan sesuai
dengan tingkatan atau di perulangan mana ia berada. Namun jika ia diletakkan di perulangan dengan kedalaman kedua
misalnya, hanya perulangan itu saja yang berhenti, tidak dengan perulangan utama.
Contoh 1:
Output contoh 1:
Output contoh 2:
*
**
***
****
*****
******
*******
********
*********
**********
Continue
Pernyataan continue akan membuat iterasi saat ini berhenti, kemudian melanjutkan ke iterasi
berikutnya, mengabaikan pernyataan (statement) yang berada antara continue hingga akhir blok perulangan.
Contoh 1:
Output contoh 1:
Huruf saat ini: D
Huruf saat ini: i
Huruf saat ini: c
Huruf saat ini: o
Huruf saat ini: d ## perhatikan spasi dilewati
Huruf saat ini: i
Huruf saat ini: n
Huruf saat ini: g
Contoh 2, cetak bintang yang sama dengan contoh 2 pada pembahasan fungsi break, dengan 1 loop dan 1 if (tanpa else):
1. jumlahbaris = 10
2. baris = 0
3. bintang = 0
4. while baris < jumlahbaris:
5. if (bintang) >= (baris+1):
6. print()
7. baris = baris+1
8. bintang=0
9. continue ##saat masuk ke if, maka bagian print * diluar if tidak akan dijalankan, langsung ulang ke
while
10. print("*",end="")
11. bintang= bintang+1
*
**
***
****
*****
******
*******
********
*********
**********
Anda mungkin melihat sesuatu yang menarik. Ada If dan Else, namun dalam tingkatan yang berbeda, apakah mereka terkait?
Saat sebuah perulangan dijalankan, fungsi if akan dievaluasi. Saat ia pernah sekali saja benar, maka else tidak akan
dieksekusi. Dengan kata lain, if yang berada dalam perulangan harus selalu salah untuk memicu blok statemen else
dijalankan. Lebih singkat lagi, struktur pseudocode yang diikuti dalam membuat else pada perulangan adalah seperti berikut:
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):
2. for x in range(2, n):
3. if n % x == 0:
4. print(n, 'equals', x, '*', n/x)
5. break
Potongan kode di atas melakukan pencarian faktor dari setiap bilangan antara 2 s/d 9. Namun demikian, pada saat bilangan n
bernilai 2, 3, 5, 7, program tidak akan mencetak apapun. Ini karena bilangan-bilangan tersebut merupakan bilangan prima. Hal
ini bisa diatasi dengan menambahkan keterangan else dan mencetak bahwa bilangan tersebut adalah bilangan prima:
1. n = 10
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
Digunakan jika Anda menginginkan sebuah pernyataan atau blok pernyataan (statement), namun tidak melakukan apapun -
melanjutkan eksekusi sesuai dengan urutannya. Kontrol ini banyak digunakan saat Anda belum melakukan implementasi (atau
menyiapkan tempat untuk implementasi), serta membiarkan program tetap berjalan saat misalnya Anda mengalami kegagalan
atau exception.
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:
1. var1=""
2. while(var1!="exit"):
3. var1=input("Please enter an integer (type exit to exit): ")
4. print(int(var1))
Output:
1. import sys
2. data=''
3. while(data!='exit'):
4. try:
5. data=input('Please enter an integer (type exit to exit): ')
6. print('got integer: {}'.format(int(data)))
7. except:
8. if data == 'exit':
9. pass # exit gracefully without prompt any error
10. else:
11. print('error: {}'.format(sys.exc_info()[0]))
1. #Cara 1
2. angka = [1, 2, 3, 4]
3. pangkat = []
4. for n in angka:
5. pangkat.append(n**2)
6. print(pangkat)
Cara yang umum digunakan adalah cara di atas, yakni melakukan perulangan sejumlah item pada list angka kemudian
membuat list baru (pangkat) dan menambahkan hasil operasinya dalam list baru (pangkat). Bandingkan dengan cara berikut:
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:
Contoh kedua di atas dapat diartikan sebagai: untuk setiap anggota angka buatlah nilai kuadratnya. List comprehension dapat
digunakan lebih lanjut, misalnya:
Bandingkan dengan:
Output:
Banyak hal yang mungkin dilakukan dengan list comprehension. Coba perkirakan apa yang akan dimunculkan oleh potongan
kode berikut dan pilih jawaban yang tepat pada kuis di bagian berikutnya:
anda menjawab
[[1, 1], [9, 27], [25, 125], [49, 343], [81, 729]]
Jawaban Anda benar. Berikut adalah penjelasannya:
Benar, Kode tersebut menggunakan list comprehension untuk menghasilkan nilai kuadrat dan kubik dari isi list_a.
list_a sendiri berisi bilangan ganjil di bawah 10 (dari 1 sampai 9). comprehension untuk menghasilkan nilai kuadrat
dan kubik dari isi list_a list_a sendiri berisi bilangan ganjil dibawah 10.
1. Kesalahan sintaksis (syntax errors) atau sering disebut kesalahan penguraian (parsing errors).
2. Pengecualian (exceptions) atau sering disebut kesalahan saat beroperasi (runtime errors).
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')
2. File "<stdin>", line 1
3. print('salah indentasi')
4. ^
5. IndentationError: unexpected indent
Contoh berikut ini menampilkan kesalahan sintaksis, dimana setelah kondisi dari perintah while diharuskan ada tanda titik dua
(:).
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 dimana 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 dimana terjadi kesalahan pada baris 2.
1. python contoh_salah_sintaksis.py
2. File "contoh_salah_sintaksis.py", line 2
3. if True print('salah sintaksis')
4. ^
5. SyntaxError: invalid syntax
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)
2. Traceback (most recent call last):
3. File "<stdin>", line 1, in <module>
4. NameError: name 'angka' is not defined
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
3. Traceback (most recent call last):
4. File "<stdin>", line 1, in <module>
5. TypeError: can only concatenate str (not "int") to str
Pada contoh tersebut, variabel bukan_angka berjenis string, sehingga saat mengoperasikan variabel tersebut dengan angka
(berjenis integer), meskipun secara sintaksis sudah sesuai, muncul pengecualian dengan kelompok (tipe) kesalahan TypeError
dan pesan detail kesalahan yang menyatakan bahwa operasi penambahan untuk string (contatetation) hanya bisa dilakukan
jika kedua operannya adalah string (dan bukan integer).
Seperti terlihat bahwa pada saat terjadi pengecualian, informasi yang muncul seperti saat terjadi kesalahan (errors), termasuk
juga informasi nama file dan nomor baris dimana kesalahan terjadi.
Untuk mengetahui berbagai jenis pengecualian bawaan dari Python, bisa kunjungi situs
dokumentasi https://docs.python.org/id/3.8/library/exceptions.html.
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.
4. Traceback (most recent call last):
5. File "<stdin>", line 1, in <module>
6. ZeroDivisionError: division by zero
7.
8. >>> try:
9. ... x = 1 / z
10. ... print(x)
11. ... except ZeroDivisionError:
12. ... print('tidak bisa membagi angka dengan nilai nol')
13.
14. tidak bisa membagi angka dengan nilai nol
Perhatikan bahwa operasi aplikasi berhenti di x = 1 / z, sedangkan bagian print(x) tidak sempat dioperasikan, karena aplikasi
sudah mengalami pengecualian, sehingga yang tercetak adalah operasi print(‘tidak bisa membagi angka dengan nilai nol’).
Pada operasi yang dicontohkan di atas, penanganan pengecualian untuk ZeroDivisionError dilakukan sehingga aplikasi tidak
lagi keluar dari eksekusi karena kesalahan, tapi digantikan dengan mencetak pesan ke layar. Pada contoh ini kita fokus pada
penanganan pengecualian, meskipun ada cara lain untuk menyelesaikannya, misal menggunakan kondisi (percabangan) untuk
menghindari nilai nol.
Pernyataan except dilanjutkan dengan kelompok (tipe) kesalahan yang ingin ditangani, atau bisa juga berupa tuple dari satu
atau lebih tipe kesalahan yang akan ditangani. Di contoh berikut, menangani FileNotFoundError sebagai tuple satu elemen,
jangan lupa dalam menuliskan tuple satu elemen harus tetap diakhiri dengan koma.
1. >>> try:
2. ... with open('contoh_tidak_ada.py') as file:
3. ... print(file.read())
4. ... except (FileNotFoundError, ):
5. ... print('file tidak ditemukan')
6. ...
7. file tidak ditemukan
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.
Dalam aplikasi yang lebih kompleks, penanganan pengecualian dapat menggunakan pernyataan except lebih dari satu. Di
contoh berikutnya akan menggunakan pernyataan except lebih dari satu (untuk satu pernyataan try), maupun menggunakan
satu pernyataan except yang menangani lebih dari satu tipe kesalahan yang digabung dalam sebuah tuple.
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.
Kemudian contoh selanjutnya terjadi pengecualian untuk tipe kesalahan TypeError karena nilai d[‘ratarata’] memiliki tipe string,
sehingga tidak dapat dibagi dengan integer (angka) 3. Dalam penanganan kesalahannya, satu buah
pernyataan except menangani tipe kesalahan ValueError atau TypeError, sehingga cocok salah satunya akan menampilkan ke
layar bahwa nilai atau tipe tidak sesuai.
Di bagian paling akhir contoh, terjadi pengecualian untuk tipe kesalahan ValueError karena berusaha melakukan konversi
(casting) dari sebuah string ke integer dengan format yang tidak sesuai (bilangan bulat seharusnya tidak memiliki titik dalam
penulisannya). Dalam penulisan penanganan kesalahannya digunakan variasi lain untuk mendapatkan pesan kesalahan
sebagai variabel e untuk kemudian variabel tersebut dicetak dalam pesan yang ditampilkan ke layar.
Bentuk lengkap dari pernyataan try dapat dilihat pada bagan berikut, terdiri dari pernyataan except, else, finally.
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.
Misalnya dalam contoh berikut, Anda mewajibkan sebuah dictionary memiliki kunci (key) total.
Fungsi
Di matematika, fungsi adalah proses yang merelasikan antara sebuah masukan (input) dan keluaran (output). Pada Python,
selain fungsi relasi tersebut, fungsi juga adalah salah satu cara untuk mengorganisasikan kode - dengan tujuan akhir kode
dapat digunakan kembali (reusability).
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 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.
Sintaksis return tanpa ekspresi atau return None dapat juga tidak dituliskan. Fungsi di atas akan sama seperti di bawah ini.
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().
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
1. def kuadrat(x):
2. return x*x
3. a = 10
4. k = kuadrat(a)
5. print('nilai kuadrat dari {} adalah {}'.format(a, k))
Contohnya:
1. def ubah(list_saya):
2. list_saya.append([1, 2, 3, 4])
3. print('Nilai di dalam fungsi: {}'.format(list_saya))
4.
5. # Panggil fungsi ubah
6. list_saya = [10, 20, 30]
7. ubah(list_saya)
8. print('Nilai di luar fungsi: {}'.format(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:
1. def ubah(list_saya):
2. "Deklarasi Variabel list_saya berikut hanya dikenali (berlaku) di dalam fungsi ubah"
3. list_saya = [1, 2, 3, 4]
4. print ('Nilai di dalam fungsi: {}'.format(list_saya))
5.
6. # Panggil fungsi ubah
7. list_saya = [10, 20, 30]
8. ubah(list_saya)
9. print('Nilai di luar fungsi: {}'.format(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.
Keyword Argument, yakni argumen yang disertai identifier atau nama parameter yang secara eksplisit disebutkan.
Hal ini termasuk jika kita mengirimkan nilai melalui dictionary yang diawali dua tanda * (**).
Positional Argument, yakni argumen selain keyword argument. Jika kita mengirimkan variabel bersifat iterable, maka
harus diawali tanda *
Contoh:
Keyword Argument
Positional Argument
1. daftar(1,'Januari',2020)
2. daftar(*(1, 'Januari, 2020))
Sintaksis prefix * digunakan sebagai penanda iterable di Python, sedangkan prefix ** digunakan sebagai penanda
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.
positional-or-keyword: Anda bisa menuliskan argumen sebagai keyword argument atau positional argument.
1. def kali(nilai1, nilai2=None, nilai3): ...
positional-only: Anda menentukan bahwa argumen tertentu hanya dapat diletakkan di posisi tertentu. Hal ini
dilakukan dengan cara mendeklarasi posisi utama kemudian diikuti tanda /. Seperti pada contoh berikut, nilai1 dan
nilai2 merupakan positional only (harus diletakkan pada posisi tersebut):
1. def (nilai1, nilai2, /, nilai3): ...
keyword-only: Anda menentukan bahwa argumen tertentu harus disupply dalam bentuk keyword argument. specifies
an argument that can be supplied only by keyword. Hal ini dilakukan dengan cara mendeklarasi satu buah var-
positional argument diikuti tanda *. Seperti pada contoh berikut, nilai2 dan nilai3 merupakan keyword-only (harus
dikirim dengan keyword):
1. def func(arg, *, kw_only1, kw_only2): ...
var-positional dan var-keyword: Anda menentukan bahwa ada beberapa positional argument dan ada beberapa
keyword argument yang akan Anda proses. var-positional ditandai dengan awalan * (iterable) dan var-keyword
ditandai dengan awalan ** (dictionary). Contohnya dengan *args yang bersifat var-positional dan **kwargs yang
berupa var-keyword.
1. def func(*args, **kwargs): ...
Jika ada argumen posisi dinamis dan argumen kata kunci (keyword) dinamis, maka urutannya adalah argumen posisi dahulu,
baru argumen kata kunci. Contoh penggunaan var-positional dan var-keyword pada sebuah berkas python adalah sebagai
berikut:
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.
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:
Hasilnya
Hasil : 231
Hasil : 4
Menulis Modul
Menuliskan modul pada bahasa Python dapat dimulai dengan menuliskan definisi fungsi, kelas, dan variabel yang dapat
digunakan kembali pada program lainnya. Misalkan saja kita membuat berkas hello.py yang akan kita panggil di berkas lain.
hello.py
1. # Define a function
2. def world():
3. print("Hello, World!")
Jika hello.py dijalankan, maka program tidak akan menjalankan apapun karena world() hanya berupa definisi fungsi, kita belum
memanggilnya. Jika kita biasanya memanggil sebuah fungsi dari berkas yang sama di bagian main, kali ini kita akan membuat
berkas lain main.py yang seolah mengimpor hello.py. Pastikan hello.py dan main.py berada dalam satu direktori agar dapat
diimpor dan dipanggil.
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
Menambahkan variabel pada modul hello, tambahkan variabel nama, misalnya Dicoding.
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:
7. def __init__(self, nama, kelas):
8. self.nama = nama
9. self.kelas = kelas
10.
11. def review(self):
12. print("Reviewer " + self.nama + " bertanggung jawab di kelas " +
self.kelas)
main.py
1. #impor
2. import hello
3.
4. #panggil
5. hello.world()
6.
7. #cetak
8. print(hello.nama)
9.
10. #review
11. diko = hello.Reviewer("Diko", "Python")
12. diko.review()
Seperti umumnya kelas pada bahasa pemrograman lainnya, Fungsi dan Atributnya dapat diakses setelah kita melakukan
instansiasi. Fungsi Review adalah fungsi yang melekat pada kelas Reviewer. Kita juga dapat memanggil diko.Nama atau
diko.Kelas sebagai atribut yang melekat di kelas tersebut.
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
Seringkali, modul dimanfaatkan untuk dapat memisahkan antara definisi dan implementasi kode. Namun modul juga dapat
berfungsi selayaknya program pada umumnya, yang juga langsung mengeksekusi dalam modul itu sendiri. Contohnya, kita
buat hello2.py seperti berikut:
hello2.py
1. # Definisi
2. def world():
3. print("Hello, World!")
4.
5. # Panggil disini
6. world()
main.py
1. import hello2
Hello, World!
Sehingga modul dapat digunakan dengan berbagai metode pemanggilan, bergantung pada definisi, maupun implementasi.
1. import sys
2. sys.path.append('/home/dicoding')
3.
4. import hello
5. …
1. print(sys.path)
Anda mungkin akan menerima output seperti berikut, sangat bergantung dengan jenis environment Anda, tapi pilihlah (atau
cobalah satu per satu) jika ada beberapa output.
'/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.
1. import hello
Pastikan path yang Anda assign tepat untuk menghasilkan pemanggilan yang tepat. Modul yang tersebar pada beberapa folder
mungkin akan menghasilkan galat. Usahakan peletakan yang se-sederhana mungkin.
Catatan:
Selanjutnya kita akan mempelajari secara mendalam implementasi kelas dan fitur-fitur terkait di bahasa pemrograman Python.
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:
2. pass # gantikan dengan pernyataan-pernyataan, misal: atribut atau metode
Pada pemanggilan sintaksis class tersebut, setelah seluruh pernyataan-pernyataan semuanya selesai diproses (didaftarkan
sebagai atribut ataupun metode), maka kelas sudah dibuat dan dapat digunakan.
1. class Kalkulator:
2. """contoh kelas kalkulator sederhana"""
3. i = 12345
4.
5. def f(self):
6. return 'hello world'
Dari pembuatan class Kalkulator di atas, di dalamnya ada definisi atribut i dan definisi fungsi f.
Proses mengacu atribut yaitu Kalkulator.i dan Kalkulator.f sesuai definisi akan mengembalikan nilai integer dan fungsi. Pada
proses mengacu atribut tersebut juga dapat mengubah nilainya, misalnya dengan memberikan bilangan bulat lain
ke Kalkulator.i akan mengubah nilai yang ada saat ini.
1. Kalkulator.i = 1024 # maka nilai atribut i dalam Kalkulator berubah dari 12345 menjadi 1024
Berikut ini adalah contoh membuat instance dari class Kalkulator menghasilkan sebuah objek.
1. k = Kalkulator() # membuat instance dari kelas jadi objek, kemudian disimpan pada variabel k
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.
Pembahasan lebih lanjut mengenai metode dari class ada di bagian selanjutnya.
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.
Berikut adalah definisi class Kalkulator di atas jika diubah dengan menggunakan constructor.
1. class Kalkulator:
2. """contoh kelas kalkulator sederhana"""
3.
4. def __init__(self):
5. self.i = 12345
6.
7. def f(self):
8. return 'hello world'
Nilai dari atribut i tidak terdefinisi pada awal definisi Kalkulator, setelah dilakukan instantiation maka nilai atribut i akan bernilai
12345. Meskipun bisa mendefinisikan variabel i sebagai atribut dari class Kalkulator, tetapi sebaiknya berhati-hati mengenai
variabel yang akan terbagi (shared) untuk semua instance dari class, terutama untuk tipe yang dapat berubah (mutable),
misalnya list dan dictionary.
referensi: https://docs.python.org/id/3.8/tutorial/classes.html#class-and-instance-variables
1. class KeranjangBelanja:
2. """contoh tidak baik dilakukan dengan definisi variabel terbagi"""
3. isi = [] # menggunakan list di sini akan terbagi untuk semua instance. JANGAN DILAKUKAN
1. k = Kalkulator() # membuat instance dari kelas jadi objek, kemudian disimpan pada variabel k
Lebih lanjut tentang constructor, tentu saja untuk mendukung aplikasi yang lebih dinamis maka constructor dapat memiliki
parameter yang bisa dikirimkan saat proses instantiation, bahkan parameternya bisa lebih dari satu jika diperlukan.
Pada contoh berikut ini, constructor memiliki parameter i yang bersifat opsional, apabila dalam proses instantiation tidak
dikirimkan parameter, secara otomatis i akan diisi nilai bawaan 12345.
1. class Kalkulator:
2. """contoh kelas kalkulator sederhana"""
3.
4. def __init__(self, i=12345):
5. self.i = i # i adalah variabel pada constructor, self.i adalah variabel dari class
6.
7. def f(self):
8. return 'hello world'
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.
Seperti yang Anda sudah perkirakan, untuk sebuah metode, sebetulnya dikirimkan objek (hasil instance dari class) sebagai
argumen pertamanya, dalam hal ini bernama self.
Misalnya menggunakan contoh di atas, jika k adalah objek hasil instance dari class Kalkulator, saat melakukan pemanggilan
metode f.
1. k.f()
ekuivalen dengan
1. Kalkulator.f(k)
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:
fungsi decorator adalah sebuah fungsi yang mengembalikan fungsi lain, biasanya digunakan sebagai fungsi transformasi
dengan "pembungkus" sintaksis @wrapper.
Referensi: https://docs.python.org/id/3.8/glossary.html#term-decorator.
Classmethod adalah sebuah fungsi yang mengubah metode menjadi metode dari class (class method). Dalam
penggunaannya, fungsi ini dijadikan sebagai fungsi decorator @classmethod, kemudian pemanggilannya bisa langsung dari
class yang terdefinisi ataupun melalui objek.
Metode dari class (class method) menerima masukan class secara implisit sebagai argumen pertama yang secara konvensi
diberikan nama cls.
Berdasar contoh yang sama dengan class sebelumnya, berikut adalah metode dari class.
1. class Kalkulator:
2. """contoh kelas kalkulator sederhana"""
3.
4. def f(self):
5. return 'hello world'
6.
7. @classmethod
8. def tambah_angka(cls, angka1, angka2):
9. return '{} + {} = {}'.format(angka1, angka2, angka1 + angka2)
Nampak pada kode, sesuai konvensi ada metode yang menggunakan argumen pertama self, sedangkan untuk class method
menggunakan konvensi argumen pertama cls.
Untuk melakukan pemanggilan dari class, dilakukan seperti berikut, dimana argumen pertama cls sudah mendapatkan
masukan class Kalkulator.
Metode dari class (class method) juga dapat dipanggil dari objek, hasil instantiation dari class Kalkulator, contohnya mirip
seperti pemanggilan metode dari objek (object method).
1. k = Kalkulator()
2. print(k.tambah_angka(1, 2))
Staticmethod adalah sebuah fungsi yang mengubah metode menjadi metode statis (static method). Dalam penggunaannya,
fungsi ini dijadikan sebagai fungsi decorator @staticmethod, kemudian pemanggilannya bisa langsung dari class yang
terdefinisi ataupun melalui objek.
Metode statis (static method) tidak menerima masukan argumen pertama secara implisit.
Untuk Anda yang pernah memrogram Java atau C++, metode statis ini mirip seperti yang ada di bahasa pemrograman
tersebut.
1. class Kalkulator:
2. """contoh kelas kalkulator sederhana"""
3.
4. def f(self):
5. return 'hello world'
6.
7. @staticmethod
8. def kali_angka(angka1, angka2):
9. return '{} x {} = {}'.format(angka1, angka2, angka1 * angka2)
Nampak pada kode, tidak ada argumen pertama yang implisit seperti halnya pada dua metode sebelumnya.
1. a = Kalkulator.kali_angka(2, 3)
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)
Suatu kelas B dapat mewarisi kelas A, sehingga secara otomatis memiliki semua fitur yang dimiliki oleh kelas
A, dalam hal ini atribut-atribut dan metode-metode.
Dalam contoh ini, kelas A disebut sebagai kelas dasar, yakni kelas yang memberikan warisan atau biasa juga disebut kelas
yang diturunkan.
Kemudian kelas B disebut sebagai kelas turunan, yakni kelas yang mendapatkan warisan.
Jika di kelas B memiliki metode dengan nama yang sama dengan yang dimiliki kelas A, maka metode tersebut akan menimpa
metode yang diwariskan dari kelas A.
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
Kita akan mengembangkan aplikasi yang sudah dimiliki di atas, class Kalkulator sebagai kelas dasar yang mempunyai fungsi
melakukan penambahan melalui metode tambah_angka.
1. class Kalkulator:
2. """contoh kelas kalkulator sederhana. anggap kelas ini tidak boleh diubah!"""
3.
4. def __init__(self, nilai=0):
5. self.nilai = nilai
6.
7. def tambah_angka(self, angka1, angka2):
8. self.nilai = angka1 + angka2
9. if self.nilai > 9: # kalkulator sederhana hanya memroses sampai 9
10. print('kalkulator sederhana melebihi batas angka: {}'.format(self.nilai))
11. return 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.
1. class KalkulatorKali(Kalkulator):
2. """contoh mewarisi kelas kalkulator sederhana"""
3.
4. def kali_angka(self, angka1, angka2):
5. self.nilai = angka1 * angka2
6. return self.nilai
1. kk = KalkulatorKali()
2. a = kk.kali_angka(2, 3) # sesuai dengan definisi class memiliki fitur kali_angka
3. print(a)
4.
5. b = kk.tambah_angka(5, 6) # memiliki fitur tambah_angka karena mewarisi dari Kalkulator
6. print(b)
Dengan melakukan pewarisan, Anda dengan mudah bisa menambahkan (extend) kemampuan dari suatu class dengan fitur
yang ingin Anda buat sendiri. Hal tersebut akan sangat berguna jika Anda ingin membuat aplikasi yang mudah diguna-ulang
(reusable).
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):
2. """contoh mewarisi kelas kalkulator sederhana"""
3.
4. def kali_angka(self, angka1, angka2):
5. self.nilai = angka1 * angka2
6. return self.nilai
7.
8. def tambah_angka(self, angka1, angka2):
9. self.nilai = angka1 + angka2
10. return self.nilai
Kemudian kita coba kembali, apakah batasan yang dimiliki sudah hilang?
1. kk = KalkulatorKali()
2.
3. b = kk.tambah_angka(5, 6) # fitur tambah_angka yang dipanggil milik KalkulatorKali
4. print(b)
1. class KalkulatorTambah(Kalkulator):
2. """contoh mewarisi kelas kalkulator sederhana"""
3.
4. def tambah_angka(self, angka1, angka2):
5. if angka1 + angka2 <= 9: # fitur ini sudah oke di kelas dasar, gunakan yang ada saja
6. super().tambah_angka(angka1, angka2) # panggil fungsi dari Kalkulator lalu isi nilai
7. else: # ini adalah fitur baru yang ingin diperbaiki dari keterbatasan kelas dasar
8. self.nilai = angka1 + angka2
9. return self.nilai
Terkait variabel privat tersebut, di Python ada konvensi dimana penggunaan nama yang diawali dengan garis bawah
(underscore), baik itu fungsi, metode, maupun anggota data, akan dianggap sebagai non-publik.
Dalam Python, dimana Anda sebelumnya pernah mempelajari mengenai duck typing, maka Anda cukup mendefinisikan saja
sebuah class kosong, selanjutnya penamaan item data dapat secara langsung didefinisikan dan diisikan saat
sudah instantiation.
1. class Pegawai:
2. pass # definisi class kosong
3.
4. don = Pegawai() # membuat Pegawai baru menjadi objek bernama don
5.
6. # tambahkan item data pada objek sebagai record
7. don.nama = 'Don Doo'
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.
Ketika aplikasi yang kita kembangkan nantinya semakin kompleks, akan muncul dependensi yaitu satu atau lebih fungsi
digunakan oleh fungsi lain. Atau bahkan ketika kita mulai membangun aplikasi dengan rekan kita, kita membuat fungsi yang
digunakan oleh rekan kita, ataupun sebaliknya.
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.
Test fixture merepresentasikan persiapan yang dibutuhkan untuk melakukan satu pengujian atau lebih, serta proses
pembersihannya (cleanup). Beberapa contohnya antara lain: menyiapkan basis data pengujian, direktori pengujian,
atau mengaktifkan sebuah proses server.
Test case adalah sebuah unit dari pengujian, di mana ia mengecek sejumlah respons dari sebagian kelompok
masukan. unittest menyediakan basis class, TestCase, yang akan digunakan untuk membuat kasus pengujian baru.
Test suite adalah sebuah koleksi dari kasus-kasus pengujian, koleksi dari test suite itu sendiri, atau gabungan
keduanya. Hal ini berguna untuk mengumpulkan pengujian-pengujian yang akan dieksekusi bersama.
Test runner adalah komponen yang akan mengatur (orchestrates) eksekusi dari pengujian-pengujian dan
menyediakan keluaran untuk pengguna. Dalam hal ini runner dapat menggunakan tampilan grafis, tampilan tekstual,
atau mengembalikan nilai spesial yang menyatakan hasil dari pengujian.
1. import unittest
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)
15. # cek s.index gagal ketika tidak ditemukan
16. with self.assertRaises(ValueError):
17. s.index('decode')
18.
19. if __name__ == '__main__':
20. unittest.main()
Kelas TestStringMethods merupakan sebuah kelas yang merupakan turunan (subclass) dari class unittest.TestCase,
sehingga proses test dapat dilangsungkan tanpa banyak implementasi lain.
Ada 3 metode pada class tersebut yang semua namanya diawali dengan kata test, hal ini merupakan konvensi
(aturan) yang wajib diikuti untuk menginformasikan ke test runner bahwa sejumlah metode tersebut
merepresentasikan test yang akan dioperasikan.
Pada setiap metode, pengujian dilakukan dengan pemanggilan assert. Pada metode test_strip dilakukan
pengecekan kesamaan menggunakan assertEqual untuk memastikan
bahwa 'www.dicoding.com'.strip('c.mow') sama dengan ‘dicoding’.
Pada metode test_isalnum dilakukan pengecekan apakah fungsi bernilai benar (True), dengan assertTrue untuk
memastikan bahwa 'c0d1ng'.isalnum() bernilai benar di mana ‘cOd1ng’ adalah betul bertipe alfanumerik . Kemudian
juga ada pengecekan apakah fungsi bernilai salah (False) dengan assertFalse untuk memastikan bahwa 'c0d!
ng'.isalnum() betul bernilai salah karena ada karakter yang bukan alfanumerik yaitu ‘!’.
Pada metode test_index dilakukan pengecekan kesamaan seperti sebelumnya dengan
menggunakan assertEqual bahwa pencarian substring coding menempati index sama dengan 2. Kemudian juga ada
pengecekan apakah akan membangkitkan ValueError dengan menggunakan assertRaises(ValueError), jika
pencarian index tidak berhasil ditemukan pada string yang sudah ditentukan.
Pada bagian terakhir kode ada pemanggilan unittest.main() untuk mulai menjalankan test.
Selanjutnya kita akan membahas hasil keluarannya. Tampak pada keluaran bahwa ada 3 tanda titik (...) yang menyatakan
bahwa ketiga fungsi yang dites berhasil melewati test. Dirangkum juga waktu pemrosesan dari total 3 test tersebut berlangsung
sangat cepat selama 0.00 detik. serta di baris paling akhir adalah rangkuman bahwa semua test berlangsung sukses (OK).
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):
2. self.assertTrue('c0d1ng'.isalnum()) # ini akan berhasil
3. self.assertTrue('c0d!ng'.isalnum()) # ini akan gagal
Berikut penjelasannya:
Seperti yang sudah Anda duga bahwa, akan ada pengujian yang gagal, sehingga tertulis .F. yang menggambarkan
bahwa pengujian metode kedua gagal (FAIL).
Berikutnya dijelaskan bahwa kegagalan ada di metode test_isalnum, yaitu sebuah metode
dari class __main__.TestStringMethods.
Lebih jauh, diinformasikan bahwa test_isalnum yang gagal berada pada baris ke 10 pada kode Anda, yakni pada
pengecekan self.assertTrue('c0d!ng'.isalnum()) yang memang tadi kita ubah dari assertFalse. Sistem pengujian juga
melaporkan bahwa pembandingannya tidak sesuai yakni False tidak bernilai benar seperti yang diharapkan dengan
adanya pengujian assertTrue.
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.
Untuk menyederhanakan kodenya dan lebih fokus pada pengujiannya, tulis simulasinya dalam 1 file kode sebagai berikut:
1. import unittest
2.
3. def koneksi_ke_db():
4. print('[terhubung ke db]')
5. def putus_koneksi_db(db):
6. print('[tidak terhubung ke db {}]'.format(db))
7.
8. class User:
9. username = ''
10. aktif = False
11. def __init__(self, db, username): # using db sample
12. self.username = username
13. def set_aktif(self):
14. self.aktif = True
15.
16. class TestUser(unittest.TestCase):
17. def test_user_default_not_active(self):
18. db = koneksi_ke_db()
19. dicoding = User(db, 'dicoding')
20. self.assertFalse(dicoding.aktif) # tidak aktif secara default
21. putus_koneksi_db(db)
22.
23. def test_user_is_active(self):
24. db = koneksi_ke_db()
25. dicoding = User(db, 'dicoding')
26. dicoding.set_aktif() # aktifkan user baru
27. self.assertTrue(dicoding.aktif)
28. putus_koneksi_db(db)
29.
30. if __name__ == '__main__':
31. unittest.main()
Sama seperti sebelumnya, kita akan membuat sebuah class TestUser yang merupakan turunan dari class unittest.TestCase,
kemudian menulis 2 metode untuk pengujian kali ini.
Karena setiap test itu dioperasikan secara terpisah, akhirnya kita menjalankan fungsi koneksi ke basis data dan membuat User
dicoding setiap kali proses test. Hal tersebut bukan praktik yang baik karena memakan lebih banyak memori apalagi jika
program yang kita uji berukuran besar. Lalu apa praktik yang lebih baik?
Kita akan menggunakan metode bawaan dari class TestCase, yakni metode setUp() dan tearDown().
Metode setUp() akan dipanggil untuk menyiapkan test sehingga pemanggilannya akan dilakukan setiap sebelum
metode test dilaksanakan.
Metode tearDown() akan dipanggil setiap setelah metode test selesai dilaksanakan, meskipun terjadi kesalahan
(exception) pada proses test.
Kode sebelumnya akan kita ubah dengan implementasi kedua metode setUp() dan tearDown(). Kita cukup melakukan
perubahan pada class TestUser saja seperti di bawah.
1. class TestUser(unittest.TestCase):
2. def setUp(self):
3. self.db = koneksi_ke_db()
4. self.dicoding = User(self.db, 'dicoding')
5.
6. def tearDown(self):
7. putus_koneksi_db(self.db)
8.
9. def test_user_default_not_active(self):
10. self.assertFalse(self.dicoding.aktif) # tidak aktif secara default
11.
12. def test_user_is_active(self):
13. self.dicoding.set_aktif() # aktifkan user baru
14. self.assertTrue(self.dicoding.aktif)
Terlihat bahwa setiap kali melakukan pengujian, metode setUp() dipanggil. Begitu juga setelah selesai pengujian, metode
tearDown() dipanggil.
Dengan kemampuan pengujian ini, aplikasi yang Anda buat jadi lebih lebih teruji atau orang biasa bilang dengan istilah lebih
tahan banting (robust).
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.
Contoh implementasi kode di atas pada Notebook IBM Watson Studio sebagai berikut:
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.
Contoh kode di bawah menunjukkan fungsi os.getcwd(). Fungsi ini akan mengembalikan string representasi dari Current
Working Directory yaitu direktori di mana program Python kita berada. Fungsi ini berlaku di semua OS.
1. import os
2. print(os.getcwd())
File Input/Output
Dokumentasi: https://docs.python.org/3/tutorial/inputoutput.html.
Modul Input/Output adalah modul yang berkaitan untuk fungsi yang mengurus masukan dan keluaran pada Python. Contoh
fungsi yang ada pada modul ini adalah fungsi untuk menampilkan hasil dari program Python ke layar dan membaca teks yang
kita ketik di keyboard.
Kode di bawah menunjukkan 2 contoh fungsi yang ada pada modul Input/Output yaitu membaca teks yang kita ketik di
keyboard dan menampilkan teks tersebut.
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.
Kode berikut adalah contoh bagaimana melakukan proses pickle pada sebuah object dictionary dan menyimpannya pada
sebuah file.
1. import pickle
2. contoh_dictionary = {1:"6", 2:"2", 3:"f"}
3. pickle_keluar = open("dict.pickle","wb")
4. pickle.dump(contoh_dictionary, pickle_keluar)
5. pickle_keluar.close()
Kode berikut adalah contoh untuk mengekstraksi berkas pickle dan menaruhnya pada sebuah variabel.
1. pickle_masuk = open("dict.pickle","rb")
2. contoh_dictionary = pickle.load(pickle_masuk)
JSON
Dokumentasi: https://docs.python.org/3/library/json.html.
Untuk serialization dengan bahasa lain, umumnya kita menggunakan JSON (JavaScript Object Notation) yang memiliki
beberapa perbedaan karakteristik dengan pickle, yakni:
JSON adalah format text-serialization dan umumnya menggunakan Unicode atau UTF-8. Sementara pickle bersifat
binary serialization.
JSON dapat dibaca dengan mudah oleh manusia, sementara pickle tidak.
JSON dapat dioperasikan dan digunakan di luar ekosistem Python. Pickle adalah Python-specific.
JSON secara default hanya dapat merepresentasikan subset dari built-in type pada Python.
Pickle dapat merepresentasikan hampir (jika tidak seluruh) tipe Python dan secara default melakukan kompresi data.
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/.
Web scrapping adalah sebuah proses terotomasi untuk mendapatkan dan parsing data dari web. Disiplin seperti data science,
business intelligence, dan lainnya mendapatkan banyak manfaat dari menganalisis data pada situs-situs yang ada di internet.
Ada 2 buah library yang terkenal untuk web scraping yaitu urrlib dan beautifulsoup.
Urrlibadalah library bawaan dari Python. Kode di bawah adalah contoh untuk memulai proses scraping pada situs
dengan domain python.orgdan menampilkan isi dari tag title dari situs tersebut.
1. url = "http://python.org/"
2. page = urlopen(url)
3. html = page.read().decode("utf-8")
4. start_index = html.find("<title>") + len("<title>")
5. end_index = html.find("</title>")
6. title = html[start_index:end_index]
7. title
Beautifulsoup adalah library yang penggunaanya lebih sederhana dari urrlib. Untuk menggunakan beautifulsoup
Anda harus menginstalnya terlebih dahulu. Berikut adalah contoh penulisan kode beautifulsoup.
1. url = "http://python.org/"
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.
Contoh di bawah menunjukkan penggunaan regex. Pada variabel pattern di bawah, ^a berarti kita ingin mencari teks dengan
awalan 'a', dan s$ berarti kita ingin mencari string berakhiran 's'.
1. import re
2.
3. pola= '^a...s$'
4. string_tes= 'abyss'
5. hasil= re.match(pola, string_tes)
6.
7. if hasil:
8. print("Pencarian berhasil.")
9. else:
10. print("Pencarian gagal.")
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
Contoh dengan menggunakan ArgParse untuk menambahkan Argument yang bersifat opsional / tidak wajib:
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:
8. print("Halo, ini merupakan sebuah output dari panggildicoding.py")
Kita juga bisa membuat argumennya bersifat wajib. Modifikasi berkas panggildicoding.py menjadi seperti berikut:
1. import argparse
2.
3. parser = argparse.ArgumentParser()
4. parser.add_argument('-n', '--nama', required=True, help="Masukkan Nama Anda")
5. args = parser.parse_args()
6.
7. print("Terima kasih telah menggunakan panggildicoding.py, "+args.nama)
Anda dapat mensuplai lebih dari satu argumen, dengan menambahkan parser.add_argument sejumlah yang Anda inginkan.
Ayo berlatih melengkapi script sebelumnya agar mampu menampilkan hasil berikut:
Ketentuan skrip: