A
Argument
Nilai yang diteruskan ke fungsi (atau metode) saat memanggil fungsi.
Bilangan Kompleks
Bilangan yang dituliskan dalam formulasi x + yj, yakni bagian x adalah
bilangan real dan y adalah bilangan imajiner.
Class
Template untuk membuat objek yang ditentukan pengguna.
Class Variable
Variabel yang ditentukan di kelas dan dimaksudkan untuk dimodifikasi
hanya di tingkat kelas.
Dictionary
Array asosiatif, tempat kunci arbitrer yang dipetakan ke nilai.
Duck Typing
Sebuah konsep, tipe atau kelas dari sebuah objek tidak lebih penting
daripada metode yang menjadi perilakunya.
Dynamic Typing
Konsep dalam bahasa pemrograman yang hanya mengetahui tipe variabel
saat program berjalan dan dilakukan assignment.
Expression
Syntax yang dapat dievaluasi ke beberapa nilai.
Function
Serangkaian pernyataan yang mengembalikan beberapa nilai ke
pemanggil.
Immutable
Object dengan nilai yang tetap (tidak bisa diubah).
Inheritance
Mekanisme pewarisan, di mana satu kelas bisa mewarisi metode dan
properti dari kelas lain.
List
List atau urutan adalah tipe data bawaan pada Python yang digunakan
untuk menyimpan kumpulan data atau item. List ditulis menggunakan
kurung siku.
Method
Fungsi yang didefinisikan di dalam Class.
Mutable
Object dengan nilai yang bisa diubah.
Parameter
Entitas bernama dalam definisi fungsi (atau metode) yang menentukan
argumen yang dapat diterima oleh fungsi.
Set
Kumpulan item bersifat unik dan tanpa urutan (unordered collection).
Didefinisikan dengan kurawal dan elemennya dipisahkan dengan koma.
Daftar Referensi
[1] Python 3.8.8 Documentation. Tersedia: tautan.
[2] Python PEP 008 - Style Guide for Python Code.
Tersedia: tautan.
[3] PEP 257 - Docstring Conventions. Tersedia: tautan.
[4] Pengantar Informal tentang Python. Tersedia: tautan.
[5] Tipe Bawaan pada Python. Tersedia: tautan.
[6] Data Model pada Python. Tersedia: tautan.
[7] Format String Syntax. Tersedia: tautan.
[8] Literals. Tersedia: tautan.
[9] Al Sweigart, “Automate the Boring Stuff with Python, 2nd
Edition: Practical Programming for Total Beginners”. 2019. No
Starch Press. Chapter 4 dan Chapter 6. Tersedia: tautan.
[10] Jakub Przywóski, Python Reference (The Right Way).
Tersedia: tautan.
[11] W3schools Python Tutorial. Tersedia: tautan.
Pengenalan Python
Python adalah bahasa pemrograman multifungsi yang dibuat oleh
Guido van Rossum dan dirilis pada tahun 1991. GvR, begitu ia
biasa disebut di komunitas Python, menciptakan Python untuk
menjadi interpreter yang memiliki kemampuan penanganan
kesalahan (exception handling) dan mengutamakan sintaksis yang
mudah dibaca serta dimengerti (readability). Didesain untuk
memudahkan dalam prototyping, Python menjadi bahasa yang
sangat mudah dipahami dan fleksibel.
Python juga memilih untuk menggunakan indentasi untuk
mengelompokkan blok kode, berbeda dengan beberapa bahasa
lain yang menggunakan simbol tertentu, misalnya kurung kurawal,
atau sintaksis begin-end. Sehingga secara visual pun, blok kode
Python didesain untuk mudah dipahami. Salah satu yang paling
dikenal adalah, penggunaan titik koma atau semicolon (;) tidak
wajib di Python dan penggunaan semicolon cenderung dianggap
bukan cara khas Python (non-pythonic way), meskipun ia tetap
dapat digunakan, misalnya untuk memisahkan dua statement
dalam baris yang sama.
1. print("Hello World"); print("Welcome to Python")
Python juga memilih untuk mengadopsi dynamic typing secara
opsional, yakni variabel yang dibuat tidak akan diketahui tipenya
hingga ia dipanggil pertama kali atau dieksekusi, tidak perlu
deklarasi variabel (meskipun dimungkinkan), dan memungkinkan
tipe data berubah dalam proses eksekusi program. Sejak Python
versi 3.6, sudah tersedia pilihan untuk static typing.
Python pun terus berkembang dalam penggunaannya, sehingga
fitur-fitur baru dibutuhkan untuk dikembangkan. Versi 2.0 dirilis
Oktober 2000 dengan beberapa pengembangan fitur
termasuk Garbage Collector dan Memory Management yang juga
menjadi fitur pada beberapa bahasa pemrograman modern
lainnya, di antaranya Java dan C#.
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.
Lebih jauh tentang Python 3.0 kunjungi tautan berikut:
[Link] .
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
Saat ini, Python dikelola oleh lembaga non-komersial Python
Software Foundation (PSF). Namun sebelumnya, GvR dijuluki
sebagai Benevolent dictator for life (BDFL) karena hampir semua
keputusan pengembangan Python diambil oleh GvR, berbeda
dengan bahasa lain yang misalnya menggunakan voting dan
semacamnya. Pasca tahun 2000, dibentuklah beberapa sistem
yang memungkinkan Python menjadi lebih sustain, misalnya
Python Enhancement Proposals (PEP) untuk pengembangan
Python dan tentunya Python Software Foundation (PSF).
Jika PSF menjadi lembaga yang mengelola dan mengadvokasi
Python, PEP menjadi panduan dalam pengembangan Python.
Beberapa PEP memuat misalnya bagaimana sintaksis dan
bagaimana Bahasa Python akan berevolusi, bagaimana modul
akan dinyatakan usang (deprecated), dan sebagainya. Setelah
kurang lebih 30 tahun dalam pengembangan Python, GvR
memutuskan untuk tidak lagi menjabat BDFL pada 12 Juli 2018.
Salah satu patokan dalam pengembangan Python adalah PEP 20
yang berjudul Zen of Python.
Zen of Python ([Link] )
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Jika ada pengembangan fitur Python, maka PEP 20 inilah yang
menjadi dasar/akar dalam mengambil keputusan.
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:
1. Web development (server-side),
2. Software development,
3. Mathematics & data science,
4. Machine learning,
5. System scripting.
6. Internet of Things (IoT) development.
Python Package Index
Dengan dukungan komunitas, Python juga memiliki repository
library dan modul yang memungkinkan siapa saja berkontribusi
dan menggunakannya. Python menyediakan library yang
meliputi regular expressions, documentation generation, unit testing,
threading, databases, web browsers, koneksi ke berbagai
protokol, cryptography, GUI (graphical user interfaces), dan lain-lain.
Python Package Index ([Link] menyediakan lebih dari
209.000 modul (*Desember 2019) dan skrip yang dapat diinstal
dan digunakan secara mudah dalam proyek Python Anda.
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.
Instalasi Python pada Operating System
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).
Ubuntu (18.04.1) - Python 2
Ubuntu (18.04.1) - Python 3
MacOS Mojave (10.14.4)
Windows (kondisi terinstal)
Berikut tampilan saat Python versi 2 terinstal pada Ubuntu
(18.04.1).
Semua contoh dan tutorial pada kelas ini akan menggunakan versi
3.7.3 atau lebih tinggi. Python versi terbaru dapat diakses
di [Link] 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 [Link] .
Untuk meng-update atau menginstal, silakan mengikuti panduan
berikut (Klik tab pada tabel untuk melihat tampilan di masing-
masing sistem operasi).
Windows
Ubuntu (Update)
Mac (Update)
Berikut langkah-langkah meng-update atau menginstal Python
pada sistem operasi Windows:
1. Unduh dari [Link] ,
pilih Windows X86-64 (64 Bit) atau Windows X86 (32 Bit).
Pemilihan 32 dan 64 bit ini akan juga mempengaruhi jumlah
memori yang dapat digunakan. Umumnya, komputer saat ini
mendukung 64 bit.
2. Untuk Anda yang memiliki koneksi internet relatif baik, Anda
dapat menggunakan web installer yang relatif kecil, namun
akan melakukan pengunduhan di belakang layar. Jika Anda
menggunakan komputer lain untuk mengunduh installer,
silakan unduh executable installer (+- 25 Mb).
3. Lakukan instalasi, pastikan mencentang Add Python 3.7 to
PATH untuk menambahkan Python dalam Environment
Variables.
Catatan: sebaiknya klik disable path length limit untuk
mengatasi problem path yang melebihi 255 karakter (nama
folder yang terlalu panjang).
Link Penting
Apabila Anda mengalami kesulitan, silakan merujuk ke
halaman [Link] atau
gunakan mesin pencarian untuk mencari solusi apabila Anda
mengalami kendala dalam instalasi. Anda juga dapat
memanfaatkan forum diskusi apabila diperlukan.
Python pada IDE dan Notebook
Integrated Development Environment (IDE) lebih dari sekedar text
editor untuk membuat kode, di dalamnya tergabung juga berbagai
fasilitas development misalnya Code Versioning, Interpreter,
Visualization, dan lain sebagainya.
Untuk menulis program pada bahasa Python, Anda dapat
menggunakan teks editor apapun, misalnya Notepad++ atau
sejenisnya (Windows), Nano, Vim, Gedit (Linux), atau Visual Studio
Code/Atom/Sublime (semua platform). Anda juga bisa
menggunakan IDLE dalam bundel package python atau IDE lain
yang khusus dibuat untuk Python, misal PyCharm dari JetBrains.
Pastikan menyimpan file menggunakan ekstensi yang tepat
(umumnya .py untuk kode Python atau .pyc untuk kode yang
sudah dikompilasi).
1. Unduh PyCharm Community - Free
(opsional): [Link]
2. Tampilan PyCharm pada Project Baru.
3. Create new Python file.
Tutorial instalasi Notebook:
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 [Link] untuk lebih
detailnya. Instalasi notebook ini tidak wajib. Anda juga dapat
menggunakan notebook yang bersifat gratis misalnya IBM Watson
Studio dan Google Colab.
IBM Watson Studio
Layanan seperti IBM Watson Studio dapat digunakan tanpa perlu
meng-install perangkat lunak apapun pada komputer Anda.
Penjelasan tentang bagaimana menggunakan Watson Studio
silakan dibaca pada modul selanjutnya.
Google Colab
Untuk mulai menggunakan Google Colab, Anda dapat langsung
mengunjungi tautan
berikut: [Link]
Pengenalan IBM Watson Studio
IBM Watson Studio adalah salah satu layanan dari IBM yang
banyak digunakan oleh analis data dan Data Scientist. Anda juga
dapat menjalankan kode secara online pada layanan seperti IBM
Watson Studio tanpa perlu meng-install perangkat lunak apapun
pada komputer Anda. Berikut adalah tutorial bagaimana
menggunakan Notebook pada Watson Studio untuk menulis dan
menjalankan kode Python.
Sebelum menggunakan IBM Watson Studio, buatlah akun IBM
Cloud terlebih dahulu. Akun IBM Cloud dapat dipakai untuk
mengakses IBM Watson Studio, IBM Watson Machine Learning,
dan IBM Cloud. Untuk mendaftar akun IBM Cloud,
kunjungi tautan berikut.
1. Pertama Anda akan dihadapkan pada halaman registrasi. Isi
email dan password Anda lalu lanjutkan proses yang diminta
hingga akun berhasil dibuat.
2. Setelah akun Anda jadi, login ke IBM cloud dengan
mengunjungi tautan [Link] . Isi kolom
IBMid dengan email yang telah Anda daftarkan di tahap
sebelumnya.
3. Berikut adalah tampilan ketika Anda telah login ke akun IBM
Cloud.
4. Pada search bar ketiklah Object Storage lalu pilih item
tersebut.
5. Kemudian pada halaman Object Storage pilih Lite pada
bagan Plan. Perhatikan bahwa satu akun hanya dapat
memiliki 1 Object Storage bertipe Lite. Jika Anda telah
membuat object storage bertipe Lite sebelumnya, Anda
harus menghapus dahulu object storage tersebut untuk bisa
membuat object storage lite baru. Untuk Service Name dan
Resource Group Anda tidak perlu merubah isinya. Setelah itu
klik tombol Create yang ada di sidebar sebelah kanan.
6. Setelah memiliki akun IBM Cloud, kunjungi tautan berikut.
Login ke Watson Studio menggunakan akun IBM Cloud Anda.
7. Ketika Anda login pertama kali, akan ada pengaturan login
otomatis yang dilakukan oleh website. Setelah pengaturan
login selesai, Anda dapat klik tombol Go To IBM Cloud Pak for
Data.
8. Berikut adalah halaman muka ketika Anda login ke akun IBM
Cloud Pak. Website IBM Cloud Pak memuat layanan Watson
Studios, Watson Machine Learning, dan beberapa layanan
IBM lainnya. Untuk mulai mengembangkan proyek ML Anda
di Watson Studio, klik tombol New Project seperti yang berada
di dalam kotak berwarna merah di bawah.
9. Pada laman Create a project pilih Create an empty project.
10. Pada halaman New project, isi nama proyek Anda
beserta deskripsinya. Storage akan secara otomatis memilih
storage yang Anda buat di IBM Cloud. Setelah seluruh kolom
Anda isi, klik tombol Create.
11. Tampilan dari halaman project Anda terlihat seperti di
bawah.
12. Untuk membuat Notebook pada Watson Studio klik
tombol Add to Project lalu pilih Notebook.
13. Di halaman New notebook isi nama notebook yang
Anda inginkan lalu klik Create.
14. Sekarang Anda sudah bisa menulis kode python seperti
Anda menulis kode di Jupyter Notebook.
15. Untuk menyimpan pekerjaan Anda, klik tombol File dan
pilih Save.
16. Pekerjaan yang telah Anda simpan dapat Anda lihat
pada menu Assets di bagian Notebooks.
Mode pada Python
Pada Python dikenal beberapa mode operasi: Interactive, Script
(scripting), dan Notebook.
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.
Catatan: pastikan Anda menjalankan versi yang tepat apabila
tersedia >1 instalasi python di komputer Anda.
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
Anda dapat menggunakan python pada sesi interaktif ini
menjadi kalkulator untuk perhitungan matematika.
InteractiveExample: Print
InteractiveExample: import library dan mendapatkan
Current working directory
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,
[Link], [Link], dan [Link].
Watson Studio
[Link]
[Link]
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.
Style Guide pada Python Code
Berikut adalah beberapa style guide menulis kode Python dengan
baik dan benar. Panduan gaya penulisan kode ini mengacu
pada PEP-008. Beberapa proyek mungkin memiliki style guide
tersendiri. Sejumlah contoh kode yang ditulis di halaman ini
berupa pseudocode, bertujuan hanya untuk memberikan
gambaran tentang panduan gaya penulisan kode saja.
Guido, pembuat bahasa Python, merasakan bahwa kode lebih
sering dibaca dibandingkan ditulis. Oleh sebab itu, panduan ini
lebih ditekankan untuk kemudahan membaca kode dan
membuatnya konsisten pada (hampir) setiap proyek Python yang
ada.
Namun demikian pada kasus-kasus tertentu, keputusan adanya
modifikasi tetap pada penulis kodenya. Mungkin sebuah kode
dapat terbaca lebih jelas walaupun tidak mengikuti satu atau lebih
panduan dalam modul ini.
Indentasi
Gunakan 4 spasi pada setiap tingkatan indentasi.
Python menggunakan indentasi untuk menulis kode bertingkat.
Bahasa lain mungkin menggunakan statement tertentu (Begin, end
- pascal), perbedaan baris atau kurung kurawal. Statement yang
memiliki indentasi yang sama dan diletakkan secara berurutan
dikenali sebagai blok statement oleh Python dan akan dijalankan
secara berurutan.
1. Statement tingkat 1:
2. Statement tingkat 2()
3. Statement tingkat 2 yang kedua()
Baris Lanjutan
Seringkali, saat menulis kode, kita harus menggunakan baris
lanjutan karena kode tidak cukup dituliskan dalam satu baris.
Umumnya, kita dapat menggunakan tanda hubung, kurung,
kurawal, atau seperti disarankan pada PEP-008, gunakan hanging
indent. Beberapa panduan dalam menggunakan hanging indent
dalam penulisan kode python adalah sebagai berikut:
Disarankan:
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)
Catatan: 4 spasi bersifat opsional pada baris lanjutan, utamakan
keterbacaan kode.
Anda juga dapat menggunakan jumlah spasi yang lain (misalnya 2)
untuk baris lanjutan ini. Contohnya sepert ini:
1. # Hanging indents *boleh* menggunakan selain 4 spasi
2. foo = long_function_name(
3. var_one, var_two,
4. var_three, var_four)
Kondisional (If)
Bagian ini hanya memberikan gambaran mengenai standar
penulisan, pembahasan mengenai kondisional ada di modul
Percabangan.
Saat menulis pernyataan kondisional, misalnya IF, kita juga
menemukan penulisan yang terkadang tidak cukup dituliskan
dalam satu baris, atau menggunakan beberapa operand yang akan
menyulitkan apabila digabung berturut-turut.
Dalam kondisi ini, Python tidak memberikan panduan spesifik,
mengingat kondisi yang dihadapi programmer mungkin berbeda.
Contoh-contoh yang disarankan adalah sebagai berikut (meskipun
dimungkinkan versi-versi lain selama keterbacaan kode tetap
tinggi):
1. # Contoh kondisi visual yang tidak diubah/tanpa indentasi
2. if (sebuah kondisi dan
3. kondisi yang lain):
4. lakukanSesuatu()
5.
6. # Tambahkan komentar
7. if (sebuah kondisi dan
8. kondisi yang lain):
9. #Mengingat Keduanya Benar, lakukan hal berikut
10. lakukanSesuatu()
11.
12. # Tambahkan ekstra indentasi pada baris lanjutan
13. if (sebuah kondisi dan
14. kondisi yang lain):
15. lakukanSesuatu()
Kurung/Siku Penutup
Penempatan kurung atau siku penutup juga dapat diletakkan pada
baris lanjutan, dengan mengikuti posisi karakter pertama yang
bukan whitespace (non-whitespace character) pada baris
sebelumnya:
1. my_list = [
2. 1, 2, 3,
3. 4, 5, 6,
4. ]
5.
6. result = some_function_that_takes_arguments(
7. 'a', 'b', 'c',
8. 'd', 'e', 'f',
9. )
Atau dapat diletakkan sejajar dengan statemen utama, contoh:
1. my_list = [
2. 1, 2, 3,
3. 4, 5, 6,
4. ]
5.
6. result = some_function_that_takes_arguments(
7. 'a', 'b', 'c',
8. 'd', 'e', 'f',
9. )
Tab atau Spasi
Spasi adalah model yang disarankan PEP-008. Pengecualian pada
kode yang sudah menggunakan tab/tabulasi sebelumnya. Python
sejak versi 3 tidak memperbolehkan pencampuran antara Tab dan
Spasi untuk indentasi. Anda disarankan untuk melakukan konversi
kode untuk menggunakan spasi sepenuhnya.
Anda dapat menggunakan find-replace untuk mengganti tab, atau
memanggil kode Anda yang berbasis Python 2 dengan opsi -t
(warning) atau -tt (error) untuk mengetahui titik penggunaan tab
dan spasi yang bercampur.
Panjang Baris Maksimum
Batasi panjang kode setiap baris hingga 79 karakter. Untuk
komentar atau dokumentasi, usahakan untuk tidak melebihi 72
karakter.
Dengan membatasi panjang baris maksimum, Anda akan
memudahkan pengguna lain membuka >1 window editor secara
berdampingan, misalnya untuk melakukan review atau
perbandingan. Panjang kode setiap baris yang dibatasi akan
memudahkan Anda jika menggunakan code review tools yang
menunjukkan dua versi berbeda secara berdampingan.
Mengapa 79? Hal ini dicontohkan pada editor-editor dengan
window-width yang terset pada 80 karakter. 1 karakter tersisa bisa
berupa marker glyph atau whitespace. Pembatasan 79 karakter ini
membuat editor terkecil sekalipun tidak akan merusak struktur
dan keterbacaan kode Anda. Jika Anda atau tim mengalami
kesulitan (misalnya karena struktur penamaan variabel) yang telah
disepakati, cenderung melebihi batasan panjang karakter, Anda
dapat melakukan kesepakatan atau konvensi yang berlaku pada
kode Anda sendiri. Umumnya hingga 99 karakter per baris.
Catatan: Python Standard Library selalu dikembangkan secara
konservatif dan mempertahankan standar 79 karakter pada kode,
dan 72 pada komentar/dokumentasi.
Seperti telah dibahas sebelumnya, Anda direkomendasikan untuk
menggunakan baris lanjutan dengan kurung, kurawal, siku,
maupun hanging indents. Baris yang cukup panjang dapat
dipisahkan menjadi beberapa baris. Beberapa dari Anda mungkin
mengenal pemisahan menggunakan backslash (\), namun tidak
disarankan untuk digunakan, kecuali memang diharuskan.
Contohnya adalah penggunaan backslash pada statement with
atau assert yang tidak dapat menggunakan implicit continuation.
1. with open('/path/to/some/file/you/want/to/read') as file_1, \
2. open('/path/to/some/file/being/written', 'w') as file_2:
3. file_2.write(file_1.read())
Pastikan untuk memberikan indentasi yang sesuai pada baris-baris
lanjutannya.
Python Basic Style Guide - Penggantian Baris,
Komentar, dan Dokumentasi
Mengganti baris : Sebelum atau Sesudah Operator Binary
Bagian ini hanya memberikan gambaran mengenai standar
penulisan, pembahasan mengenai kondisional dibahas di modul
Operator, Operands, dan Expressions.
Penggantian baris setelah operator binary memang pernah
menjadi rekomendasi. Namun ternyata penggunaan metode ini
membuat mata cepat lelah dan Anda perlu melakukan pengecekan
ulang pada baris berbeda. Contohnya:
1. income = (gross_wages +
2. taxable_interest +
3. (dividends - qualified_dividends) -
4. ira_deduction -
5. student_loan_interest)
Untuk menyelesaikan masalah ini, dipilih pendekatan baris baru
sebelum operator binary. Hal ini untuk mempermudah pembaca
kode mengerti operasi yang dilakukan terhadap variabel
berikutnya.
1. income = (gross_wages
2. + taxable_interest
3. + (dividends - qualified_dividends)
4. - ira_deduction
5. - student_loan_interest)
Kedua pendekatan ini dimungkinkan di Python. Anda
direkomendasikan untuk menggunakan pendekatan kedua (baris
baru sebelum operator) untuk menulis kode baru.
Baris Kosong
Anda disarankan untuk menambahkan dua baris kosong pada top
level function dan class definitions. Kemudian untuk setiap
deklarasi method, dipisahkan dengan satu baris kosong.
Anda juga dapat menambahkan baris kosong ini apabila
dibutuhkan, misalnya untuk memisahkan gabungan beberapa
fungsi yang memiliki fungsi terkait atau untuk meningkatkan
keterbacaan kode. Pemisahan baris kosong tidak diperlukan jika
deklarasi fungsi/method Anda bersifat satu baris (one-liner),
umumnya untuk fungsi/method yang belum diimplementasikan
secara penuh.
File Encoding
Kode dalam inti Python, selalu menggunakan encoding UTF-8
(Python 3) atau ASCII (Python 2). Dalam hal ini, apabila dalam
sebuah berkas tidak ditulis deklarasi encoding, maka berkas
tersebut menggunakan encoding ASCII (Python 2) atau UTF-8
(Python 3). Dalam standard library, non-default encoding hanya
digunakan untuk pengujian atau memberikan
komentar/dokumentasi, misalnya nama penulis yang tidak
menggunakan karakter ASCII.
Untuk Python 3 dan seterusnya, pada standard library hanya
menggunakan karakter ASCII dan sebisa mungkin menggunakan
kata-kata dalam Bahasa Inggris. Proyek yang menggunakan python
3 didorong untuk menggunakan standar yang sama. Lihat PEP
3131.
Import
Saat melakukan import library, lakukan import setiap library pada
baris berbeda.
1. Yes: import os
2. import sys
3.
4. No: import sys, os
Kecuali, jika anda memerlukan lebih dari satu sub-library dari
library yang sama.
1. from subprocess import Popen, PIPE
Import umumnya diletakkan pada bagian awal berkas. Setelah
komentar dan dokumentasi tentang berkas tersebut (misalnya
definisi kelas, dll), sebelum variabel global dan konstanta. Jika
memungkinkan, kelompokkan import dalam urutan berikut:
1. Standard Library
2. Library Pihak Ketiga
3. Local/Library spesifik
Setiap grup baiknya dipisahkan oleh sebuah baris kosong.
Pada Python 2, dikenal explicit relative import, yakni proses import
yang menggunakan path relatif yang digunakan. Pada Python 3,
seluruh import yang dilakukan bersifat absolute (beserta seluruh
path secara penuh).
1. import [Link]
2. from mypkg import sibling
3. from [Link] import example
Kode pada Standard library umumnya dapat menggunakan
absolute import. Anda juga dapat mengimpor kelas/sub-library,
Anda tentu saja dapat menggunakan pemanggilan berikut:
1. from myclass import MyClass
2. from [Link] import YourClass
Jika ada penamaan kelas yang sama, gunakan pemanggilan secara
eksplisit:
1. import myclass
2. import [Link]
saat memanggil, gunakan "[Link]" dan
"[Link]".
1. from <module> import *
Wildcard imports seperti tertulis, sedapat mungkin dihindari untuk
mengatasi ambiguitas dan ketidaktahuan tentang modul apa yang
di-import.
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.
Docstring (dokumentasi kode/fungsi/method) pada Python
didefinisikan dengan tiga tanda petik, disarankan tanda petik
ganda (”””) pada awal dan akhir statement docstring.
Whitespace pada Expressions dan Statements
Wajib dihindari penambahan whitespace yang tidak perlu.
Antara kurung, kurawal, kurung siku.
1. Yes: spam(ham[1], {eggs: 2})
2. No: spam( ham[ 1 ], { eggs: 2 } )
Setelah koma, tanpa argumen lain setelahnya.
1. Yes: foo = (0,)
2. No: bar = (0, )
Sebelum koma, titik dua, atau titik koma.
1. Yes: if x == 4: print x, y; x, y = y, x
2. No: if x == 4 : print x , y ; x , y = y , x
Namun, jika Anda menggunakan titik dua/colon sebagai slice (sub-
list), pastikan ia memiliki spasi/whitespace yang sama pada kedua
sisinya.
1. Yes:
2. ham[1:9], ham[Link], ham[:9:3], ham[1::3], ham[Link]
3. ham[lower:upper], ham[lower:upper:], ham[lower::step]
4. ham[lower+offset : upper+offset]
5. ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
6. ham[lower + offset : upper + offset]
7.
8. No:
9. ham[lower + offset:upper + offset]
10. ham[1: 9], ham[1 :9], ham[1:9 :3]
11. ham[lower : : upper]
12. ham[ : upper]
Saat memberikan parameter pada fungsi, sebelum kurung tidak
boleh ada spasi.
1. Yes: spam(1)
2. No: spam (1)
Saat memberikan parameter/index pada list, sebelum kurung siku
tidak boleh ada spasi.
1. Yes: dct['key'] = lst[index]
2. No: dct ['key'] = lst [index]
Saat membuat assignment pada variabel, sebaiknya tidak
menambahkan whitespace yang tidak perlu.
1. Yes:
2. x = 1
3. y = 2
4. long_variable = 3
5.
6. No:
7. x = 1
8. y = 2
9. long_variable = 3
Rekomendasi Lainnya
Hindari menambahkan whitespace di belakang statement apapun,
utamanya di statement akhir dalam sebuah baris, karena
whitespace tersebut tidak mudah dilihat.
Biasakan untuk menambahkan satu spasi baik di kiri maupun
kanan untuk operasi berikut:
1. Assignment (=),
2. Augmented assignment (+=, -=etc.),
3. Comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not),
4. Booleans (and, or, not).
Jika operator dengan berbagai tingkatan prioritas digunakan,
letakkan whitespace pada operator-operator dengan prioritas
terendah. Namun Anda juga dapat menyesuaikannya sendiri.
Catatan: jangan pernah menggunakan >1 spasi dan gunakan spasi
yang sama baik di sebelah kiri maupun kanan dari operator-
operator binary Anda.
1. Yes:
2. i = i + 1
3. submitted += 1
4. x = x*2 - 1
5. hypot2 = x*x + y*y
6. c = (a+b) * (a-b)
7.
8. No:
9. i=i+1
10. submitted +=1
11. x = x * 2 - 1
12. hypot2 = x * x + y * y
13. c = (a + b) * (a - b)
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.
Umumnya, komentar dituliskan dalam kalimat utuh dengan
memperhatikan penulisan (huruf besar di awal kalimat, huruf kecil
saat diawali dengan identifier atau variabel, dan diakhiri titik di
akhir kalimat). Anda juga bisa menggabungkan beberapa kalimat
menjadi blok komentar dengan menambah dua spasi saat
berganti kalimat dalam satu paragraf, kecuali pada kalimat
terakhir.
Jika memungkinkan, tuliskan komentar dalam bahasa Inggris,
kecuali Anda yakin bahwa pembaca komentar ini dipastikan
mengerti bahasa Anda.
Blok Komentar
Blok komentar umumnya digunakan untuk menjelaskan fungsi
utuh atau sub-fungsi yang mengikuti/berada di bawahnya. Blok
komentar diindentasi setara dengan kode yang dijelaskan. Setiap
barisnya diawali dengan # dan sebuah spasi serta setiap
paragrafnya dimulai pada baris baru.
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
Guideline untuk menuliskan dokumentasi (docstring) yang baik
tersedia di PEP 257. Kuncinya:
Buatlah dokumentasi untuk semua modul, fungsi, kelas, dan
method yang bersifat public atau akan diakses publik.
Docstring tidak diwajibkan pada method yang tidak bersifat
public, namun Anda disarankan menambahkan komentar
tentang Apa saja yang dilakukan fungsi/modul ini beserta
informasi lainnya yang mungkin diperlukan. Komentar ini
diletakkan setelah baris def.
PEP 257 memberikan panduan detil yang dapat digunakan. Seperti
yang sudah-sudah, Anda disarankan untuk menutup sebuah
docstring yang lebih dari satu baris, pada baris baru berikutnya:
1. """Return a foobang
2. Optional plotz says to frobnicate the bizbaz first.
3. """
Untuk docstring satu baris, Anda disarankan untuk meletakkan
penutup """ - nya pada baris yang sama.
Meskipun secara sintaksis Anda dapat menggantikan 3-tanda-
kutip-dua """ dengan 3-tanda-kutip-satu ''', untuk penulisan
komentar multi-baris, tetapi PEP 257 memberikan panduan
gunakan 3-tanda-kutip-dua untuk dokumentasi (docstring).
Tipe Data pada Python - Numbers, String, dan
Boolean
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
Tipe numerik pada Python dibagi menjadi 3: int, float, complex.
Cobalah bermain-main dengan contoh berikut:
1. a = 10
2. print(a, "bertipe", type(a))
3. b = 1.7
4. print(a, "bertipe", type(b))
5. c = 1+3j
6. print(c, " Bertipe bilangan kompleks? ", isinstance(1+3j,complex))
Output seharusnya:
10 bertipe <class 'int'>
1.7 bertipe <class 'float'>
(1+2j) Bertipe bilangan kompleks? True
Integer tidak dibatasi oleh angka atau panjang tertentu, namun
dibatasi oleh memori yang tersedia. Sehingga Anda tidak perlu
menggunakan variabel yang menampung big number misalnya
long long (C/C++), biginteger, atau sejenisnya. Contoh kode untuk
menunjukkan bahwa Python tidak membatasi output integer
adalah pencarian bilangan ke-10.000 pada deret fibonacci (catatan:
bilangan ke-10.000 pada deret fibonacci memiliki panjang 2.090
digit) sebagai berikut:
1. x=[0]*10005; #inisialisasi array 0 sebanyak 10005; x[0]=0
2. x[1]=1; #x[1]=1
3.
4. for j in range(2,10001):
5. x[j]=x[j-1]+x[j-2] # Fibonacci
6. print(x[10000])
Output:
1. 3364476487643178326662161200510754331030214846068006390656476997468008
1442166662368155595513633734025582065332680836159373734790483865268263
0408924630564318873545443695598274916066020998841839338646527313000888
3026923567361313511757929743785441375213052050434770160226475831890652
7890855154366159582987279682987510631200575428783453215515103870818298
9697916131278562650331954871402142875326981879620469360978799003509623
0229102636813149319527563022783762844154036058440257211433496118002309
1208287046088923962328835461505776583271252546093591128203925285393434
6209042452489294039017062338889910858410651831733604374707379085526317
6432573399371287193758774689747992630583706574283016163740896917842637
8624212835258112820516370298089332099905707920064367426202389783111470
0540749984592503606335609338838319233867830561364353518921332797329081
3373264265263398976392272340788292817795358057099369104917547080893184
1056146322338217465637321248226383092103297701648054726243842374862411
4530938122065649140327510866433945175121615265453613331113140424368548
0510676584349352383695965342807176877532834823434555736671973139274627
3629108210679280784718035329131176778924659089938635459327894523777674
4061922403376386740040213303432974969020283281459334188268176838930720
0363479562311710310129195316979460763273758925353077255237594378843450
4067715555779056450443016640119462580972216729758615026968443146952034
6149322911059706762432685159928347098912847067408620085871350162603120
7190317208609408129832158107728207635318662461127824553720853236530577
5956430072517744315051539600905168603220349163222640885248852433158051
5348496224348482993809050704834824493274537326245677558790891871908036
6205800959474315005240253270974699531877072437682590741993963226598414
7498193609285223945039707165443156421328157688908058783183404917434556
2705202235648464951961124602683139709750693826487066132645076650746115
1267752274862159864253071129844118262266105716351506926002986170494542
5047491378115154139941550671256271197133252763631939606902895650288268
608362241082050562430701794976171121233066073310059947366875
Batasan akurasi variabel bertipe float
Python melakukan pemotongan pada digit ke 16 pada variabel
float. Float atau bilangan pecahan dibatasi akurasinya pada 15
desimal. Yang membedakan Integer dan Float adalah titik (decimal
points). Misalnya dalam penulisan angka 1 jenisnya Integer, tapi
jika dituliskan sebagai 1.0 artinya berjenis Float atau pecahan.
1. b = 0.1234567890123456789
2. print(b)
Output:
0.12345678901234568
Contoh jika berupa integer:
1. a = 1234567890123456789
2. print(a)
Output:
1234567890123456789
Karena Python banyak digunakan juga oleh matematikawan, tipe
bilangan di Python juga mendukung bilangan imajiner dan
bilangan kompleks. Nilai bilangan kompleks (complex) dituliskan
dalam formulasi x + yj, yakni bagian x adalah bilangan real dan y
adalah bilangan imajiner. Contohnya adalah sebagai berikut:
1. c = 1+5j
2. print(c)
Output:
(1+5j)
Strings
String adalah urutan dari karakter unicode yang dideklarasikan
dengan petik tunggal atau ganda. String >1baris dapat ditandai
dengan tiga petik tunggal atau ganda ''' atau """.
1. s = "Ini adalah string baris tunggal"
1. s = '''Ini adalah string
2. yang memiliki baris pertama
3. dan selanjutnya baris kedua'''
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.
Berikut adalah objek bawaan yang didefinisikan bernilai salah
dalam pengujian nilai kebenaran:
Konstanta yang sudah didefinisikan bernilai salah: None dan
False.
Angka nol dari semua tipe numeric: 0, 0.0, 0j, Decimal(0),
Fraction(0, 1).
Urutan (sequence) dan koleksi (collection) yang kosong: '', (),
{}, set(), range(0).
Untuk objek yang didefinisikan sendiri, representasi nilai Boolean
akan bergantung dari definisi metode (method) khusus bernama
__bool__(self). Jika metode ini mengembalikan True maka
interpretasi nilai dari objeknya akan True, demikian juga
sebaliknya.
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.
Operasi untuk tipe Boolean akan dijelaskan lebih lanjut di modul
Operator, Operands, dan Expressions.
Tipe Data pada Python - List, Slicing, Tuple, Set, dan
Dictionary
List
List adalah jenis kumpulan data terurut (ordered sequence), dan merupakan salah satu
variabel yang sering digunakan pada Python. Serupa, namun tak sama dengan array
pada bahasa pemrograman lainnya. Bedanya, elemen List pada Python tidak harus
memiliki tipe data yang sama. Mendeklarasikan List cukup mudah dengan kurung siku
dan elemen yang dipisahkan dengan koma.
Setiap data di dalamnya dapat diakses dengan indeks yang dimulai dari 0.
1. a = [1, 2.2, 'python']
Python mengenal slicing operator [] yang dapat melakukan ekstraksi sebuah item atau
beberapa item yang berada dalam range tertentu pada tipe data urutan (sequences),
misalnya list, string dan tuple. Beberapa tipe urutan juga mendukung "extended slicing"
dengan parameter ketiga berupa "step".
x[0] artinya mengambil elemen paling awal, dengan index 0 dari List x.
x[5] artinya mengambil elemen dengan index 5 dari List x.
x[-1] artinya mengambil elemen dengan index paling belakang ke-1 dari List x.
x[3:5] artinya membuat list dari anggota elemen List x dengan index 3 hingga
sebelum index 5 (tidak termasuk elemen dengan index 5, dalam hal ini hanya
index 3-4).
x[:5] artinya membuat list dari anggota elemen List x paling awal hingga
sebelum index 5 (tidak termasuk elemen dengan index 5, dalam hal ini hanya
index 0-4).
x[-3:] artinya membuat list dari anggota elemen List x mulai index ke-3 dari
belakang hingga paling belakang.
x[Link] artinya membuat list dari anggota elemen List x dengan index 1 hingga
sebelum index 7, dengan "step" 2 (dalam hal ini hanya index 1, 3, 5).
1. x = [5,10,15,20,25,30,35,40]
2. print(x[5])
3. print(x[-1])
4. print(x[3:5])
5. print(x[:5])
6. print(x[-3:])
7. print(x[Link])
Output:
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. [Link](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:
['kucing', 'rusa', 'gajah']
Coba tambahkan kembali:
1. del bintang [2]
2. print(binatang)
Pada baris terbawah kode di atas, maka output akan menjadi:
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:
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
TypeError: 'set' object does not support indexing
Dictionary
Dictionary pada Python adalah kumpulan pasangan kunci-nilai (pair of key-value) yang
bersifat tidak berurutan. Dictionary dapat digunakan untuk menyimpan data kecil
hingga besar. Untuk mengakses datanya, kita harus mengetahui kuncinya (key). Pada
Python, dictionary didefinisikan dengan kurawal dan tambahan definisi berikut:
1. Setiap elemen pair key-value dipisahkan dengan koma (,).
2. Key dan Value dipisahkan dengan titik dua (:).
3. Key dan Value dapat berupa tipe variabel/obyek apapun.
1. d = {1:'value','key':2}
2. print(type(d))
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
Konversi (conversion, cast) antar tipe data
Kita dapat melakukan konversi tipe data bawaan dengan menggunakan fungsi konversi
tipe bawaan (standard type) misalnya: int(), float(), str(), dll.
1. print(float(5))
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:
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1p'
Anda juga dapat melakukan konversi kumpulan data (set, list, tuple).
1. print(set([1,2,3]))
Output:
{1, 2, 3}
1. print(tuple({5,6,7}))
Output:
(5, 6, 7)
1. print(list('hello'))
Output:
['h', 'e', 'l', 'l', 'o']
Untuk konversi ke dictionary, data harus memenuhi persyaratan key-value. Berikut
adalah dua contoh konversi:
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:
{3: 26, 4: 44}
Input/Output pada Python
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.
Untuk memberikan nilai pada sebuah variabel, kita menggunakan operator "=", antara
nama variabel dengan nilai yang ingin disimpan.
Misalnya: x = 1.
Artinya kita akan menyimpan nilai 1 (tipe int) ke variabel x.
Output
Print
Seperti dicontohkan dalam beberapa sample code sebelumnya, fungsi print() adalah cara
output langsung ke konsol/layar.
1. print("Hello, World!")
Output:
Hello, World!
Memasukkan nilai variabel pada string
Untuk memasukkan nilai variabel pada string, Python memiliki dua cara. Cara yang
pertama adalah langsung menggabungkan variabel pada statement print().
1. x = 100
2. print('Nilai x adalah', x)
Output:
Nilai x adalah 100
Untuk menampilkan text (string), bisa menggunakan mekanisme string format.
Misalnya yang pertama:
1. print('hai {}'.format('bro'))
Cara yang kedua mirip dengan sintaks C/C++, yakni menggunakan operator “%” yang
ditambahkan dengan "argument specifiers", misalnya "%s" and "%d". Contohnya saat
kita ingin menambahkan nama kita pada string hello:
1. nama = "Dicoding"
2. print("Halo, %s!" % nama)
Output:
Halo, Dicoding!
Contoh menambahkan string dan integer:
1. nama = "Dicoding"
2. umur = 5
3. print("Umur %s adalah %d tahun." % (nama, umur))
Output:
Umur Dicoding adalah 5 tahun.
Contoh menambahkan objek selain string (otomatis dikonversi):
1. angka = [7, 9, 11, 13]
2. print("Angka saya: %s" % angka)
Output:
Angka saya: [7, 9, 11, 13]
Beberapa argument specifier yang umum digunakan:
1. %s - String
2. %d - Integers
3. %f - Bilangan Desimal
4. %.<digit>f - Bilangan desimal dengan sejumlah digit angka dibelakang koma.
5. %x/%X - Bilangan bulat dalam representasi Hexa (huruf kecil/huruf besar)
Contoh mencetak representasi Hexa (bilangan basis 16):
1. a, b = 10, 11
2. a, b
3. print('a: %x and b: %X' % (a, b))
Output:
(10, 11)
a: a and b: B
Referensi yang dapat dipelajari:
[Link]
Input
input()
Untuk memungkinkan user memberikan input pada program Anda, gunakan fungsi
input(), dengan argumen dalam kurung () adalah teks yang ingin ditampilkan (prompt)
dan variabel sebelum tanda sama dengan (=) adalah penampung hasil dari input
pengguna:
1. nilai = input('Masukkan angka : ')
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:
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '90+10'
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:
[Link]).
Berkas ini dapat dipanggil sebagai skrip di konsol atau command prompt, serta dapat
ditambahkan parameter tambahan saat memanggil skrip tersebut.
1. $ python [Link] arg1 arg2 arg3
Hal ini difasilitasi oleh module sys yang telah dibawa secara default pada Python. Untuk
menggunakannya, jangan lupa lakukan import terlebih dahulu:
1. import sys
Utamanya fungsi yang akan digunakan adalah [Link] yang memuat seluruh argumen
yang diterima. Anda juga dapat menggunakan len([Link]) untuk mengetahui
banyaknya argumen yang ditampung.
Contoh, sebuah berkas [Link] yang akan menambahkan tiga argumen:
1. import sys
2. print('Jumlah arguments:', len([Link]), 'arguments.')
3. print('Argument List:', str([Link]))
4. print([Link][1])
Jalankan pada konsol/terminal/command prompt:
1. $ python [Link] arg1 arg2 arg3
Output:
Jumlah arguments: 4 arguments.
Argument List: ['[Link]', 'arg1', 'arg2', 'arg3']
arg1
Dynamic Typing pada Python
Python dikenal sebagai salah satu bahasa yang menerapkan
dynamic typing, yakni bahasa pemrograman yang hanya
mengetahui tipe variabel saat program berjalan dan dilakukan
assignment. Tentu saja, pada Python juga umumnya tidak ada
deklarasi variabel, hanya berupa assignment statement. Cara ini
adalah salah satu bentuk simplifikasi alokasi memori dalam
bahasa Python. Anda dapat selalu memeriksa tipe variabel yang
digunakan dengan fungsi type() dan memastikan tipe variabel yang
tepat dengan metode isinstance(). Anda akan mempelajari lebih
jauh mengenai fungsi pada modul Fungsi dan mengenai class pada
modul Pemrograman Berorientasi Objek.
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'>
Setiap bahasa pemrograman tentunya memiliki beberapa tipe
atau kategori objek dan variabel yang dapat digunakan serta
bagaimana kategori tersebut diperlakukan (behavior, fungsi, dsb).
Contohnya, sebuah kategori bertipe “numerik” dengan “86” adalah
sebuah objek dari tipe numerik tersebut. Pada bahasa Python,
interpreter hanya mengartikan setiap baris kode saat dijalankan,
dan sepanjang daur (cycle) program, dimungkinkan adanya
perubahan dalam tipe/kategori variabel. Bagian ini hanya
memberikan gambaran mengenai dinamisme tipe, Anda akan
belajar lebih jauh tentang kondisional pada modul Percabangan.
Contoh dinamisme Python dapat dilihat pada contoh berikut:
1. if False:
2. 9 + "satu" # Baris ini tidak dioperasikan, sehingga tidak muncul notifikasi
TypeError
3. else:
4. 9 + 1
Output:
10
Padahal jika kita jalankan 9 + "satu":
1. 9 + "satu"
Output:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Pada contoh pertama, cabang 9+ “satu” tidak pernah dioperasikan.
Sehingga kode tidak akan diperiksa. Namun pada contoh kedua,
pernyataan tersebut menimbulkan TypeError karena Anda tidak
dapat menggabungkan Integer dan String. Bagian ini hanya
memberikan gambaran tentang operasi antar tipe, Anda akan
mempelajari lebih jauh tentang kesalahan (Error) di modul
Penanganan Kesalahan.
Berikut, adalah contoh untuk assignment:
1. contoh = "Halo, Buchori"
2. print(type(contoh))
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.
Python menggunakan dynamic typing sebagai opsi utama, namun
sejak Python 3.6 sudah mendukung juga static typing. Pada PEP
484 diperkenalkan type hints, yang memungkinkan Anda untuk
melakukan static type checking pada Python.
Static typing seperti didefinisikan di PEP 484, 526, 544, 560,
dan 563 dibangun bertahap di atas runtime Python yang ada dan
dibatasi oleh perilaku sintaksis dan runtime yang ada. Tidak
seperti pada bahasa lain, type hints tidak menjadikan sebuah
variabel menjadi static typed, melainkan memberikan saran tipe.
Terkait static type hints, dapat dibaca pada PEP 484.
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”
(Jika sesuatu berjalan seperti bebek dan bersuara seperti bebek,
maka kemungkinan besar ia adalah bebek).
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:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
Transformasi Angka, Karakter dan String
Pada tipe data String, terdapat banyak metode bawaan yang bisa
kita gunakan untuk mentransformasi/mengubah nilai Stringnya.
Ada yang berfungsi mengubah string menjadi huruf besar atau
kecil; pengecekan string; penggabungan string; dan sebagainya.
Mari kita bahas lebih rinci dan kelompokkan berdasarkan
kategorinya:
Mengubah Huruf Besar/Kecil
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 = [Link]()
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 = [Link]()
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.
Kedua metode ini, baik upper() maupun lower() adalah metode
built-in atau bawaan dari python yang digunakan untuk
menangani operasi string. Perlu Anda ingat, kata ‘Dicoding’,
‘DIcoding’, atau ‘DICODING’ tidak sama satu dengan lainnya, jika
Anda mempunyai suatu fungsi yang mengharuskan pengguna
mengisi dengan huruf kecil atau huruf besar, Anda bisa
menggunakan metode upper() atau lower().
Awalan dan Akhiran
Kategori selanjutnya adalah awalan dan akhiran yang di dalamnya
terdapat metode rstrip(), lstip(), dan strip(). Ketiga metode tersebut
berguna jika Anda ingin menghapus karakter whitespace pada
suatu string. Berikut uraian lengkap dari ketiga metode tersebut:
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.
1. print(' Dicoding '.strip())
Output:
Dicoding
Anda juga bisa menentukan mana karakter atau bagian yang ingin
dihilangkan, misalnya:
1. kata = 'CodeCodeDicodingCodeCode'
2. print([Link]('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.
1. print(' '.join(['Dicoding', 'Indonesia', '!']))
Output:
Dicoding Indonesia !
Contoh lain:
1. print('123'.join(['Dicoding', 'Indonesia', '!']))
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).
1. print('Dicoding Indonesia !'.split())
Output:
['Dicoding', 'Indonesia', '!']
Anda dapat mengubah parameter split (delimiter), perhatikan
contoh berikut:
1. print('Dicoding123Indonesia123!'.split('123'))
Output:
['Dicoding', 'Indonesia', '!']
Anda juga dapat menggunakan metode split() ini untuk
memisahkan setiap baris pada string multiline:
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 cep
berkenalan denganmu.']
Mengganti Elemen String
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.
1. string = "Ayo belajar Coding di Dicoding"
2. print([Link]("Coding", "Pemrograman"))
Output:
Ayo belajar Pemrograman di Dicoding
Perhatikan bahwa "coding" di frase "Dicoding" tidak berubah, maka
fungsi replace bersifat Case Sensitive.
Opsional: Parameter ketiga pada replace dapat diisi jumlah
substring yang ingin diganti seperti di bawah ini.
1. string = "Ayo belajar Coding di Dicoding karena Coding adalah bahasa masa depan"
2. print([Link]("Coding", "Pemrograman", 1))
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.
Contoh yang akan mengembalikan nilai True:
1. kata = ‘DICODING’
2. [Link]()
Output:
True
Contoh yang akan mengembalikan nilai False:
1. kata = ‘Dicoding’
2. [Link]()
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.
Contoh yang akan mengembalikan nilai True:
1. kata = ‘dicoding’
2. [Link]()
Output:
True
Contoh yang akan mengembalikan nilai False:
1. kata = ‘Dicoding’
2. [Link]()
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 [Link]():
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:
Masukkan nama Anda:
dicoding123
Masukkan nama Anda dengan benar.
Masukkan nama Anda:
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.
Formatting pada String
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:
Penerapan zfill pada Angka
Jika kita ingin menerapkan zfill pada data berupa angka, maka kita
harus mengonversinya terlebih dahulu ke dalam bentuk string
menggunakan str() seperti di bawah ini:
1. # Contoh 1: Penggunaan zfill 5 pada angka satuan
2. angka = 5
3. print (str(angka).zfill(5));
4. # Contoh 2: Penggunaan zfill 5 pada angka ratusan
5. angka = 300
6. print (str(angka).zfill(5));
7. # Contoh 3: Penggunaan zfill 5 pada angka desimal negatif (memiliki koma)
8. angka = -0.45
9. print (str(angka).zfill(5));
10. # Contoh 4: Penggunaan zfill 7 pada angka desimal negatif (memiliki koma)
11. angka = -0.45
12. print (str(angka).zfill(7));
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.
Penerapan zfill pada String
Lain halnya ketika data yang ingin kita tambahkan nilai 0 berupa
string. Kita tidak perlu mengonversi data tersebut ke dalam bentuk
string karena memang asalnya sudah dalam bentuk string. Untuk
memperjelas pernyataan tersebut perhatikan contoh di bawah ini.
1. # Contoh 1
2. kata = 'aku'
3. print ([Link](5));
4. # Contoh 2
5. kata = 'kamu'
6. print ([Link](5));
7. # Contoh 3
8. kata = 'dirinya'
9. print ([Link](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).
Teks rata kanan/kiri/tengah dengan rjust(), ljust(), dan center()
Anda dapat merapikan pencetakan teks di layar dengan metode
rjust(), ljust() atau center(). Sesuai artinya, metode rjust() digunakan
untuk membuat teks rata kanan, metode ljust() digunakan untuk
membuat teks rata kiri, dan center() digunakan untuk membuat
teks rata tengah. Ketiga metode ini akan menambahkan spasi
pada string untuk membuatnya sesuai. Parameternya berupa
integer yang merupakan panjang teks secara keseluruhan (bukan
jumlah spasi yang ditambahkan):
rjust()
Berikut penerapan rjust() dan contoh kodenya. Pembahasan
lengkap akan dijelaskan di bawah setelah uraian kodenya ya.
Contoh metode rjust():
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:
' Dicoding '
Contoh lain:
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).
Apabila kita menuliskannya sebagai berikut,
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'
Python mengetahui bahwa pada Jum\’at, sebelum petik
terdapat backslash (\) yang menandakan petik tunggal merupakan
bagian dari string dan bukan merupakan akhir dari string. Escape
character \' dan \" memungkinkan Anda untuk memasukkan
karakter ' dan '' dalam bagian string. Beberapa contoh Escape
Character
\' Single quote
\" Double quote
\t Tab
\n Newline (line break)
\\ Backslash
Masukkan contoh berikut pada shell python atau notebook:
1. print("Halo!\nKapan terakhir kali kita bertemu?\nKita bertemu hari Jum\'at yang
lalu.")
Output:
Halo!
Kapan terakhir kali kita bertemu?
Kita bertemu hari Jum’at yang lalu
Selain tanda kutip dan kutip-dua, untuk penulisan String di Python
juga bisa menggunakan 3 kutip-satu atau 3 kutip-dua, yang juga
memiliki kemampuan untuk menyimpan String lebih dari satu
baris (multi-line).
multi_line = """Halo!
Kapan terakhir kali kita bertemu?
Kita bertemu hari Jum’at yang lalu."""
print(multi_line)
Output:
Halo!
Kapan terakhir kali kita bertemu?
Kita bertemu hari Jum’at yang lalu
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.
Operasi pada List, Set, dan String
Pada modul berikut, Anda akan belajar tentang contoh-contoh operasi pada list, set,
dan string. Beberapa contoh operasi tidak dapat sekaligus dilakukan pada list, set, dan
string. Hal ini karena perbedaan karakteristik dari masing-masing tipe data. Penjelasan
mengenai apa itu list, set, dan string sudah dijelaskan di Modul Tipe Data. Anda bisa
mengulang kembali modul tersebut untuk lebih memahaminya ya.
len()
Sebelumnya, Anda sudah mengetahui bahwa slicing digunakan untuk urutan. Salah satu
fungsi yang paling bermanfaat untuk List atau String adalah len() yang akan
menghitung panjang atau banyaknya elemen dari List (untuk String menjadi
menghitung jumlah karakternya).
1. contoh_list = [1, 3, 3, 5, 5, 5, 7, 7, 9]
2. print(contoh_list)
3. print(len(contoh_list))
4.
5. contoh_set = set([1, 3, 3, 5, 5, 5, 7, 7, 9])
6. print(contoh_set)
7. print(len(contoh_set))
8.
9. contoh_string = "Belajar Python"
10. print(contoh_string)
11. print(len(contoh_string))
1. Output:
[1, 3, 3, 5, 5, 5, 7, 7, 9]
{1, 3, 5, 7, 9}
Belajar Python
14
min() dan max()
Selain menghitung panjang atau banyaknya elemen, Anda juga dapat mengetahui
berapa nilai minimum dan maksimum dari suatu list menggunakan fungsi min() dan
max(). Berikut contohnya.
1. angka = [13, 7, 24, 5, 96, 84, 71, 11, 38]
2. print(min(angka))
3. print(max(angka))
Output:
5
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([Link](6))
3. string = "Belajar Python di Dicoding sangat menyenangkan"
4. substring = "a"
5. print([Link](substring))
Output:
Penggabungan dan Replikasi
Pada List juga dimungkinkan adanya penggabungan (+) dan replikasi (*).
1. angka = [2, 4, 6, 8]
2. huruf = ['P', 'Y', 'T', 'H', 'O', 'N']
3. gabung = angka + huruf
4. print(gabung)
Output:
[2, 4, 6, 8, 'P', 'Y', 'T', 'H', 'O', 'N']
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]
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.
Fungsi range dapat memiliki 1-3 parameter:
1. Range dengan 1 parameter n: membuat deret bilangan yang dimulai dari 0,
sebanyak n bilangan.
1. for i in range(5):
2. print(i)
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:
10
3. Range dengan 3 parameter n,p,q: membuat deret bilangan yang dimulai dari n,
hingga sebelum p (bilangan p tidak ikut), dengan setiap elemennya memiliki
selisih q.
1. print([_ for _ in range(0,20,5)])
Output:
[0, 5, 10, 15]
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]
Anda dapat melakukannya dengan cara:
1. data = ['shirt', 'white', 'L'] # From List
2. apparel, color, size = data
3. data = ('shirt', 'white', 'L') # From Tuple
4. apparel, color, size = data
Tentu saja, jumlah variabel dan jumlah item pada List/Tuple harus sama. Jika tidak,
Python akan memberikan ValueError. Bagian ini hanya memberikan gambaran tentang
operasi pada List/Tuple, Anda akan mempelajari lebih jauh tentang kesalahan (Error) di
modul Penanganan Kesalahan.
1. lidata = ['shirt', 'white', 'L'] # From List
2. apparel, color, size, price = data
Output:
ValueError Traceback (most recent call last)
<ipython-input-60-de8a162c18fd> in <module>
1 list = ['shirt', 'white', 'L'] # From List
----> 2 apparel, color, size, price = list
ValueError: not enough values to unpack (expected 4, got 3)
Catatan : Penggunaan assignment pada multi variabel ini dapat Anda gunakan untuk
menukar nilai dua atau lebih variabel:
1. apparel, color = 'shirt', 'white'
2. apparel, color = color, apparel
3. print(apparel)
4. print(color)
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. [Link]()
3. print(angka)
Output:
[5, 100, 200, 500, 1000]
Contoh lain:
1. kendaraan = ['motor', 'mobil', 'helikopter', 'pesawat']
2. [Link]()
3. print(kendaraan)
Output:
['helikopter', 'mobil', 'motor', 'pesawat']
Anda juga dapat memasukkan keyword reverse=True di dalam parameter untuk
menjadikan urutannya terbalik.
1. kendaraan = ['motor', 'mobil', 'helikopter', 'pesawat']
2. [Link](reverse=True)
3. print(kendaraan)
Output:
['pesawat', 'motor', 'mobil', 'helikopter']
Beberapa hal yang perlu Anda ketahui:
1. Metode sort langsung melakukan pengurutan pada variabel yang
dioperasikannya, sehingga Anda tidak perlu melakukan operasi assignment (=).
2. Metode sort tidak dapat mengurutkan list yang memiliki angka dan string
sekaligus di dalamnya.
Contoh:
1. urutan = ['Dicoding', 1, 2, 'Indonesia', 3]
2. [Link]()
3. print(urutan)
Output:
Anda akan mengalami eror seperti berikut:
Traceback (most recent call last):
File "<pyshell#102>", line 1, in <module>
[Link]()
TypeError: '<' not supported between instances of 'int' and 'str'
Bagian ini hanya memberikan gambaran tentang operasi sort, Anda akan
mempelajari lebih jauh tentang kesalahan (Error) di modul Penanganan
Kesalahan.
3. Metode sort menggunakan urutan ASCII, sehingga nilai huruf kapital
(uppercase) akan lebih dahulu dibandingkan huruf kecil (lowercase).
Contoh:
1. kendaraan = ['motor', 'mobil', 'helikopter', 'Pesawat']
2. [Link]()
3. print(kendaraan)
Output:
['Pesawat', 'helikopter', 'mobil', 'motor']
Untuk mengatasi kendala ini, Anda dapat memasukkan keyword [Link] pada
parameter. Hal ini akan membuat metode sort menganggap semua objek
menggunakan huruf kecil, tanpa mengubah kondisi asli dari objek tersebut.
Contoh:
4. kendaraan = ['Motor', 'Mobil', 'helikopter', 'pesawat']
5. [Link](key=[Link])
6. print(kendaraan)
Output:
['helikopter', 'Mobil', 'Motor', 'pesawat']
Operator, Operands, dan Expressions
Setiap logika komputasi yang berada dalam program Anda akan
menggunakan ekspresi. Sebuah ekspresi dapat terdiri dari
operator dan operan. Salah satu contoh termudah adalah a + b
atau 2 + 3, yang dapat kita pecah yakni + sebagai operator dan a, b,
2, atau 3 sebagai variabel/operand. Operator jelas memiliki
fungsinya masing-masing dan direpresentasikan dengan simbol
atau keyword tertentu.
Tip: Anda dapat melakukan expression tanpa menggunakan
variabel secara langsung pada mode interaktif Python:
1. print(2 + 3)
Output:
5
1. print(3 * 5)
Output:
15
Jenis-jenis operator
Simak di bawah ini beberapa operator yang ada di Python.
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).
| Tips: untuk akar dua, gunakan pangkat 0.5.
/ (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
<< (left shift)
o Menggeser representasi bit/binary dari operand
pertama sebanyak operand kedua ke kiri.
o 2 << 2 menghasilkan 8.
2 direpresentasikan sebagai 10 dalam binary.
Geser ke kiri sebanyak 2x, menjadi 1000
(tambahkan 0 di belakangnya).
o 1000 dalam binary bernilai 8 dalam desimal.
>> (right shift)
o Menggeser representasi bit/binary dari operand
pertama sebanyak operand kedua ke kanan.
o 11 >> 1 menghasilkan 5.
11 direpresentasikan sebagai 1011 dalam binary.
Geser ke kanan sebanyak 1x, menjadi 101.
o 101 dalam binary bernilai 5 dalam desimal.
& (bit-wise AND)
o Menjalankan operasi binary AND pada representasi
operand pertama dan kedua.
o 5 & 3 menghasilkan 1.
Representasi binary 5 adalah 101 dan
representasi binary 3 adalah 011.
101 and 011 bernilai 001.
o 001 dalam desimal adalah 1.
| (bit-wise OR)
o Menjalankan operasi binary OR pada representasi
operand pertama dan kedua.
o 5 | 3 menghasilkan 7.
Representasi binary 5 adalah 101 dan
representasi binary 3 adalah 011.
101 or 011 bernilai 111.
o 111 dalam desimal adalah 7.
^ (bit-wise XOR)
o Menjalankan operasi binary XOR pada representasi
operand pertama dan kedua.
o 5 ^ 3 menghasilkan 6.
Representasi binary 5 adalah 101 dan
representasi binary 3 adalah 011.
101 xor 011 bernilai 110.
o 110 dalam desimal adalah 6.
~ (bit-wise invert)
o Menjalankan operasi binary invert pada representasi
operand.
o Nilai invert dari x adalah -(x+1), menggunakan metode
Two’s Complement
o ~5 menghasilkan -6.
o Lebih lanjut mengenai Two’s Complement dapat dibaca
pada [Link]
%27s_complement
Perbandingan
< atau [Link] (less than)
o Menjalankan perbandingan apakah operand pertama
lebih kecil dari operand kedua.
o 5 < 3 menghasilkan False and 3 < 5 menghasilkan True.
o Perbandingan dapat berisi lebih dari dua operand,
misalnya 3 < 5 < 7 menghasilkan True.
> atau [Link] (greater than)
o Menjalankan perbandingan apakah operand pertama
lebih besar dari operand kedua.
o 5 > 3 menghasilkan True.
<= atau [Link] (less than or equal to)
o Menjalankan perbandingan apakah operand pertama
lebih kecil atau sama dengan operand kedua.
o x = 3; y = 6;
x <= y menghasilkan True.
>= atau [Link] (greater than or equal to)
o Menjalankan perbandingan apakah operand pertama
lebih besar atau sama dengan operand kedua.
o x = 4; y = 3;
x >= y menghasilkan True.
== atau [Link] (equal to)
o Menjalankan perbandingan apakah operand pertama
sama dengan operand kedua.
o x = 2; y = 2;
x == y menghasilkan True.
o x = 'str'; y = 'stR';
x == y menghasilkan False.
o x = 'str'; y = 'str';
x == y menghasilkan True.
!= atau [Link] (not equal to)
o Menjalankan perbandingan apakah operand pertama
tidak sama dengan operand kedua.
o x = 2; y = 3;
x != y returns True.
Penggunaan le, lt, gt, ge, eq, ne
Mari kita implementasikan operator perbandingan berikut pada
kasus jumlah kelereng berwarna hijau dan kuning.
1. from operator import *
2. hijau = 5
3. kuning = 10
4. print('Kelereng Hijau = {}'.format(hijau))
5. print('Kelereng Kuning = {}'.format(kuning))
6. for func in (lt, le, eq, ne, ge, gt):
7. print('{}(hijau, kuning): {}'.format(func.__name__, func(hijau, kuning)))
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
not (boolean NOT)
o Jika x bernilai True, fungsi akan mengembalikan nilai
False.
o Jika x bernilai False, fungsi akan mengembalikan nilai
True.
o x = True;
not x akan mengembalikan nilai False.
and (boolean AND)
o x AND y akan mengembalikan nilai False jika x bernilai
False, atau fungsi akan mengembalikan nilai y.
o x = False; y = True;
x AND y, Fungsi akan mengembalikan nilai False
karena x bernilai False.
Dalam kasus ini, Python tidak akan mengevaluasi
nilai y karena apapun nilai y tidak akan
mempengaruhi hasil. Hal ini dinamakan short-
circuit evaluation.
or (boolean OR)
o x OR y, Jika x bernilai True, fungsi akan mengembalikan
nilai True, atau fungsi akan mengembalikan nilai dari y.
o x = True; y = False;
x OR y, fungsi akan mengembalikan nilai True.
Dalam kasus ini, Python juga menggunakan short-
circuit evaluation karena apapun nilai y tidak akan
mempengaruhi hasil.
Cara singkat menuliskan operasi
Jika Anda melakukan assignment kembali hasil sebuah expression,
beberapa di antaranya bisa disingkat sebagai berikut:
1. a = 2
2. a = a * 3
Dapat dituliskan sebagai
1. a = 2
2. a *= 3
Perhatikan formatnya menjadi [operand] [operasi] = expression.
Urutan matematis dalam melakukan evaluasi
Jika Anda memiliki expression 2 + 3 * 4, Apakah penambahan
dilakukan terlebih dahulu sebelum perkalian? Jika merujuk pada
aturan yang benar, maka perkalian dilakukan lebih dahulu,
sehingga perkalian memiliki urutan lebih awal/tinggi.
Berikut adalah tabel urutan yang diambil dari
referensi Dokumentasi Python:
Operator Description
lambda Lambda expression
if - else Conditional expression
or Boolean OR
and Boolean AND
Operator Description
not x Boolean NOT
in, not in, is, is not, <, <=, >, >=, !=, == Comparisons, including membership tests and identity tests
| Bitwise OR
^ Bitwise XOR
& Bitwise AND
<<, >> Shifts
+, - Addition and subtraction
*, @, /, //, % Multiplication, matrix multiplication, division, floor division, re
+x, -x, ~x Positive, negative, bitwise NOT
** Exponentiation
await x Await expression
x[index], x[index:index], x(arguments...), Subscription, slicing, call, attribute reference
[Link]
(expressions...), [expressions...], {key: Binding or tuple display, list display, dictionary display, set disp
value...},{expressions...}
Tip: Gunakan kurung untuk memudahkan keterbacaan dan
memastikan urutan secara tepat. 2 + (3 * 4) akan lebih mudah
dibaca daripada 2 + 3 * 4, meskipun hasilnya sama
Gunakan kurung untuk mengubah urutan operasi. 2 + 3 * 4
seharusnya dikalikan terlebih dahulu.
Anda dapat menggunakan (2 + 3) * 4 untuk memastikan
penjumlahan dilakukan terlebih dahulu.
Operator di Python juga bersifat asosiatif dari kiri ke-kanan.
Artinya, semua operator yang memiliki tingkatan yang sama akan
dijalankan berurutan dari kiri ke kanan.
Pengecekan Style Guide PEP8
Sampai dengan saat ini, Anda tentu sudah menuliskan kode
pemrograman Python cukup banyak, termasuk di antaranya kode
yang Anda tulis mengalami kesalahan sintaksis atau indentasi. Lalu
bagaimana agar ke depan bisa mencegah hal tersebut terjadi?
Bergantung dengan editor yang Anda gunakan untuk menulis kode
Python, dimana salah satu fitur yang memudahkan penulisan,
sehingga menghemat banyak waktu untuk memformat kode
sesuai arahan gaya penulisan (style guide) PEP8 dan mengecek
akan kemungkinan terjadinya kesalahan (error) pada kode yang
ditulis. Untuk itu akan dijelaskan sejumlah aplikasi yang dapat
Anda gunakan, dengan memanggil perintah atau sebaiknya
diintegrasikan ke editor kode yang Anda pakai, dengan tujuan
untuk membantu Anda mengecek kemungkinan kesalahan dan
kesesuaian dengan PEP8.
Lint
Lint adalah proses pengecekan kode atas kemungkinan terjadi
kesalahan (error), termasuk dalam proses ini adalah mengecek
kesesuaian terhadap arahan gaya penulisan kode (style guide)
PEP8. Aplikasi yang digunakan untuk proses ini disebut linter.
Integrasi linter dengan editor kode Anda akan membuat efisien
dalam menulis kode Python. Pertimbangan ini karena keluaran
dari aplikasi linter hanya berupa teks singkat berupa keterangan
dan kode Error atau Warning atau Kesalahan Konvensi Penamaan
(Naming Conventions), akan dicontohkan selanjutnya.
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.
Pycodestyle (sebelumnya bernama pep8)
Pycodestyle adalah aplikasi open source (berlisensi MIT/Expat)
untuk membantu mengecek kode terkait gaya penulisan kode
dengan konvensi PEP8.
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 [Link]. 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 [Link]
2. [Link]:5: E301 expected 1 blank line, found 0
3. [Link]:5: E112 expected an indented block
Jika diproses dengan pylint. Menunjukkan error (E0001) di baris 7
kolom 10.
1. pylint [Link]
2. ************* Module kal
3. [Link]: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 [Link]
2. [Link]:5: E301 expected 1 blank line, found 0
3. [Link]:5: E112 expected an indented block
4. [Link]: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 [Link]
Untuk instalasi menggunakan manajer paket pip sebagai
berikut: pip install black.
YAPF (Yet Another Python Formatter)
YAPF adalah proyek open source yang dikembangkan di repository
Google, dengan lisensi Apache.
Untuk mendapatkan gambaran, versi online (tidak resmi) ada
di [Link]
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 [Link] 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 [Link]
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 [Link] tetapi tampil ke layar, dengan mengekseskusi
perintah: yapf [Link].
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 [Link] tetapi tampil ke layar, dengan
mengeksekusi perintah: autopep8 [Link].
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.
Python Basic Style Guide - Statement
Gabungan, Trailing Commas, dan Anotasi
Fungsi
Statement gabungan
Usahakan untuk tidak menggabungkan >1 statement pada baris
yang sama.
Disarankan:
1. if foo == 'blah':
2. do_blah_thing()
3. do_one()
4. do_two()
5. do_three()
Tidak disarankan:
1. if foo == 'blah': do_blah_thing()
2. do_one(); do_two(); do_three()
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:
1. if foo == 'blah': do_blah_thing()
2. for x in lst: total += x
3. while t < 10: t = delay()
Sangat tidak disarankan:
1. if foo == 'blah': do_blah_thing()
2. else: do_non_blah_thing()
3. try: something()
4. finally: cleanup()
5. do_one(); do_two(); do_three(long, argument,
6. list, like, this)
7. if foo == 'blah': one(); two(); three()
Penggunaan Trailing Commas
Koma di bagian akhir (trailing commas) umumnya bersifat
opsional, satu statemen dimana ia bersifat wajib adalah saat kita
membuat variabel menggunakan tipe tuple dengan satu elemen.
Hal ini umumnya diperjelas dengan kurung untuk menghindari
penghapusan atau pembersihan.
Disarankan:
1. FILES = ('[Link]',)
Tidak disarankan:
1. FILES = '[Link]',
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. '[Link]',
3. '[Link]',
4. ]
5. initialize(FILES,
6. error=True,
7. )
Tidak disarankan:
1. FILES = ['[Link]', '[Link]',]
2. initialize(FILES, error=True,)
Anotasi Fungsi
Penggunaan anotasi fungsi sebaiknya menggunakan aturan baku
untuk titik dua (:) dan menggunakan spasi untuk penggunaan ->.
Hal ini dijelaskan lebih lanjut di PEP 484.
1. Yes:
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): …
Python Basic Style Guide - Prinsip Penamaan
pada Python
Penamaan pada Python
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()
akan lebih mudah dipahami dibanding,
1. aStarSearch()
Algoritma yang digunakan dapat dijelaskan dalam docstring
ataupun komentar.
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:
b (satu karakter huruf kecil).
B (satu karakter huruf besar).
hurufkecil.
huruf_kecil_dengan_pemisah_kata_garis_bawah.
HURUFBESAR.
HURUF_BESAR_DENGAN_PEMISAH_GARIS_BAWAH.
HurufBesarDiAwalKata (atau CapWords, CamelCase).
Pastikan semua singkatan/akronim dituliskan dengan huruf
besar, contohnya HTTPServerError, bukan HttpServerError.
hurufCampuran (mirip dengan CapWords, hanya berbeda di
karakter paling awal).
Huruf_Besar_Di_Awal_Kata_Dengan_Garis_Bawah.
Pada beberapa pustaka juga digunakan frase awalan pendek
untuk mengelompokkan beberapa fungsi atau variabel yang
berelasi atau berasal dari satu induk. Misalnya pada fungsi
[Link](), 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:
Atribut dan method name bersifat pre-fixed dengan objek,
Function name selalu diawali dengan module name.
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:
[Link](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.
Yang perlu diperhatikan dalam penamaan
Nama yang dihindari
Hindari karakter l (huruf L kecil), O (huruf O besar) atau I (huruf I
besar) sebagai nama variabel 1 karakter karena mereka sulit
dibedakan dengan angka satu dan nol. Saat Anda ingin
menggunakan l (huruf l kecil), akan sangat membantu jika Anda
menggunakan L besar.
ASCII
Identifiers yang digunakan pada library standar harus ASCII-
Compatible - lihat PEP 3131.
Nama Paket dan Nama Modul
Nama Modul sebaiknya pendek/singkat, menggunakan huruf kecil
dan opsional garis bawah (_) untuk meningkatkan keterbacaan.
Nama Paket menggunakan huruf kecil dan hindari garis bawah(_).
Jika sebuah modul yang ditulis dengan C/C++ menyediakan
Interface, maka modul C/C++ tersebut ditulis dengan diawali garis
bawah (misalnya _socket).
Nama Kelas
Gunakan CamelCase atau CapWords convention. Pastikan semua
akronim (misal HTTP) ditulis keseluruhan dengan huruf besar.
Penulisan Tipe Variable
Umumnya menggunakan CamelCase atau CapWords, lebih pendek
lebih baik:
1. T, AnyStr, Num
Jika terdapat covariant atau contravariant dari sebuah variabel,
tambahkan di akhir variabel untuk mempermudah pembacaan.
1. from typing import TypeVar
2. VT_co = TypeVar('VT_co', covariant=True)
3. KT_contra = TypeVar('KT_contra', contravariant=True)
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.
Nama Variabel Global
Nama Variabel Global mengikuti fungsi/modul yang bersifat publik.
Anda bisa menggunakan garis bawah untuk menghindari variabel
tersebut di-import jika ia merupakan modul non-publik.
Nama Fungsi, Parameter, dan Variabel
Nama fungsi, parameter, dan variabel sebaiknya menggunakan
huruf kecil, dengan pemisahan menggunakan garis bawah untuk
meningkatkan keterbacaan. mixedCase dapat digunakan jika ada
dependensi dengan pustaka dengan style tertentu.
Instansiasi Fungsi dan Method
Gunakan self sebagai argument pertama instansiasi method.
Gunakan cls sebagai argumen pertama pada class methods.
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.
Nama Method dan Nama Variabel dalam Method
Gunakan standar penamaan Fungsi: huruf kecil dengan pemisah
kata garis bawah untuk meningkatkan keterbacaan. Tambahkan
garis bawah sebagai awalan untuk method non-publik dan variabel
internal pada fungsi.
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.
Selalu Persiapkan untuk Inheritance
Saat sebuah metode dan variabel dalam sebuah kelas
didefinisikan, sebaiknya Anda dapat langsung mengetahui atribut
pada metode dan variabel tersebut, apakah publik atau non-
publik. Jika Anda ragu, jadikan atributnya non-publik. Karena lebih
mudah menjadikan sebuah variabel/method bersifat non-
publik menjadi publik, dibandingkan sebaliknya.
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.
Saat mendeklarasikan variabel/method tersebut, ikuti panduan
Pythonic berikut:
Atribut publik tidak menggunakan awalan garis bawah.
Jika nama sebuah Method/Variabel publik sama dengan
reserved keyword, tambahkan akhiran garis bawah. Hindari
menyingkat atau mengurangi huruf.
Pada Data publik bersifat simple, hindari nama yang terlalu
panjang. Cukup dengan nama atribut sependek mungkin.
Ingatlah bahwa di masa depan Anda akan mungkin
mengembangkan skema atau data ini, sehingga nama
sependek mungkin akan menguntungkan Anda.
Jika Anda berniat untuk mewariskan atau membuat subclass
dari kelas, dan menginginkan sebuah variabel hanya
digunakan di kelas utama saja, tambahkan awalan dua garis
bawah. Ini akan memudahkan Anda karena Python
mengenalinya sebagai konvensi kelas, menghindari
kemungkinan kesamaan nama atau implementasi.
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 [Link] atau modul
__init__ yang mengekspos fungsionalitas dari submodul.
Percabangan dan Ternary Operators
Beberapa contoh aplikasi dasar untuk pengenalan percabangan
yang sering digunakan adalah:
Genap atau Ganjil.
Positif atau Negatif.
Positif, Negatif, atau Nol.
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:
Cetak ini jika benar
10
Anda dapat menyingkat penulisan statement yang akan dieksekusi
jika ia terwakili dalam 1 baris. Misalnya:
1. if kerelengku: hitung()
Else
Statement Else dapat dikombinasikan dengan IF Statement,
sebagai jalan keluar saat kondisi / hasil evaluasi bernilai False. Else
bersifat opsional dan tunggal. Mari kita implementasikan dalam
kasus pengecekan tinggi badan pengunjung di suatu wahana.
1. tinggi_badan = int(input("Masukkan tinggi badan Anda : "))
2. if tinggi_badan>=160:
3. print ("Silakan, Anda boleh masuk")
4. else:
5. print ("Maaf, Anda belum boleh masuk")
Output 1:
Masukkan tinggi badan Anda : 160
Silakan, Anda boleh masuk
Output 2:
Masukkan tinggi badan Anda : 140
Maaf, Anda belum boleh masuk
Mari implementasikan pada kasus yang berbeda, kali ini kasusnya
adalah pengecekan bilangan ganjil atau genap pada suatu variabel.
1. bilangan = 4
2. if bilangan % 2 == 0:
3. print('Bilangan {} adalah genap'.format(bilangan))
4. else:
5. print('Bilangan {} adalah ganjil'.format(bilangan))
Output:
Bilangan 4 adalah genap
Elif - Alternatif untuk Switch/Case dan IF
bertingkat di python
Elif adalah kependekan dari else if, dan merupakan alternatif
untuk if bertingkat atau switch/case di beberapa bahasa
pemrograman lain. Sebuah IF Statement dapat diikuti satu atau
lebih statement elif (opsional & tidak dibatasi). Mari kita
implementasikan pada kasus penilaian tugas siswa.
1. nilai = int(input("Masukkan nilai tugas Anda : "))
2. if nilai>80:
3. print("Selamat! Anda mendapat nilai A")
4. print("Pertahankan!")
5. elif nilai>70:
6. print("Hore! Anda mendapat nilai B")
7. print("Tingkatkan!")
8. elif nilai>60:
9. print("Hmm.. Anda mendapat nilai C")
10. print("Ayo semangat!")
11. else:
12. print("Waduh, Anda mendapat nilai D")
13. print("Yuk belajar lebih giat lagi!")
Output 1:
Masukkan nilai tugas Anda : 85
Selamat! Anda mendapat nilai A
Pertahankan!
Output 2:
Masukkan nilai tugas Anda : 75
Hore! Anda mendapat nilai B
Tingkatkan!
Output 3:
Masukkan nilai tugas Anda : 65
Hmm.. Anda mendapat nilai C
Ayo semangat!
Output 4:
Masukkan nilai tugas Anda : 30
Waduh, Anda mendapat nilai D
Yuk belajar lebih giat lagi!
Catatan: Jika sudah memenuhi salah satu kondisi if/elif, maka
program akan keluar dari blok IF Statement. Anda harus
memastikan urutan secara logika, IF, Elif, dan Else dalam tingkatan
yang tepat. Contoh yang perlu diperhatikan adalah sebagai
berikut:
Input Nilai #Kasus 1 #Kasus 2
if nilai>80: if nilai>0:
print("Selamat! Anda mendapat nilai A") print("Selamat! Anda mendapat nilai A")
print("Pertahankan!") print("Pertahankan!")
elif nilai>70: elif nilai<80:
print("Hore! Anda mendapat nilai B") print("Hore! Anda mendapat nilai B")
print("Tingkatkan!") print("Tingkatkan!")
elif nilai>60: elif nilai<70:
print("Hmm.. Anda mendapat nilai C") print("Hmm.. Anda mendapat nilai C")
print("Ayo semangat!") print("Ayo semangat!")
else: else:
print("Waduh, Anda mendapat nilai D") print("Waduh, Anda mendapat nilai D")
print("Yuk belajar lebih giat lagi!") print("Yuk belajar lebih giat lagi!")
85 Masukkan nilai tugas Anda: 85 Masukkan nilai tugas Anda: 85
Selamat! Anda mendapat nilai A Selamat! Anda mendapat nilai A
Pertahankan! Pertahankan!
65 Masukkan nilai tugas Anda: 65 Masukkan nilai tugas Anda: 65
Hmm.. Anda mendapat nilai C Selamat! Anda mendapat nilai A
Ayo semangat! Pertahankan!
30 Masukkan nilai tugas Anda: 30 Masukkan nilai tugas Anda: 30
Waduh, Anda mendapat nilai D Selamat! Anda mendapat nilai A
Yuk belajar lebih giat lagi! Pertahankan!
Pada #Case 2, elif dan else tidak pernah dijalankan karena nilai
berapapun (yang bernilai positif) akan selalu masuk pada IF (klausa
pertama).
Mari kita implementasikan pada kasus pengecekan bilangan
positif, negatif, atau nol.
1. bilangan = -3
2. if bilangan > 0:
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:
Bilangan -3 adalah negatif
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.
Perbandingan klausa IF dengan ternary Operators:
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:
Tidak ada data
Perulangan
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.
1. for huruf in 'Dicoding': # Contoh pertama
2. print('Huruf: {}'.format(huruf))
3.
4. flowers = ['mawar', 'melati', 'anggrek']
5. for flower in flowers: # Contoh kedua
6. print('Flower: {}'.format(flower))
Output:
Huruf : D
Huruf : i
Huruf : c
Huruf : o
Huruf : d
Huruf : i
Huruf : n
Huruf : g
Flower: mawar
Flower: melati
Flower: anggrek
Anda juga dapat melakukan perulangan berdasarkan indeks atau
range dengan memanfaatkan fungsi len():
1. flowers = ['mawar', 'melati', 'anggrek']
2. for index in range(len(flowers)):
3. print('Flowers: {}'.format(flowers[index]))
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.
Tip: Python tidak memiliki do.. while statement
Seperti for dan semua statement percabangan, blok statement
yang mengikuti kondisi while dan memiliki posisi indentasi yang
sama, dianggap blok statement yang akan dieksekusi.
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.
1. while (var1): do_something()
Perulangan Bertingkat
Ada kalanya Anda perlu untuk melakukan perulangan bertingkat,
misalnya untuk menghasilkan contoh print-out berikut:
******
*****
****
***
**
*
Anda dapat melakukannya dengan kode berikut:
1. for i in range(0, 6):
2. for j in range(0, 6 - i):
3. print('*', end='')
4. print()
Tip: Tambahkan parameter end pada print untuk mengatur
karakter yang mengakhiri pencetakan string/teks Anda. Secara
default, karakter end ini adalah newline ('\n').
Penanganan Kesalahan (Error dan Exception
Handling)
Ada setidaknya dua jenis kesalahan berdasarkan kejadiannya:
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, di mana
setelah kondisi dari perintah while diharuskan ada tanda titik dua
(:).
1. while True print('Hello world')
2. File "<stdin>", line 1
3. while True print('Hello world')
4. ^
5. SyntaxError: invalid syntax
Pada kesalahan sintaksis, baris di mana kesalahan terdeteksi
dimunculkan kembali, kemudian terdapat tanda panah yang
menunjukkan titik paling awal dari kesalahan.
Kedua contoh di atas memiliki kelompok (tipe) kesalahan yang
berbeda, yang pertama adalah IndentationError dan yang kedua
adalah SyntaxError. Kemudian setelah penyebutannya, ada pesan
detail kesalahan (keterangan), misalnya indentasi yang tidak
diharapkan (unexpected).
Jika Anda menggunakan mode pemanggilan skrip, nama file skrip
dan nomor baris di mana terjadi kesalahan akan dimunculkan.
Sedangkan untuk mode interaktif pada dua contoh di atas, nama
file muncul sebagai “<stdin>”. Berikut adalah contoh pada
pemanggilan skrip bernama contoh_salah_sintaksis.py di mana
terjadi kesalahan pada baris 2.
1. python contoh_salah_sintaksis.py
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 di mana kesalahan terjadi.
Untuk mengetahui berbagai jenis pengecualian bawaan dari
Python, bisa kunjungi situs
dokumentasi [Link]
ml.
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([Link]())
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.
1. >>> d = {'ratarata': '10.0'}
2. >>> try:
3. ... print('rata-rata: {}'.format(d['rata_rata']))
4. ... except KeyError:
5. ... print('kunci tidak ditemukan di dictionary')
6. ... except ValueError:
7. ... print('nilai tidak sesuai')
8. ...
9. kunci tidak ditemukan di dictionary
10. >>> try:
11. ... print('rata-rata: {}'.format(d['ratarata']/3))
12. ... except KeyError:
13. ... print('kunci tidak ditemukan di dictionary')
14. ... except (ValueError, TypeError):
15. ... print('nilai atau tipe tidak sesuai')
16. ...
17. nilai atau tipe tidak sesuai
18. >>> try:
19. ... print('pembulatan rata-rata: {}'.format(int(d['ratarata'])))
20. ... except (ValueError, TypeError) as e:
21. ... print('penangan kesalahan: {}'.format(e))
22. ...
23. penangan kesalahan: invalid literal for int() with base 10: '10.0'
Pada contoh tersebut, yang paling awal terjadi pengecualian untuk
tipe kesalahan KeyError karena dalam dictionary d tidak memiliki
kunci (key) rata_rata, yang ada adalah kunci ratarata.
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.
1. >>> d = {'ratarata': '10.0'}
2. >>> if 'total' not in d:
3. ... raise KeyError('harus memiliki total')
4. ...
5. Traceback (most recent call last):
6. File "<stdin>", line 2, in <module>
7. KeyError: 'harus memiliki total'
Fungsi - Definisi, Memanggil, dan
Mengembalikan Fungsi
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 ().
1. def nama_fungsi( parameter )
Secara opsional, Anda dapat menambahkan docstring - string
dokumentasi yang menjelaskan konteks fungsi. Blok kode dalam
setiap fungsi dimulai dengan titik dua dan menggunakan indentasi.
Fungsi berhenti ketika terdapat statement return [expression]
yang mengembalikan [expression] kepada pemanggilnya. Anda
juga bisa membuat fungsi tidak mengembalikan keluaran dengan
return None.
Sintaksis fungsi secara lengkap pada Python:
1. def nama_fungsi( parameter ):
2. "dokumentasi fungsi"
3. statemen atau kode fungsi
4. return [expression]
Secara default, Python akan memposisikan setiap parameter
sesuai dengan urutan pendaftaran pada saat didefinisikan, dan
harus dipanggil sesuai dengan urutan tersebut. Contoh: fungsi
berikut akan menerima sebuah string sebagai parameter dan
mencetaknya.
1. def cetak( param1 ):
2. print(param1)
3. return
Sintaksis return tanpa ekspresi atau return None dapat juga tidak
dituliskan. Fungsi di atas akan sama seperti di bawah ini.
1. def cetak( param1 ):
2. print(param1)
Memanggil Fungsi
Mendefinisikan sebuah fungsi hanya memberikan namanya,
menentukan parameter yang ingin menjadi bagian dari fungsi dan
struktur dasar kode tersebut. Setelah struktur dasar terpenuhi,
Anda dapat memanggilnya pada fungsi yang lain atau dari Python
prompt. Contoh berikut untuk memanggil fungsi printme().
1. def cetak( param1 ):
2. print(param1)
3. return
4.
5. #panggil
6. cetak("Panggilan Pertama")
7. cetak("Panggilan Kedua")
Saat kode diatas dijalankan, akan menghasilkan keluaran berikut:
Output:
Panggilan Pertama
Panggilan Kedua
Return
Pernyataan return [expression] akan membuat eksekusi program
keluar dari fungsi saat itu, sekaligus mengembalikan nilai tertentu.
Nilai return yang tidak mengembalikan (ekspresi) nilai bersifat
sama dengan contoh di bawah ini.
1. return None
Contoh fungsi dengan return:
1. def kali(angka1, angka2):
2. # Kalikan kedua parameter
3. hasil = angka1 * angka2
4. print('Dicetak dari dalam fungsi: {}'.format(hasil))
5. return hasil
6.
7. # Panggil fungsi kali
8. keluaran = kali(10, 20);
9. print('Dicetak sebagai kembalian: {}'.format(keluaran))
Saat dipanggil:
Dicetak dari dalam fungsi: 200
Dicetak sebagai kembalian: 200
Nilai kembalian dari sebuah fungsi dapat disimpan dalam sebuah
variabel. Ini yang akan membedakan sebuah fungsi yang
mengembalikan nilai dengan sebuah fungsi yang tidak
mengembalikan nilai (sering disebut sebagai prosedur). Cobalah
kode berikut ini:
1. def kuadrat(x):
2. return x*x
3. a = 10
4. k = kuadrat(a)
5. print('nilai kuadrat dari {} adalah {}'.format(a, k))
Pass by reference vs value
Seluruh parameter (argumen) pada bahasa Python bersifat
“passed by reference”. Artinya saat Anda mengubah sebuah
variabel, maka data yang mereferensi padanya juga akan berubah,
baik di dalam fungsi, maupun di luar fungsi pemanggil. Kecuali
jika anda melakukan operasi assignment yang akan
mengubah reference parameter.
Contohnya:
1. def 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:
Nilai di dalam fungsi: [10, 20, 30, [1, 2, 3, 4]]
Nilai di luar fungsi: [10, 20, 30, [1, 2, 3, 4]]
Namun Anda harus berhati-hati karena assignment variabel
bernama sama dengan parameter, berarti membuat variabel baru
dalam scope lokal dan tidak terkait dengan variabel global.
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:
Nilai di dalam fungsi: [1, 2, 3, 4]
Nilai di luar fungsi: [10, 20, 30]
Tips: Untuk perubahan parameter sangat disarankan
menggunakan keluaran fungsi
Argumen dan Parameter Fungsi
Apa perbedaan Argumen dan Parameter fungsi? Menurut FAQ
Programming di dokumentasi Python, adalah sebagai berikut:
Parameters are defined by the names that appear in a function
definition, whereas arguments are the values actually passed to a
function when calling it. Parameters define what types of
arguments a function can accept. For example, given the function
definition:
Jadi parameter adalah definisi masukan yang diterima fungsi, dan
argumen adalah hal yang Anda masukkan saat memanggil fungsi
tersebut.
Contohnya, saat Anda membuat fungsi seperti berikut
1. def fungsi_saya (a, b, c):
2. #lakukansesuatudenganabc
maka a,b,c adalah parameter. Namun saat Anda memanggilnya
1. fungsi_saya (1, b=14, c='Dicoding')
maka 1, 14, dan 'Dicoding' adalah argumen.
Fungsi - Argumen dan Parameter
Argumen yang dapat dikirimkan pada fungsi
Sebagai nilai yang akan dimasukkan pada saat fungsi dipanggil, ada dua jenis argumen:
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
1. daftar(tanggal=1, bulan='Januari', tahun=2020)
2. daftar(**{'tanggal': 1, 'bulan': 'Januari', 'tahun'=2020})
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.
Susunan/Urutan Parameter Fungsi
Terdapat 5 kemungkinan susunan/urutan parameter fungsi menurut dokumentasi
Python:
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:
1. def printinfo(*args, **kwargs):
2. for a in args:
3. print('argumen posisi {}'.format(a))
4. for key, value in [Link]():
5. print('argumen kata kunci {}:{}'.format(key, value))
6.
7.
8. # Panggil printinfo
9. printinfo()
10. printinfo(1, 2, 3)
11. printinfo(i=7, j=8, k=9)
12. printinfo(1, 2, j=8, k=9)
13. printinfo(*(2, 3), **{'i':7, 'j':8})
Output:
# printinfo() --> kosong
argumen posisi 1
argumen posisi 2
argumen posisi 3
argumen kata kunci i:7
argumen kata kunci j:8
argumen kata kunci k:9
argumen posisi 1
argumen posisi 2
argumen kata kunci j:8
argumen kata kunci k:9
argumen posisi 2
argumen posisi 3
argumen kata kunci i:7
argumen kata kunci j:8
Fungsi Anonim
Fungsi Anonim (anonymous) tidak dideklarasikan seperti halnya fungsi pada umumnya
dengan kata kunci def, melainkan menggunakan kata kunci (keyword) lambda. Sebuah
fungsi lambda dapat menerima argumen dalam jumlah berapa pun, namun hanya
mengembalikan satu nilai expression. Fungsi Lambda tidak dapat memuat perintah atau
ekspresi lainnya, misalnya tidak bisa melakukan print.
Fungsi lambda bersifat mandiri, memiliki namespace-nya sendiri, dan tidak dapat
mengakses nilai apapun selain yang berada dalam parameter list dan variabel global.
Meskipun mirip, Lambda tidak dapat disamakan dengan inline statement pada bahasa
C/C++.
Sintaks:
1. lambda [arg1 [,arg2,.....argn]]:expression
Contoh penggunaannya jika kita bandingkan dengan fungsi kali yang berada di modul
sebelumnya
1. kali = lambda nilai1, nilai2: nilai1 * nilai2;
2. print ("Hasil : ", kali( 11, 21 ))
3. print ("Hasil : ", kali( 2, 2 ))
Hasilnya
Hasil : 231
Hasil : 4
Menulis Method dan Kelas pada Python
Module Python adalah berkas teks berekstensi .py yang berisikan
kode Python. Anda dapat mereferensi berkas .py apa pun sebagai
modul. Modul-modul umum yang disediakan oleh Python
Standard Library dan mungkin sudah terinstal secara default pada
instalasi Python Anda. PIP juga dapat dimanfaatkan untuk
menginstal modul atau library berikut dengan dependensi yang
dibutuhkannya. Anda pun dapat membuat dan menghasilkan
modul Python Anda sendiri.
Menulis Modul
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 [Link] yang akan kita panggil di berkas lain.
[Link]
1. # Define a function
2. def world():
3. print("Hello, World!")
Jika [Link] 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 [Link] yang seolah mengimpor [Link]. Pastikan
[Link] dan [Link] berada dalam satu direktori agar dapat
diimpor dan dipanggil.
[Link]
1. #impor
2. import hello
3.
4. #panggil
5. [Link]()
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
[Link], maka cukup kita tulis import hello, dan saat
memanggilnya dengan [Link](). Selain itu, kita juga dapat
menggunakan from ... import ..., dalam hal ini adalah from hello
import world dan memanggil fungsinya langsung yakni world().
Sekarang, saat memanggil [Link], maka akan menghasilkan:
Hello, World!
Menambahkan variabel
Menambahkan variabel pada modul hello, tambahkan variabel
nama, misalnya Dicoding.
[Link]
1. def world():
2. print("Hello, World!")
3.
4. nama = "Dicoding"
Berikutnya, kita coba cetak variabel nama.
[Link]
1. #impor
2. import hello
3.
4. #panggil
5. [Link]()
6.
7. #cetak
8. print([Link])
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.
[Link]
1. def world():
2. print("Hello, World!")
3.
4. nama = "Dicoding"
5.
6. class Reviewer:
7. def __init__(self, nama, kelas):
8. [Link] = nama
9. [Link] = kelas
10.
11. def review(self):
12. print("Reviewer " + [Link] + " bertanggung jawab di kelas " + [Link])
Tambahkan kelas pada [Link].
[Link]
1. #impor
2. import hello
3.
4. #panggil
5. [Link]()
6.
7. #cetak
8. print([Link])
9.
10. #review
11. diko = [Link]("Diko", "Python")
12. [Link]()
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 [Link] atau [Link]
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 ([Link]) 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
[Link] seperti berikut:
[Link]
1. # Definisi
2. def world():
3. print("Hello, World!")
4.
5. # Panggil disini
6. world()
Kemudian bersihkan [Link] hingga menyisakan import hello2
saja.
[Link]
1. import hello2
Saat main_program dijalankan, langsung muncul:
Hello, World!
Sehingga modul dapat digunakan dengan berbagai metode
pemanggilan, bergantung pada definisi, maupun implementasi.
Mengakses Modul dari Folder Lain
Jika Anda bekerja dengan beberapa proyek secara paralel, berikut
adalah opsi untuk mengakses modul dari folder lain:
Menambahkan path folder
Opsi ini dipilih umumnya di tahap awal pengembangan, sebagai
solusi temporer. Untuk mengetahui path pemanggilan utama,
Anda perlu bantuan dari modul sys yang sudah tersedia. Impor
modul sys di main program dan gunakan fungsi [Link].
Misalnya berkas [Link] kita berada di direktori /home/dicoding/
dan [Link] di direktori lainnya. Anda cukup menambahkan
path /home/dicoding pada [Link] seperti di bawah:
1. import sys
2. [Link]('/home/dicoding')
3.
4. import hello
5. …
Menambahkan modul pada Python Path
Alternatif ini dapat dipilih saat Anda melakukan pemanggilan
modul >1x. Pada intinya pilihan ini akan menambahkan modul
yang Anda buat pada Path yang diperiksa oleh Python sebagai
modul dan paket-paket bawaan. Anda dapat memanfaatkan
[Link] kembali untuk mengetahui posisi Anda saat ini.
1. print([Link])
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 [Link] pada direktori di atas. Maka Ia akan dikenali
sebagai sebuah modul yang dapat diimpor oleh siapa saja dalam
environment tersebut.
Pada main_program.py cukup impor.
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.
Pengenalan Pemrograman Berorientasi Objek (OOP)
dengan Python - Class, Objek, dan Method
Kelas atau dalam bahasa Inggris disebut class, merupakan sebuah konsep
yang menyediakan sarana untuk menyatukan data dan fungsionalitas secara
satu kesatuan. Membuat sebuah kelas artinya membuat sebuah tipe baru,
kemudian dengan membuat instance dari kelas tersebut akan menghasilkan
objek baru dari tipe tersebut. Setiap objek (hasil instance dari kelas tersebut)
dapat memiliki atribut untuk mengelola status dari objek tersebut, juga dapat
memiliki metode untuk mengubah status atau informasinya.
Catatan:
Kata objek adalah terjemahan bahasa Inggris dari kata object.
Kata metode adalah terjemahan bahasa Inggris dari kata method.
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.
Sebuah kelas sendiri mendukung dua macam operasi:
1. Mengacu pada atribut.
2. Pembuatan instance atau dalam bahasa Inggris disebut instantiation.
Agar lebih jelas, kita akan membahas menggunakan contoh berikut.
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
Objek (object: an instance of a class)
Pembahasan berikutnya adalah instantiation dari sebuah class, menggunakan
notasi fungsi yaitu dengan kurung buka-kurung tutup, akan menghasilkan
sebuah objek. Kemudian hasil instantiation ini biasanya disimpan dalam
sebuah variabel dengan nama yang representatif.
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.
Untuk memanggil metode f dari objek k, hasil instance dari class
Kalkulator di atas sebagai berikut.
1. print(k.f()) # akan mencetak hello world ke layar
Kenapa metode adalah sebuah fungsi khusus?
Jika diperhatikan kembali fungsi f dalam definisi class Kalkulator memiliki
satu argumen bernama self, sedangkan dalam pemanggilan metode dari
objek k di atas tidak menggunakan argumen. Apabila f adalah fungsi biasa
pada Python tentu pemanggilan ini akan mengembalikan kesalahan (error).
Lebih detail mengenai konvensi ini akan dibahas pada bagian metode
dari class.
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: [Link]
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
Lanjut pembahasan constructor, dengan dilengkapi constructor pun
proses instantiation tidak berubah dari sebelumnya.
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'
Dengan contoh pemanggilan berikut.
1. k = Kalkulator(i=1024) # melakukan instantiation sekaligus mengisi atribut i jadi 1024
2. print(k.i) # mencetak atribut i dari objek k dengan keluaran nilai 1024
Metode (Method)
Pembahasan lebih detail mengenai metode, selain yang dibahas sebelumnya,
kita akan membahas 3 jenis metode:
1. Metode dari objek (object method)
2. Metode dari class (class method)
3. Metode secara static (static method)
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)
Argumen self pada metode f akan diisi dengan objek hasil instance dari class
Kalkulator.
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: [Link] .
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.
1. Kalkulator.tambah_angka(1, 2) # tanpa perlu memberikan masukan untuk argumen cls
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.
Berdasar contoh yang sama dengan class sebelumnya, berikut adalah metode
statis.
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.
Pemanggilan dari class seperti halnya pemanggilan fungsi biasa.
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)
Pengenalan Pemrograman Berorientasi Objek
(OOP) -Inheritance
Mekanisme Pewarisan (Inheritance)
Paradigma Pemrograman Berorientasi Objek memiliki konsep
pewarisan atau dalam bahasa Inggris disebut inheritance,
tentunya di Python mendukung fitur ini.
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: [Link]
tiple-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. [Link] = nilai
6.
7. def tambah_angka(self, angka1, angka2):
8. [Link] = angka1 + angka2
9. if [Link] > 9: # kalkulator sederhana hanya memroses sampai 9
10. print('kalkulator sederhana melebihi batas angka: {}'.format([Link]))
11. return [Link]
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.
Dari situ, kita membuat class KalkulatorKali yang mewarisi class
Kalkulator.
1. class KalkulatorKali(Kalkulator):
2. """contoh mewarisi kelas kalkulator sederhana"""
3.
4. def kali_angka(self, angka1, angka2):
5. [Link] = angka1 * angka2
6. return [Link]
Dengan pemanggilan class KalkulatorKali sebagai berikut.
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).
Menimpa (Override) Metode dengan Nama yang Sama Dengan
Kelas Dasar
Anda melihat bahwa kalkulator yang anda operasikan
mendapatkan peringatan melebihi batas angka yang bisa
diproses? Lalu bagaimana kalau Anda ingin mengubah
keterbatasan itu? Meski dalam contoh ini anggap tetap tidak boleh
mengubah class Kalkulator yang sudah ada.
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. [Link] = angka1 * angka2
6. return [Link]
7.
8. def tambah_angka(self, angka1, angka2):
9. [Link] = angka1 + angka2
10. return [Link]
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)
Pemanggilan Metode Kelas Dasar dari Kelas Turunan dengan
Sintaksis Super
Anggaplah fungsi tambah_angka adalah sebuah fungsi yang rumit,
dimana kita sebaiknya gunakan saja kemampuan yang sudah ada
di kelas dasar, kemudian kita hanya ubah sebagian fiturnya saja
dengan yang kita inginkan.
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. [Link] = angka1 + angka2
9. return [Link]
Variabel Privat di Python
Jika Anda sebelumnya pernah belajar bahasa pemrograman yang
memiliki variabel privat, dimana variabel tersebut tidak dapat
diakses kecuali dari objek yang bersangkutan, di Python hal
tersebut tidak ada.
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.
Pernak-Pernik Terkait Struktur Data
Buat Anda yang pernah membuat program dengan menggunakan
bahasa pemrograman C atau Pascal, Anda mungkin tertarik untuk
membuat sebuah struktur data seperti halnya struct pada C
atau record pada Pascal, bertujuan menyatukan sejumlah
penamaan item data menjadi satu.
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. [Link] = 'Don Doo'
8. [Link] = 'IT'
9. [Link] = 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.
Sebagai sebuah framework pengujian, unittest mendukung
beberapa hal esensial sebagai berikut:
Pengujian secara otomatis
Kode awal proses (setup) dan akhir proses (shutdown) yang
dapat digunakan ulang
Penyatuan sejumlah pengujian dalam sebuah koleksi
Terpisahnya framework pengujian dari framework pelaporan
(reporting)
Library unittest mendukung sejumlah konsep penting yang
berorientasi objek, antara lain:
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.
Contoh Unit Test di Python
Tulis kode ini pada IDE PyCharm atau simpan kode ini dalam
format .py dan jalankan pada Command Prompt di perangkat Anda.
1. import unittest
2.
3. class TestStringMethods([Link]):
4.
5. def test_strip(self):
6. [Link]('[Link]'.strip('[Link]'), 'dicoding')
7.
8. def test_isalnum(self):
9. [Link]('c0d1ng'.isalnum())
10. [Link]('c0d!ng'.isalnum())
11.
12. def test_index(self):
13. s = 'dicoding'
14. [Link]([Link]('coding'), 2)
15. # cek [Link] gagal ketika tidak ditemukan
16. with [Link](ValueError):
17. [Link]('decode')
18.
19. if __name__ == '__main__':
20. [Link]()
Jalankan program di atas. Hasil keluarannya seperti berikut.
Mari kita bahas satu per satu dari kode di atas.
Kelas TestStringMethods merupakan sebuah kelas yang
merupakan turunan (subclass) dari class [Link],
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 '[Link]'.strip('[Link]') 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 [Link]() 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. [Link]('c0d1ng'.isalnum()) # ini akan berhasil
3. [Link]('c0d!ng'.isalnum()) # ini akan gagal
Kemudian jalankan kembali program Anda. Keluarannya akan
seperti berikut:
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 [Link]('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. [Link] = username
13. def set_aktif(self):
14. [Link] = True
15.
16. class TestUser([Link]):
17. def test_user_default_not_active(self):
18. db = koneksi_ke_db()
19. dicoding = User(db, 'dicoding')
20. [Link]([Link]) # 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. [Link]([Link])
28. putus_koneksi_db(db)
29.
30. if __name__ == '__main__':
31. [Link]()
Sama seperti sebelumnya, kita akan membuat
sebuah class TestUser yang merupakan turunan
dari class [Link], 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([Link]):
2. def setUp(self):
3. [Link] = koneksi_ke_db()
4. [Link] = User([Link], 'dicoding')
5.
6. def tearDown(self):
7. putus_koneksi_db([Link])
8.
9. def test_user_default_not_active(self):
10. [Link]([Link]) # tidak aktif secara default
11.
12. def test_user_is_active(self):
13. [Link].set_aktif() # aktifkan user baru
14. [Link]([Link])
Kemudian jalankan kembali program Anda. Hasil keluarannya
seperti berikut.
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).
Library Populer pada Python
Kali ini kita akan membahas Modul dan Library yang sering
digunakan pada Python. Artikel ini akan terus di-update sesuai
dengan perkembangan dan jika diperlukan akan ditambah. Modul
yang sering dipakai secara umum dalam scripting sehari-hari
antara lain:
String
Dokumentasi: [Link] .
String merupakan salah satu modul bawaan Python yang tidak
perlu dideklarasikan. Modul yang sudah bawaan dari Python
disebut modul built-in
([Link] ). 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.
upper(): Ubah setiap huruf dalam string menjadi huruf
kapital.
lower(): Ubah setiap huruf dalam string menjadi huruf kecil.
split(): Pisahkan teks berdasarkan delimiter(karakter
pemisah).
title(): Jadikan setiap awal kata kapital.
zfill(): Tambahkan nol di awal string sebanyak nilai yang ada
pada parameter.
Contoh implementasi kode di atas pada Notebook IBM Watson
Studio sebagai berikut:
OS
Dokumentasi: [Link]
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 [Link](). 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([Link]())
File Input/Output
Dokumentasi: [Link]
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.
1. string = raw_input("Masukkan sesuatu: ")
2. print "Input yang masuk adalah : ", string
Pickle
Dokumentasi: [Link] .
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("[Link]","wb")
4. [Link](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("[Link]","rb")
2. contoh_dictionary = [Link](pickle_masuk)
JSON
Dokumentasi: [Link] .
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 = [Link](x)
10.
11. print(y["umur"])
Scrapper
Dokumentasi
urllib: [Link] .
Dokumentasi
beautifulsoup4: [Link]
Soup/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 [Link] menampilkan isi dari tag title
dari situs tersebut.
1. url = "[Link]
2. page = urlopen(url)
3. html = [Link]().decode("utf-8")
4. start_index = [Link]("<title>") + len("<title>")
5. end_index = [Link]("</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 = "[Link]
2. page = urlopen(url)
3. html = [Link]().decode("utf-8")
4. soup = BeautifulSoup(html, "[Link]")
5. [Link]
Regex
Dokumentasi: [Link] .
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= [Link](pola, string_tes)
6.
7. if hasil:
8. print("Pencarian berhasil.")
9. else:
10. print("Pencarian gagal.")
Argument Parser
Dokumentasi
Getopt: [Link] .
Dokumentasi
ArgParse: [Link] .
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 [Link] -o
Contoh dengan menggunakan ArgParse untuk menambahkan
Argument yang bersifat opsional / tidak wajib:
file: [Link]
1. import argparse
2.
3. parser = [Link]()
4. parser.add_argument('-o', '--output', action='store_true', help="tampilkan output")
5. args = parser.parse_args()
6.
7. if [Link]:
8. print("Halo, ini merupakan sebuah output dari [Link]")
Maka pada saat dijalankan, terdapat beberapa hal yaitu:
Berkas [Link] dapat menerima parameter -o
atau --output.
Jika kita memanggil berkas tanpa parameter -o maka berkas
tidak akan menampilkan apapun.
Jika kita memanggil dengan -o atau --output maka berkas
akan menampilkan Halo, ini merupakan sebuah output
dari [Link].
Jika kita memanggil --help, maka akan tampil help dengan
penjelasan "tampilkan output".
Kita juga bisa membuat argumennya bersifat wajib. Modifikasi
berkas [Link] menjadi seperti berikut:
1. import argparse
2.
3. parser = [Link]()
4. parser.add_argument('-n', '--nama', required=True, help="Masukkan Nama Anda")
5. args = parser.parse_args()
6.
7. print("Terima kasih telah menggunakan [Link], "+[Link])
Maka pada saat dijalankan, terdapat beberapa hal yaitu:
Berkas [Link] harus dipanggil dengan parameter
-n atau --nama.
Jika kita memanggil berkas tanpa parameter -n maka berkas
akan meminta parameter n atau nama.
Jika kita memanggil dengan -n NAMAKITA atau --nama
NAMAKITA maka berkas akan menampilkan Terima kasih
telah menggunakan [Link] NAMAKITA.
Jika kita memanggil --help, maka akan tampil help dengan
penjelasan "Masukkan Nama Anda".
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:
Berkas [Link] harus dipanggil dengan parameter
n/nama dan t/tanggallahir.
Format Tanggal lahir adalah dd-mm-yyyy.
Jika kita memanggil berkas tanpa parameter maka berkas
akan menolak.
Jika usia pemanggil saat ini kurang dari 30 tahun, tambahkan
panggilan kakak, selain itu gunakan panggilan bapak
sebelum NAMAKITA.