Showing posts with label Python. Show all posts
Showing posts with label Python. Show all posts

Pemrograman Dengan Python

 

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:

http://docs.python.org/release/3.0.1/whatsnew/3.0.html.

Versi terbaru Python pada saat pembaruan modul ini adalah 3.8 yang dirilis pada 14 Oktober 2019. Pada saat tulisan ini dibuat, Python 3.9 sedang dikembangkan dan berstatus 3.9.0 alpha 1.


Sejarah / Overview

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 (https://www.python.org/dev/peps/pep-0020/)

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 (https://pypi.org/) 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).

Berikut tampilan saat Python versi 2 terinstal pada Ubuntu (18.04.1).
20201001110602b1601ef746c35b7a6b0411dcb72714f2.jpeg 

Semua contoh dan tutorial pada kelas ini akan menggunakan versi 3.7.3 atau lebih tinggi. Python versi terbaru dapat diakses di https://www.python.org/downloads/. Apabila pada komputer anda terinstal Python 2.x, Anda umumnya dapat menginstal versi 3.x secara berdampingan tanpa mengubah konfigurasi apapun. Untuk konfigurasi lanjut yang memungkinkan Anda menggunakan lebih dari satu versi python secara bergantian, silakan merujuk ke https://docs.python.org/id/3.8/library/venv.html.

Untuk meng-update atau menginstal, silakan mengikuti panduan berikut (Klik tab pada tabel untuk melihat tampilan di masing-masing sistem operasi).

Berikut langkah-langkah meng-update atau menginstal Python pada sistem operasi Windows:

  1. Unduh dari https://www.python.org/downloads/windows/, 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.
    2019071115534386560912d8f25626deddb1ad1b4b53bb.pngCatatan: sebaiknya klik disable path length limit untuk mengatasi problem path yang melebihi 255 karakter (nama folder yang terlalu panjang).

    20190711155322e8d2557faddad03bdf088d144187f24f.png


Link Penting

Apabila Anda mengalami kesulitan, silakan merujuk ke halaman https://docs.python.org/id/3.8/installing/index.html atau gunakan mesin pencarian untuk mencari solusi apabila Anda mengalami kendala dalam instalasi. Anda juga dapat memanfaatkan forum diskusi apabila diperlukan.

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): https://www.jetbrains.com/pycharm/
  2. Tampilan PyCharm pada Project Baru.20190711155735bbc74204f703637ec1e6aa24aa3a5c9c.png

  3.  Create new Python file.201907111558160d2f3134305280e404eb7bda8e6c4b4b.png
    201907111558434eeeac415e58795774ed8e2207b0d55f.png


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 https://jupyter.readthedocs.io/en/latest/install.html untuk lebih detailnya. Instalasi notebook ini tidak wajib. Anda juga dapat menggunakan notebook yang bersifat gratis misalnya IBM Watson Studio dan Google Colab.


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. 

20201001073550138c60af16cfaa00c0abb7f22f574173.png


Google Colab

Untuk mulai menggunakan Google Colab, Anda dapat langsung mengunjungi tautan berikut: https://colab.research.google.com/notebooks/

20190711160119101b2208a6498665e731f61ffad5f0bf

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.
    202010011500209c3aec171933ac0bdfda4825ea7ca101.jpeg

  2. Setelah akun Anda jadi, login ke IBM cloud dengan mengunjungi tautan https://cloud.ibm.com/login. Isi kolom IBMid dengan email yang telah Anda daftarkan di tahap sebelumnya.
    202010011500414c91f207fbe7c96464a19df0498e39de.jpeg

  3. Berikut adalah tampilan ketika Anda telah login ke akun IBM Cloud.
    202010011502364dce28582a2538edee395390cf55bde9.jpeg

  4. Pada search bar ketiklah Object Storage lalu pilih item tersebut.
    20201001150302101040b4f3c6b22da8e792949fcc1d50.jpeg

  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.
    20201001150324f9dc0a9b492941f094bc0acb5f746be2.jpeg

  6. Setelah memiliki akun IBM Cloud, kunjungi tautan berikut. Login ke Watson Studio menggunakan akun IBM Cloud Anda.
    2020100115034007c2c0386e07eb8e02f32ec981ea8e6a.jpeg

  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.
    2020100115040488c261a9413d357348eebbd16bab9952.jpeg

  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.
    20201001150415f923ab8e4049b85212ad186c611379f7.jpeg

  9. Pada laman Create a project pilih Create an empty project.
    20201001150559bde06469d284421abc43d8e606cfa2fc.jpeg

  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.
    202010011506081e556ef342c19fc3e20d44dd53b04668.jpeg

  11. Tampilan dari halaman project Anda terlihat seperti di bawah.
    202010011506203fd6fb291ac4e9f6d3f55ad8a1f81d4b.jpeg

  12. Untuk membuat Notebook pada Watson Studio klik tombol Add to Project lalu pilih Notebook.
    202010011506283621825eb515cb6af0b24f64f6d73bf0.jpeg

  13. Di halaman New notebook isi nama notebook yang Anda inginkan lalu klik Create.
    20201001150637ac0127498dcdb91958d614efa5f3cb0b.jpeg

  14. Sekarang Anda sudah bisa menulis kode python seperti Anda menulis kode di Jupyter Notebook.
    2020100115142694eb370c5c743822c7e1ebe7fa432a76.jpeg

  15. Untuk menyimpan pekerjaan Anda, klik tombol File dan pilih Save.
    202010011514283e6712578246221690fd02da1cfa97ea.jpeg

  16. Pekerjaan yang telah Anda simpan dapat Anda lihat pada menu Assets di bagian Notebooks.
    202010011514550bf916712da755999c0e7396b62a976d.jpeg

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.

201907120850148bceaf3a891f44d7cfefab1e019f9841.png
2019071208500281567b2bb14e81fa3db8269326f6fb2d.png

20190712085101a49144ac1995e5d41e6a7f4f350c28aa.png

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
    2019071208514336182f1efded11f3bf9f451f74862296.pngAnda dapat menggunakan python pada sesi interaktif ini menjadi kalkulator untuk perhitungan matematika.

  • InteractiveExample: Print
    2019071208515347e3b4314248d2fc18b0b6d9da4007ab.png
  • InteractiveExample:  import library dan mendapatkan Current working directory
    20190712085202482be2613ce81959dad5aababd92d001.png


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
    201907120853358c41a6f6c9512fcdd9389afe777c662b.png20190712085344bc132d754bf0637860710fceb53c3dd4.png
  • RunnableExample: Print
    2019071208540989bd976e3a742e00ba1e8abd681438ec.png20190712085430ea374c2a9eb5bd3345b87e8fbd541506.png
  • RunnableExample: import library dan mendapatkan Current working directory
    20190712085501b71369effa2c6f388c4125801acbeb50.png201907120855094a96a666bde8cb67ae82563add899387.png

  

Notebook

20190712085539674cdd262ac9b518587d38851d4721d2.png


Alternatif

Alternatif yang lain, Anda dapat menggunakan tools online untuk menjalankan kode-kode Python Anda. beberapa yang umum digunakan di industri antara lain IBM Watson Studio, Google Colab, glot.io, REPL.it, dan ideone.com.

Watson Studio

20201001133810c84e3b8ce227ce2b7cf50134060baace.jpeg


Glot.io

20190712085703d341614742c8eab31267068b217f8a8d.png


Repl.it

201907120857366758ce06b97549d36feaf38b923160fd.png


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 mypkg.sibling
  2. from mypkg import sibling
  3. from mypkg.sibling 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 foo.bar.yourclass import YourClass

Jika ada penamaan kelas yang sama, gunakan pemanggilan secara eksplisit:

  1. import myclass
  2. import foo.bar.yourclass

saat memanggil, gunakan "myclass.MyClass" dan "foo.bar.yourclass.YourClass".

  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[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
  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. 33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875


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[1:7:2] 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[1:7:2])

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. x.append(5)
  4. print(x)

Output:

[1, 2, 4, 5]


Untuk menghapus item pada list, gunakan fungsi del. Ingat bahwa Indeks Python dimulai dari 0:

  1. binatang = ['kucing', 'rusa', 'badak', 'gajah']
  2. del binatang[2]
  3. print(binatang)

Output:

['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:

https://docs.python.org/id/3.8/library/string.html#format-specification-mini-language


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: skrip.py).

Berkas ini dapat dipanggil sebagai skrip di konsol atau command prompt, serta dapat ditambahkan parameter tambahan saat memanggil skrip tersebut.

  1. $ python test.py 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 sys.argv yang memuat seluruh argumen yang diterima. Anda juga dapat menggunakan len(sys.argv) untuk mengetahui banyaknya argumen yang ditampung.

Contoh, sebuah berkas test.py yang akan menambahkan tiga argumen:

  1. import sys
  2. print('Jumlah arguments:', len(sys.argv), 'arguments.')
  3. print('Argument List:', str(sys.argv))
  4. print(sys.argv[1])

Jalankan pada konsol/terminal/command prompt:

  1. $ python test.py arg1 arg2 arg3

Output:

Jumlah arguments: 4 arguments.
Argument List: ['test.py', '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 484526544560, 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 = kata.upper()
  3. print(kata)

Output:

DICODING


lower()

Selanjutnya kita akan membahas lower(). Metode ini kebalikan dari upper() yang dapat mengonversi karakter atau string dari huruf besar ke huruf kecil. Namun jika huruf asalnya adalah huruf kecil, maka huruf tersebut tidak berubah.

  1. kata = DICODING
  2. kata = kata.lower()
  3. print(kata)

Output:

dicoding


Catatan: Jika terdapat karakter bukan huruf (seperti simbol atau angka) yang tidak memiliki opsi kapital, maka karakter tersebut tidak diubah.

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(kata.strip('Code'))

Output:

Dicoding


Ketika kita masukkan ‘Code’ sebagai parameter, maka setiap kata ‘Code’ akan terhapus di awal maupun di akhir.


startswith()

Metode startswith() akan mengembalikan nilai True jika string diawali dengan kata awalan tertentu yang kita inginkan, jika tidak maka akan mengembalikan nilai False.

  1. print('Dicoding Indonesia'.startswith('Dicoding'))

Output:

True

 

endswith()

Metode endswith() ini kebalikannya dari metode startswith(), metode ini akan mengembalikan nilai True jika string diakhiri dengan kata akhiran tertentu yang kita inginkan, jika tidak maka akan mengembalikan nilai False

  1. print('Dicoding Indonesia'.endswith('Indonesia'))

Output:

True


Dengan metode ini, Anda dapat melakukan perbandingan string berupa awal atau akhirannya saja, sehingga tidak perlu memisahkan string-nya dan menggunakan operator equal to (==).


Memisah dan Menggabung String

Kategori selanjutnya adalah memisah dan menggabung string. Dalam kategori ini terdapat beberapa metode yaitu join() untuk menggabungkan string dan split() untuk memisahkan string. Berikut uraian lengkap dari kedua metode tersebut.


join()

Metode join() adalah metode yang dipakai untuk menggabungkan sejumlah string. 

  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 whitespacetab, 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 cepat.', 'Senang 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(string.replace("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(string.replace("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. kata.isupper()

Output:

True


 Contoh yang akan mengembalikan nilai False:

  1. kata = Dicoding
  2. kata.isupper()

Output:

False


islower()

Metode islower()  adalah kebalikan dari metode isupper(), metode ini akan mengembalikan nilai True jika semua huruf dalam string adalah huruf kecil, dan akan mengembalikan nilai False jika terdapat satu saja huruf besar di dalam string tersebut.

Contoh yang akan mengembalikan nilai True:

  1. kata = dicoding
  2. kata.islower()

Output:

True


Contoh yang akan mengembalikan nilai False:

  1. kata = Dicoding
  2. kata.islower()

Output:

False


Bahkan Anda bisa melakukan operasi pada hasil operasinya (chain of method). Seperti contoh berikut:

Contoh:

  1. print('Dicoding'.upper().lower())
  2. print('Dicoding'.lower().upper())
  3. print('DICODING'.upper().lower().islower())
  4. print('DICODING'.upper().lower().isupper())

Output:

‘dicoding’

‘DICODING’

True

False


isalpha()

Metode ini akan mengembalikan nilai True jika semua karakter dalam string adalah huruf alfabet, jika tidak maka akan mengembalikan nilai False.

  1. dicoding’.isalpha()

Output :

True


isalnum() 

Metode ini akan mengembalikan nilai True jika karakter dalam string adalah alfanumerik yaitu hanya huruf atau hanya angka atau berisi keduanya, jika tidak maka akan mengembalikan nilai False.

  1. dicoding123’.isalnum()

Output :

True


isdecimal()

Metode ini akan mengembalikan nilai True jika karakter dalam string berisi hanya angka/numerik, jika tidak maka akan mengembalikan nilai False.

  1. 12345’.isdecimal()

Output :

True


isspace()

Metode ini akan mengembalikan nilai True jika string berisi hanya karakter whitespace, seperti spasi, tab, newline, atau karakter whitespaces lainnya, jika tidak maka akan mengembalikan nilai False.

  1.    ’.isspace()

Output :

True


istitle()

Metode ini akan mengembalikan True jika string berisi huruf kapital di setiap kata dan dilanjutkan dengan huruf kecil seterusnya, jika tidak maka akan mengembalikan nilai False.

  1. Dicoding Indonesia’.istitle()

Output :

True


Catatan: Semua method di atas mengembalikan nilai boolean dan tidak boleh kosong.

Jika Anda menginginkan suatu metode validasi input user, maka metode-metode di atas akan sangat membantu. Anda bisa mencobanya dengan contoh berikut. 

Buatlah file baru pada notepad atau IDE, dan pastikan Anda menggunakan Python 3 untuk mencobanya (akan ada error saat menggunakan Python 2.7).

  1. while True:
  2.     print('Masukkan nama Anda:')
  3.     name = input()
  4.     if name.isalpha():
  5.         print("Halo", name)
  6.         break
  7.     print('Masukkan nama Anda dengan benar.')

Mari kita bahas. Pada kode di atas, program akan meminta pengguna untuk memasukkan namanya, yang mana diharuskan berisi huruf alfabet semua. Jika valid, maka program akan mencetak ‘Halo ‘ disertai nama pengguna dan kemudian program berhenti. Tapi jika tidak, program meminta pengguna kembali memasukkan namanya dengan benar. Ketika dijalankan akan seperti berikut:

Output:

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 (kata.zfill(5));
  4. # Contoh 2
  5. kata = 'kamu'
  6. print (kata.zfill(5));
  7. # Contoh 3
  8. kata = 'dirinya'
  9. print (kata.zfill(5));

Ketika kode di atas dijalankan, outputnya akan terlihat seperti di bawah ini:

00aku

0kamu

dirinya


Masing-masing contoh di atas menghasilkan output yang berbeda-beda. Kita akan membahasnya satu per satu.

Pada contoh pertama menghasilkan output 00aku. Hal tersebut dikarenakan kita menggunakan nilai zfill(5) yang di mana karakternya hanya ada 3 yaitu a, k, dan u. Sehingga nilai ‘nol’ yang berjumlah 2 akan ditambahkan sebelum kata “aku”.

Sama halnya seperti sebelumnya, pada contoh kedua ini kurang lebih menghasilkan output yang sama. Namun, bedanya adalah jumlah karakter yang ada pada contoh kedua ini berjumlah 4 yaitu k,a,m, dan u. Sehingga dengan nilai zfill(5) menghasilkan output 0kamu.

Kemudian pada contoh ketiga menghasilkan output string yang sama dengan aslinya yaitu string “dirinya” menghasilkan output “dirinya” juga. Mengapa bisa demikian? Hal tersebut karena jumlah karakter pada kata “dirinya” lebih dari nilai zfill(5). Sehingga nilai string yang dikembalikan utuh seperti aslinya (tanpa dikurangi atau ditambahkan 0).


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 = Jumat

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 listset, 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]

9

{1, 3, 5, 7, 9}

5

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(genap.count(6))
  3. string = "Belajar Python di Dicoding sangat menyenangkan"
  4. substring = "a"
  5. print(string.count(substring))

Output:

3

6


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, 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:

    0

    1

    2

    3

    4

  1. 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:

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10


  1. 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. angka.sort()
  3. print(angka)

Output:

[5, 100, 200, 500, 1000]


Contoh lain:

  1. kendaraan = ['motor', 'mobil', 'helikopter', 'pesawat']
  2. kendaraan.sort()
  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. kendaraan.sort(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. urutan.sort()
    3. print(urutan)
    Output:
    Anda akan mengalami eror seperti berikut:

    Traceback (most recent call last):

      File "<pyshell#102>", line 1, in <module>

        urutan.sort()

    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.
  1. 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. kendaraan.sort()
    3. print(kendaraan)


    Output:

    ['Pesawat', 'helikopter', 'mobil', 'motor']

    Untuk mengatasi kendala ini, Anda dapat memasukkan keyword str.lower pada parameter. Hal ini akan membuat metode sort menganggap semua objek menggunakan huruf kecil, tanpa mengubah kondisi asli dari objek tersebut.

    Contoh:

    1. kendaraan = ['Motor', 'Mobil', 'helikopter', 'pesawat']
    2. kendaraan.sort(key=str.lower)
    3. 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)
    • Menambahkan dua objek.
    • 3 + 5 menghasilkan 8
    • 'a' + 'b' menghasilkan 'ab'.
  • - (kurang)
    • Mengurangkan operand kedua dari operand pertama. Jika hanya satu operand, diasumsikan nilai operand pertama adalah 0.
    • -5.2 adalah expression yang sama dengan 0 - 5.2 menghasilkan -5.2.
    • 50 - 24 menghasilkan 26.
    • Tidak berlaku untuk string, akan menghasilkan error unsupported operand.
  • * (perkalian)
    • Mengembalikan hasil perkalian angka atau mengembalikan string yang diulang sejumlah tertentu.
    • 2 * 3 menghasilkan 6.
    • 'la' * 3 menghasilkan 'lalala'.
  • ** (pangkat)
    • Mengembalikan operand pertama pangkat operand kedua.
    • 3 ** 4 menghasilkan 81 (sama dengan 3 * 3 * 3 * 3).
      | Tips: untuk akar dua, gunakan pangkat 0.5.
  • / (pembagian)
    • Mengembalikan hasil pembagian operand pertama dengan operand kedua (float).
    • 13 / 3 menghasilkan 4.333333333333333.
  • // (pembagian habis dibagi / div)
    • Mengembalikan hasil pembagian operand pertama dengan operand kedua (bilangan bulat), kecuali jika salah satu operand adalah float, akan menghasilkan float.
    • 13 // 3 menghasilkan 4.
    • -13 // 3 menghasilkan -5.
    • 9//1.81 menghasilkan 4.0.
  • % (modulo)
    • Mengembalikan sisa bagi.
    • 13 % 3 menghasilkan 1.
    • -25.5 % 2.25 menghasilkan 1.5.


Operasi Bit

  • << (left shift)
    • Menggeser representasi bit/binary dari operand pertama sebanyak operand kedua ke kiri.
    • 2 << 2 menghasilkan 8.
      • 2 direpresentasikan sebagai 10 dalam binary.
      • Geser ke kiri sebanyak 2x, menjadi 1000 (tambahkan 0 di belakangnya).
    • 1000 dalam binary bernilai 8 dalam desimal.
  • >> (right shift)
    • Menggeser representasi bit/binary dari operand pertama sebanyak operand kedua ke kanan.
    • 11 >> 1 menghasilkan 5.
      • 11 direpresentasikan sebagai 1011 dalam binary.
      • Geser ke kanan sebanyak 1x, menjadi 101.
    • 101 dalam binary bernilai 5 dalam desimal.
  • & (bit-wise AND)
    • Menjalankan operasi binary AND pada representasi operand pertama dan kedua.
    • 5 & 3 menghasilkan 1.
      • Representasi binary 5 adalah 101 dan representasi binary 3 adalah 011.
      • 101 and 011 bernilai 001.
    • 001 dalam desimal adalah 1.
  • | (bit-wise OR)
    • Menjalankan operasi binary OR pada representasi operand pertama dan kedua.
    • 5 | 3 menghasilkan 7.
      • Representasi binary 5 adalah 101 dan representasi binary 3 adalah 011.
      • 101 or 011 bernilai 111.
    • 111 dalam desimal adalah 7.
  • ^ (bit-wise XOR)
    • Menjalankan operasi binary XOR pada representasi operand pertama dan kedua.
    • 5 ^ 3 menghasilkan 6.
      • Representasi binary 5 adalah 101 dan representasi binary 3 adalah 011.
      • 101 xor 011 bernilai 110.
    • 110 dalam desimal adalah 6.
  • ~ (bit-wise invert)
    • Menjalankan operasi binary invert pada representasi operand.
    • Nilai invert dari x adalah -(x+1), menggunakan metode Two’s Complement
    • ~5 menghasilkan -6.
    • Lebih lanjut mengenai Two’s Complement dapat dibaca pada https://en.wikipedia.org/wiki/Two%27s_complement


Perbandingan

  • < atau operator.lt (less than)
    • Menjalankan perbandingan apakah operand pertama lebih kecil dari operand kedua.
    • 5 < 3 menghasilkan False and 3 < 5 menghasilkan True.
    • Perbandingan dapat berisi lebih dari dua operand, misalnya 3 < 5 < 7 menghasilkan True.
  • > atau operator.gt (greater than)
    • Menjalankan perbandingan apakah operand pertama lebih besar dari operand kedua.
    • 5 > 3 menghasilkan True.
  • <= atau operator.le (less than or equal to)
    • Menjalankan perbandingan apakah operand pertama lebih kecil atau sama dengan operand kedua.
    • x = 3; y = 6;
      • x <= y menghasilkan True.
  • >= atau operator.ge (greater than or equal to)
    • Menjalankan perbandingan apakah operand pertama lebih besar atau sama dengan operand kedua.
    • x = 4; y = 3;
      • x >= y menghasilkan True.
  • == atau operator.eq (equal to)
    • Menjalankan perbandingan apakah operand pertama sama dengan operand kedua.
    • x = 2; y = 2;
      • x == y menghasilkan True.
    • x = 'str'; y = 'stR';
      • x == y menghasilkan False.
    • x = 'str'; y = 'str';
      • x == y menghasilkan True.
  • != atau operator.ne (not equal to)
    • Menjalankan perbandingan apakah operand pertama tidak sama dengan operand kedua.
    • 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)
    • Jika x bernilai True, fungsi akan mengembalikan nilai False.
    • Jika x bernilai False, fungsi akan mengembalikan nilai True.
    • x = True;
      • not x akan mengembalikan nilai False.
  • and (boolean AND)
    • x AND y akan mengembalikan nilai False jika x bernilai False, atau fungsi akan mengembalikan nilai y.
    • 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)
    • x OR y, Jika x bernilai True, fungsi akan mengembalikan nilai True, atau fungsi akan mengembalikan nilai dari y.
    • 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:

OperatorDescription
lambdaLambda expression
if - elseConditional expression
orBoolean OR
andBoolean AND
not xBoolean 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, remainder
+x, -x, ~xPositive, negative, bitwise NOT
**Exponentiation
await xAwait expression
x[index], x[index:index], x(arguments...), x.attributeSubscription, slicing, call, attribute reference
(expressions...), [expressions...], {key: value...},{expressions...}Binding or tuple display, list display, dictionary display, set display

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 kal.py. Perhatikan di baris 5, kolom 5 dan kolom 10. Ditulis berjeda antar huruf agar mudah dicek penomoran kolomnya.
20200115093536a6f00b5829fd7de9fd7aad250ac443c8.png

Jika diproses dengan pycodestyle. Menunjukkan error (E301) di baris 5 kolom 5, serta error (E112) di baris 7 kolom 5.

  1. pycodestyle kal.py
  2. kal.py:5:5: E301 expected 1 blank line, found 0
  3. kal.py:7:5: E112 expected an indented block

Jika diproses dengan pylint. Menunjukkan error (E0001) di baris 7 kolom 10.

  1. pylint kal.py
  2. ************* Module kal
  3. kal.py:7:10: E0001: invalid syntax (<unknown>, line 7) (syntax-error)

Jika diproses dengan flake8. Menunjukkan error (E301) di baris 5 kolom 5, error (E112) di baris 7 kolom 5, serta error (E999) di baris 7 kolom 10.

  1. flake8 kal.py
  2. kal.py:5:5: E301 expected 1 blank line, found 0
  3. kal.py:7:5: E112 expected an indented block
  4. kal.py:7:10: E999 IndentationError: expected an indented block

Setelah kodenya diperbaiki, kali ini diubah secara manual dengan mengetikkan, pada pembahasan berikutnya mengenai memformat kode akan menangani hal ini dengan otomatis.

  1. """kalkulator"""
  2.  
  3. class Kalkulator:
  4.     """kalkulator tambah kurang"""
  5.     def __init__(self, _i):
  6.         self.i = _i
  7.  
  8.     def tambah(self, _i): return self.i + _i
  9.  
  10.     def kurang(self, _i):
  11.         return self.i - _i

Kemudian diproses kembali dengan pycodestyle dan flake8 tidak memunculkan pesan lagi.

Diproses dengan pylint menghasilkan peringatan tentang lebih dari satu pernyataan (statement) dalam satu baris, serta kedua fungsi belum dilengkapi dengan dokumentasi. Hasilnya pylint memberikan skor 5.71 dari 10.

Memformat Kode

Jika proses lint atau linting hanya melakukan pengecekan, terkait arahan gaya penulisan kode Anda bisa menggunakan aplikasi tambahan untuk memformat kode agar sesuai PEP8. Sehingga untuk Anda yang menggunakan editor kode yang sangat ringan dan ringkas fitur sekalipun, misalnya tanpa fasilitas lint, tetap bisa menghasilkan kode sesuai konvensi PEP8.

Proses memformat kode dengan menggunakan aplikasi, cukup sederhana, setelah melakukan instalasi, akan muncul perintah dengan nama yang sama dengan nama aplikasinya. Kemudian perintah itu dapat dieksekusi untuk memformat satu file ataupun satu direktori kode Python.

Berikut akan dibahas 3 jenis aplikasi untuk memformat kode, silakan dicermati dahulu, tidak harus semuanya diinstal, hanya paket yang menurut Anda sesuai kebutuhan saja yang digunakan.


Black

Black adalah proyek open source yang dikembangkan di repository Python Software Foundation (PSF) dengan lisensi MIT. Untuk mendapatkan gambaran, versi online (tidak resmi) ada di https://black.now.sh.

Untuk instalasi menggunakan manajer paket pip sebagai berikut: pip install black.


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 https://yapf.now.sh

Untuk instalasi menggunakan manajer paket pip sebagai berikut: pip install yapf.


Autopep8

Autopep8 adalah proyek open source (berlisensi MIT) yang termasuk paling awal untuk memformat kode, dengan bantuan lint pycodestyle. Untuk instalasi menggunakan manajer paket pip sebagai berikut: pip install autopep8.

Kita akan menggunakan contoh kode sebelumnya kal.py yang berisi class Kalkulator, versi awal sebelum diperbaiki dan dicek dengan linter, sebagai berikut.

  1. class Kalkulator:
  2.     """kalkulator tambah kurang"""
  3.     def __init__(self, _i=0):
  4.         self.i = _i
  5.     def tambah(self, _i): return self.i + _i
  6.     def kurang(self, _i):
  7.         return self.i - _i

Berikut adalah hasil kode diproses dengan black, dengan mengeksekusi perintah: black kal.py

  1. class Kalkulator:
  2.     """kalkulator tambah kurang"""
  3.  
  4.     def __init__(self, _i=0):
  5.         self.i = _i
  6.  
  7.     def tambah(self, _i):
  8.         return self.i + _i
  9.  
  10.     def kurang(self, _i):
  11.         return self.i - _i

Kemudian jika diproses dengan yapf, tidak langsung mengubah isi file kal.py tetapi tampil ke layar, dengan mengekseskusi perintah: yapf kal.py.

  1. class Kalkulator:
  2.     """kalkulator tambah kurang"""
  3.     def __init__(self, _i=0):
  4.         self.i = _i
  5.  
  6.     def tambah(self, _i):
  7.         return self.i + _i
  8.  
  9.     def kurang(self, _i):
  10.         return self.i - _i

Sama dengan yapf, untuk pemrosesan dengan autopep8, tidak langsung mengubah isi file kal.py tetapi tampil ke layar, dengan mengeksekusi perintah: autopep8 kal.py.

  1. class Kalkulator:
  2.     """kalkulator tambah kurang"""
  3.  
  4.     def __init__(self, _i=0):
  5.         self.i = _i
  6.  
  7.     def tambah(self, _i): return self.i + _i
  8.  
  9.     def kurang(self, _i):
  10.         return self.i - _i

Setelah mempelajari kedua mekanisme: pengecekan gaya penulisan (style guide) dan proses memformat kode, Anda tinggal fokus dengan penulisan indentasi dalam kode Python, untuk format sisanya dapat dibantu oleh aplikasi-aplikasi yang telah kita pelajari di atas.

Jika Anda menulis dengan editor kode yang sangat sederhana, anggap saja seperti notepad di Windows atau pico/nano di Linux, maka dalam menuliskan kode Python cukup perhatikan indentasi untuk setiap baris pernyataan (statement). Setelah selesai menuliskan kodenya, simpan kodenya sebagai file .py, lalu eksekusi perintah linter atau langsung eksekusi perintah aplikasi untuk memformat kode. Hasilnya, kode Anda sudah dirapikan sesuai arahan gaya penulisan PEP8 juga dilakukan pengecekan terhadap kemungkinan kesalahan (jika Anda lakukan linting).

Untuk Anda yang mengikuti instalasi editor kode PyCharm pada modul Persiapan, secara bawaan sudah menggunakan fitur inspeksi dengan kemampuan yang kurang lebih sama, meskipun jika Anda mau, bisa juga menambahkan aplikasi lint yang sudah dijelaskan sebagai tambahan dari yang bawaan. Demikian juga untuk fitur format ulang kode juga tersedia secara bawaan di aplikasi PyCharm.

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 = ('setup.cfg',)

Tidak disarankan:

  1. FILES = 'setup.cfg',

Saat trailing comma bersifat redundan, Anda akan merasakan kemudahannya saat menggunakan VCS (Version Control System), atau pada kode yang mungkin Anda tambahkan dalam beberapa waktu kedepan. Pola yang disarankan adalah meletakkan nilai atau string pada sebuah baris baru, mengikuti indentasi yang ada, dan menambahkan trailing comma, dan menutup kurung/kurawal/siku pada baris selanjutnya.

Tidak umum jika Anda meletakkan trailing comma pada baris di mana Anda menutup kurung/kurawal/siku, kecuali dalam tuple dengan satu elemen.

Disarankan:

  1. FILES = [
  2.     'setup.cfg',
  3.     'tox.ini',
  4.     ]
  5. initialize(FILES,
  6.            error=True,
  7.            )

Tidak disarankan:

  1. FILES = ['setup.cfg', 'tox.ini',]
  2. initialize(FILES, error=True,)


Anotasi Fungsi

Penggunaan anotasi fungsi sebaiknya menggunakan aturan baku untuk titik dua (:) dan menggunakan spasi untuk penggunaan ->. Hal ini dijelaskan lebih lanjut di PEP 484.

  1. Yes:
  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 os.stat(), seluruh parameter menggunakan awalan st karena pada prinsipnya, fungsi tersebut akan memanggil properti pada struct (st_size, st_mode, st_mtime, dll). Atau pustaka X11 yang menggunakan awalan X pada seluruh fungsi publiknya.

Penggunaan frase atau huruf pada awal fungsi ini tidak disarankan pada Python, atau lebih tepatnya tidak dibutuhkan, karena struktur pada Python:

  • 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:
    Tkinter.Toplevel(master, class_='ClassName').

  3. __diawali_dua_garis bawah: menegaskan bahwa sebuah objek merupakan bagian dari kelas tertentu (pada kelas FooBar, fungsi __boo menjadi _FooBar__boo).

  4. __diawali_dan_diakhiri_dua_garis bawah__: Objek atau atribut tertentu yang diciptakan Python untuk digunakan dalam program: __init__, __import__ or __file__. Jangan membuatnya sendiri, hanya gunakan yang telah didokumentasikan.


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 os.path 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

if nilai>80:
print("Selamat! Anda mendapat nilai A")
print("Pertahankan!")
elif nilai>70:
print("Hore! Anda mendapat nilai B")
print("Tingkatkan!")
elif nilai>60:
print("Hmm.. Anda mendapat nilai C")
print("Ayo semangat!")
else:
print("Waduh, Anda mendapat nilai D")
print("Yuk belajar lebih giat lagi!")

#Kasus 2

if nilai>0:
print("Selamat! Anda mendapat nilai A")
print("Pertahankan!")
elif nilai<80:
print("Hore! Anda mendapat nilai B")
print("Tingkatkan!")
elif nilai<70:
print("Hmm.. Anda mendapat nilai C")
print("Ayo semangat!")
else:
print("Waduh, Anda mendapat nilai D")
    print("Yuk belajar lebih giat lagi!")
85Masukkan nilai tugas Anda: 85
Selamat! Anda mendapat nilai A
Pertahankan!
Masukkan nilai tugas Anda: 85
Selamat! Anda mendapat nilai A
Pertahankan!
65Masukkan nilai tugas Anda: 65
Hmm.. Anda mendapat nilai C
Ayo semangat!
Masukkan nilai tugas Anda: 65
Selamat! Anda mendapat nilai A
Pertahankan!
30Masukkan nilai tugas Anda: 30
Waduh, Anda mendapat nilai D
Yuk belajar lebih giat lagi!
Masukkan nilai tugas Anda: 30
Selamat! Anda mendapat nilai A
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:

IFTernary
if (condition):
condition_if_true
else:
condition_if_false
condition_if_true if condition else condition_if_false
lulus = True
if (lulus):
kata = ”selamat”
else:
kata = “perbaiki”
lulus = True
kata = "selamat" if lulus else "perbaiki"

Opsi lain dari ternary operators melibatkan tuples. Contoh kodenya berikut:

IFTernary_Tuples
if (condition):
condition_if_true
else:
condition_if_false
(condition_if_falsecondition_if_true)[condition]
lulus = True
if (lulus):
kata=”selamat”
else:
kata=“perbaiki”
nice = True
kata= ("perbaiki""selamat")[lulus]

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').

Kontrol Perulangan


Break

Pernyataan break menghentikan perulangan kemudian keluar, dilanjutkan dengan mengeksekusi pernyataan (statement) setelah blok perulangan. Salah satu penggunaannya yang paling sering adalah sebuah kondisi eksternal yang membutuhkan program untuk keluar dari perulangan. Jika Anda memiliki perulangan bertingkat, break akan menghentikan perulangan sesuai dengan tingkatan atau di perulangan mana ia berada. Namun jika ia diletakkan di perulangan dengan kedalaman kedua misalnya, hanya perulangan itu saja yang berhenti, tidak dengan perulangan utama.

Contoh 1:

  1. for huruf in 'Dico ding':
  2.     if huruf == ' ':
  3.         break
  4.     print('Huruf saat ini: {}'.format(huruf))

Output contoh 1:

Huruf saat ini: D
Huruf saat ini: i
Huruf saat ini: c
Huruf saat ini: o

Contoh 2, cetak bintang dengan memanfaatkan fungsi break

  1. for i in range (0,10):
  2. for j in range (0,10):
  3. if j>i:
  4. print()
  5. break
  6. else:
  7. print("*",end="")
  8.  

Output contoh 2:

*
**
***
****
*****
******
*******
********
*********
**********


Continue

Pernyataan continue akan membuat iterasi saat ini berhenti, kemudian melanjutkan ke iterasi berikutnya, mengabaikan pernyataan (statement) yang berada antara continue hingga akhir blok perulangan.

Contoh 1:

  1. for huruf in 'Dico ding':
  2.     if huruf == ' ':
  3.         continue
  4.     print('Huruf saat ini: {}'.format(huruf))

Output contoh 1:

Huruf saat ini: D
Huruf saat ini: i
Huruf saat ini: c
Huruf saat ini: o
Huruf saat ini: d ## perhatikan spasi dilewati
Huruf saat ini: i
Huruf saat ini: n
Huruf saat ini: g


Contoh 2, cetak bintang yang sama dengan contoh 2 pada pembahasan fungsi break, dengan 1 loop dan 1 if (tanpa else):

  1. jumlahbaris = 10
  2. baris = 0
  3. bintang = 0
  4. while baris < jumlahbaris:
  5. if (bintang) >= (baris+1):
  6. print()
  7. baris = baris+1
  8. bintang=0
  9. continue ##saat masuk ke if, maka bagian print * diluar if tidak akan dijalankan, langsung ulang ke while
  10. print("*",end="")
  11. bintang= bintang+1

*
**
***
****
*****
******
*******
********
*********
**********


Else setelah For

Pada Python juga dikenal fungsi else setelah for. Fungsinya diutamakan pada perulangan yang bersifat pencarian - untuk memberikan jalan keluar program saat pencarian tidak ditemukan.

Struktur umumnya adalah sebagai berikut:

  1. for item in items:
  2.     if cari(item):
  3.         #ditemukan!
  4.         proses_item()
  5.         break
  6. else:
  7.     #Item tidak ditemukan
  8.     not_found_in_container()

Anda mungkin melihat sesuatu yang menarik. Ada If dan Else, namun dalam tingkatan yang berbeda, apakah mereka terkait? 

Saat sebuah perulangan dijalankan, fungsi if akan dievaluasi. Saat ia pernah sekali saja benar, maka else tidak akan dieksekusi. Dengan kata lain, if yang berada dalam perulangan harus selalu salah untuk memicu blok statemen else dijalankan. Lebih singkat lagi, struktur pseudocode yang diikuti dalam membuat else pada perulangan adalah seperti berikut:

  1. if any(something_about(thing) for each thing in container):
  2.     do_something(that_thing)
  3. else:
  4.     no_such_thing()

Contoh penggunaan dari for-else dapat dilihat pada potongan kode berikut (jalankan di konsol sebelum melanjutkan ke bagian selanjutnya):

  1. for n in range(2, 10):
  2.     for x in range(2, n):
  3.         if n % x == 0:
  4.             print(n, 'equals', x, '*', n/x)
  5.             break

Potongan kode di atas melakukan pencarian faktor dari setiap bilangan antara 2 s/d 9. Namun demikian, pada saat bilangan n bernilai 2, 3, 5, 7, program tidak akan mencetak apapun. Ini karena bilangan-bilangan tersebut merupakan bilangan prima. Hal ini bisa diatasi dengan menambahkan keterangan else dan mencetak bahwa bilangan tersebut adalah bilangan prima:

  1. for n in range(2, 10):
  2.     for x in range(2, n):
  3.         if n % x == 0:
  4.             print( n, 'equals', x, '*', n/x)
  5.             break
  6.     else:
  7.         # loop fell through without finding a factor
  8.         print(n, ' adalah bilangan prima')


Else setelah While

Berbeda dengan Else setelah For, pada statement while, blok statement else akan selalu dieksekusi saat kondisi pada while menjadi salah. Contoh mudahnya adalah sebagai berikut:

  1. n = 10
  2. while n > 0:
  3.     n = n - 1
  4. if n == 7:
  5.         break
  6.     print(n)
  7. else:
  8.     print("Loop selesai")

Output:

9
8

Pada contoh diatas, loop akan di break saat nilai n == 7, saat keluar dari perulangan, maka python tidak akan memunculkan tulisan Loop selesai, namun jika tidak dilakukan break (perulangan berakhir dengan normal):

  1. n = 10
  2. while n > 0:
  3.     n = n - 1
  4.     print(n)
  5. else:
  6.     print("Loop selesai")

Output:

9
8
7
6
5
4
3
2
1
0
Loop selesai


Pass

Digunakan jika Anda menginginkan sebuah pernyataan atau blok pernyataan (statement), namun tidak melakukan apapun - melanjutkan eksekusi sesuai dengan urutannya. Kontrol ini banyak digunakan saat Anda belum melakukan implementasi (atau menyiapkan tempat untuk implementasi), serta membiarkan program tetap berjalan saat misalnya Anda mengalami kegagalan atau exception.

Pass statement adalah operasi bersifat Null (kosong), tidak ada yang terjadi saat ia dipanggil. Contohnya:

  1. def sebuahfungsi():
  2. pass

Output:

#tidak ada


Jika Anda mendeklarasi sebuah fungsi tanpa kode apapun, justru akan terjadi error:

  1. def sebuahfungsi():

Output:

File "<test.py>", line 2
^
IndentationError: expected an indented block


Contoh pass untuk mengantisipasi exception/kegagalan fungsi, perhatikan contoh kode yang belum ditambahkan pass berikut:

  1. var1=""
  2. while(var1!="exit"):
  3.     var1=input("Please enter an integer (type exit to exit): ")
  4.     print(int(var1))

Output:

Please enter an integer (type exit to exit): 1
1
Please enter an integer (type exit to exit): a
Traceback (most recent call last):
File "testp3.py", line 7, in <module>
print(int(var1))
ValueError: invalid literal for int() with base 10: 'a'


Kita dapat membaca bahwa program gagal saat mencoba proses konversi variabel var1. Saat program mengalami kegagalan atau exception, ia akan langsung keluar. Bandingkan dengan pendekatan berikut (mengenai exception, import/library sys, dan try/except akan dibahas pada modul-modul pembelajaran berikutnya:

  1. import sys
  2. data=''
  3. while(data!='exit'):
  4.     try:
  5.         data=input('Please enter an integer (type exit to exit): ')
  6.         print('got integer: {}'.format(int(data)))
  7.     except:
  8.         if data == 'exit':
  9.             pass  # exit gracefully without prompt any error
  10.         else:
  11.             print('error: {}'.format(sys.exc_info()[0]))

Outputnya saat dijalankan:

Please enter an integer (type exit to exit): 1
got integer: 1
Please enter an integer (type exit to exit): a
Unexpected error: <class 'ValueError'>
Please enter an integer (type exit to exit): b
Unexpected error: <class 'ValueError'>
Please enter an integer (type exit to exit): c
Unexpected error: <class 'ValueError'>
Please enter an integer (type exit to exit): exit


Pada pendekatan kedua, program akan memberitahu kegagalan yang terjadi sesuai dengan yang kita tuliskan pada baris berwarna kuning, namun tetap terus berjalan, dalam hal ini hingga dituliskan exit. Anda dapat melakukan antisipasi apapun sebelum menulis pass (misalnya memasukkan informasi terkait error ke log, memberi notifikasi ke admin, dan sebagainya).


List Comprehension (membuat list dengan inline loop dan if)

Ada kalanya Anda perlu untuk membuat sebuah list baru dari dengan sebuah operasi dari list sebelumnya. Misalnya membuat nilai kuadrat dari semua item dalam list:

  1. #Cara 1
  2. angka = [1, 2, 3, 4]
  3. pangkat = []
  4. for n in angka:
  5.   pangkat.append(n**2)
  6. print(pangkat)

Cara yang umum digunakan adalah cara di atas, yakni melakukan perulangan sejumlah item pada list angka kemudian membuat list baru (pangkat) dan menambahkan hasil operasinya dalam list baru (pangkat). Bandingkan dengan cara berikut:

  1. #Cara 2 List Comprehension
  2. angka = [1, 2, 3, 4]
  3. pangkat = [n**2 for n in angka]
  4. print(pangkat)

Cobalah kedua contoh di atas. Hasilnya sama bukan?

Output:

[1, 4, 9, 16]


List comprehension adalah salah satu cara untuk menghasilkan list baru berdasarkan list atau iterables yang telah ada sebelumnya. Sintaksis dasarnya adalah sebagai berikut:

  1. new_list = [expression for_loop_one_or_more conditions]

Contoh kedua di atas dapat diartikan sebagai: untuk setiap anggota angka buatlah nilai kuadratnya. List comprehension dapat digunakan lebih lanjut, misalnya:

  1. #Contoh3 menemukan item yang ada di kedua list
  2. list1 = ['d', 'i', 'c', 'o']
  3. list2 = ['d', 'i', 'n', 'g']
  4. duplikat = []
  5. for a in list1:
  6.   for b in list2:
  7.     if a == b:
  8.       duplikat.append(a)
  9.      
  10. print(duplikat)  # Output ['d','i']

Bandingkan dengan:

  1. #Contoh4 Implementasi dengan list comprehension
  2. list1 = ['d', 'i', 'c', 'o']
  3. list2 = ['d', 'i', 'n', 'g']
  4. duplikat = [a for a in list1 for b in list2 if a == b]
  5. print(duplikat) # Output: ['d','i']

Sangat memudahkan bukan? Dari 5 baris cukup disingkat menjadi 1 baris saja. 

Contoh penggunaan yang lain dapat dilihat pada contoh 5 berikut:

  1. # Contoh 5 kecilkan semua huruf
  2. list_a = ["Hello", "World", "In", "Python"]
  3. small_list_a = [_.lower() for _ in list_a]
  4. print(small_list_a)

Output:

['hello', 'world', 'in', 'python']


Anda tidak perlu bingung saat melihat kode di Internet yang menuliskan seperti contoh di atas, karena garis bawah (underscore) termasuk penamaan variabel yang validSecara umum "_" biasa digunakan sebagai throwaway variable (variabel tidak penting)

Banyak hal yang mungkin dilakukan dengan list comprehension. Coba perkirakan apa yang akan dimunculkan oleh potongan kode berikut dan pilih jawaban yang tepat pada kuis di bagian berikutnya:

  1. list_a = range(1, 10, 2)
  2. x = [[a**2, a**3] for a in list_a]
  3. print(x)








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 https://docs.python.org/id/3.8/library/exceptions.html.

Penanganan Pengecualian

Pada aplikasi Python yang Anda buat bisa dilengkapi dengan penanganan terhadap pengecualian (exceptions handling) dari kelompok (tipe) kesalahan yang Anda tentukan. Proses penanganan pengecualian menggunakan pernyataan try yang berpasangan dengan except.

Misalnya kita ingin menangani pengecualian yang terjadi jika ada pembagian angka dengan nilai nol (0).

  1. >>> z = 0
  2. >>> 1 / z
  3.  
  4. Traceback (most recent call last):
  5. File "<stdin>", line 1, in <module>
  6. ZeroDivisionError: division by zero
  7.  
  8. >>> try:
  9. ...     x = 1 / z
  10. ...     print(x)
  11. ... except ZeroDivisionError:
  12. ...     print('tidak bisa membagi angka dengan nilai nol')
  13.  
  14. tidak bisa membagi angka dengan nilai nol

Perhatikan bahwa operasi aplikasi berhenti di x = 1 / z, sedangkan bagian print(x) tidak sempat dioperasikan, karena aplikasi sudah mengalami pengecualian, sehingga yang tercetak adalah operasi print(‘tidak bisa membagi angka dengan nilai nol’).

Pada operasi yang dicontohkan di atas, penanganan pengecualian untuk ZeroDivisionError dilakukan sehingga aplikasi tidak lagi keluar dari eksekusi karena kesalahan, tapi digantikan dengan mencetak pesan ke layar. Pada contoh ini kita fokus pada penanganan pengecualian, meskipun ada cara lain untuk menyelesaikannya, misal menggunakan kondisi (percabangan) untuk menghindari nilai nol.

Pernyataan except dilanjutkan dengan kelompok (tipe) kesalahan yang ingin ditangani, atau bisa juga berupa tuple dari satu atau lebih tipe kesalahan yang akan ditangani. Di contoh berikut, menangani FileNotFoundError sebagai tuple satu elemen, jangan lupa dalam menuliskan tuple satu elemen harus tetap diakhiri dengan koma.

  1. >>> try:
  2. ...     with open('contoh_tidak_ada.py') as file:                   
  3. ...         print(file.read())                          
  4. ... except (FileNotFoundError, ):
  5. ...     print('file tidak ditemukan')
  6. ...  
  7. file tidak ditemukan

Pada operasi di atas, aplikasi akan membuka dan mengakses file bernama contoh_tidak_ada.py, tetapi file tersebut tidak ada di direktori dimana aplikasi Python tersebut berada, selanjutnya akan terjadi pengecualian (exceptions) tetapi ditangani, dalam pasangan pernyataan try dan except, sehingga aplikasi tidak terhenti tetapi tercetak di layar bahwa file tidak ditemukan.

Dalam aplikasi yang lebih kompleks, penanganan pengecualian dapat menggunakan pernyataan except lebih dari satu. Di contoh berikutnya akan menggunakan pernyataan except lebih dari satu (untuk satu pernyataan try), maupun menggunakan satu pernyataan except yang menangani lebih dari satu tipe kesalahan yang digabung dalam sebuah tuple.

  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 exceptelsefinally.
202001141653265de18b6bccc27cecdcae7712bc66c163.png


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 kwargs.items():
  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 hello.py yang akan kita panggil di berkas lain.

hello.py

  1. # Define a function
  2. def world():
  3.     print("Hello, World!")

Jika hello.py dijalankan, maka program tidak akan menjalankan apapun karena world() hanya berupa definisi fungsi, kita belum memanggilnya. Jika kita biasanya memanggil sebuah fungsi dari berkas yang sama di bagian main, kali ini kita akan membuat berkas lain main.py yang seolah mengimpor hello.py. Pastikan hello.py dan main.py berada dalam satu direktori agar dapat diimpor dan dipanggil.

main.py

  1. #impor
  2. import hello
  3. #panggil
  4. hello.world()

Saat memanggil sebuah fungsi dari modul yang kita impor, jangan lupa untuk menambahkan nama modulnya diikuti tanda titik, baru fungsi yang akan kita panggil. Dalam hal ini karena kita mengimpor hello.py, maka cukup kita tulis import hello, dan saat memanggilnya dengan hello.world(). Selain itu, kita juga dapat menggunakan from ... import ..., dalam hal ini adalah from hello import world dan memanggil fungsinya langsung yakni world().

Sekarang, saat memanggil main.py, maka akan menghasilkan:

Hello, World!


Menambahkan variabel

Menambahkan variabel pada modul hello, tambahkan variabel nama, misalnya Dicoding.

hello.py

  1. def world():
  2.     print("Hello, World!")
  3. nama = "Dicoding"

Berikutnya, kita coba cetak variabel nama.

main.py

  1. #impor
  2. import hello
  3.  
  4. #panggil
  5. hello.world()
  6. #cetak
  7. print(hello.nama)

Saat Dijalankan:

Hello, World!
Dicoding


Menambahkan kelas

Contoh yang lain, mari tambahkan kelas di modul hello. Kita akan membuat kelas Reviewer dengan atribut nama dan kelas, serta fungsi review() yang akan mencetak atribut yang telah didefinisikan.

hello.py

  1. def world():
  2.     print("Hello, World!")
  3. nama = "Dicoding"
  4. class Reviewer:
  5.     def __init__(self, nama, kelas):
  6.         self.nama = nama
  7.         self.kelas = kelas
  8.     def review(self):
  9.         print("Reviewer " + self.nama + " bertanggung jawab di kelas " + self.kelas)

Tambahkan kelas pada main.py.

main.py

  1. #impor
  2. import hello
  3. #panggil
  4. hello.world()
  5. #cetak
  6. print(hello.nama)
  7. #review
  8. diko = hello.Reviewer("Diko", "Python")
  9. diko.review()

Seperti umumnya kelas pada bahasa pemrograman lainnya, Fungsi dan Atributnya dapat diakses setelah kita melakukan instansiasi. Fungsi Review adalah fungsi yang melekat pada kelas Reviewer. Kita juga dapat memanggil diko.Nama atau diko.Kelas sebagai atribut yang melekat di kelas tersebut.

Output:

Hello, World!
Dicoding
Reviewer Diko bertanggung jawab di kelas Python


Lihat kedua variabel "nama" yang dapat menghasilkan dua nilai berbeda, karena nama yang pertama (hello.nama) melekat pada modul, sementara diko. Nama adalah atribut nama pada kelas Reviewer. Anda harus cukup berhati-hati dalam memastikan variabel seperti pada pembahasan fungsi yang lalu.


Implementasi Kode

Seringkali, modul dimanfaatkan untuk dapat memisahkan antara definisi dan implementasi kode. Namun modul juga dapat berfungsi selayaknya program pada umumnya, yang juga langsung mengeksekusi dalam modul itu sendiri. Contohnya, kita buat hello2.py seperti berikut:

hello2.py

  1. # Definisi
  2. def world():
  3.     print("Hello, World!")
  4. # Panggil disini
  5. world()

Kemudian bersihkan main.py hingga menyisakan import hello2 saja.

main.py

  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 sys.path.append. Misalnya berkas hello.py kita berada di direktori /home/dicoding/ dan main.py di direktori lainnya. Anda cukup menambahkan path /home/dicoding pada main.py seperti di bawah:

  1. import sys
  2. sys.path.append('/home/dicoding')
  3. import hello


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 sys.path kembali untuk mengetahui posisi Anda saat ini.

  1. print(sys.path)

Anda mungkin akan menerima output seperti berikut, sangat bergantung dengan jenis environment Anda, tapi pilihlah (atau cobalah satu per satu) jika ada beberapa output.

'/home/dicoding/my_env/lib/python3.5/site-packages'


Pindahkan hello.py pada direktori di atas. Maka Ia akan dikenali sebagai sebuah modul yang dapat diimpor oleh siapa saja dalam environment tersebut.

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: https://docs.python.org/id/3.8/tutorial/classes.html#class-and-instance-variables

  1. class KeranjangBelanja:
  2.     """contoh tidak baik dilakukan dengan definisi variabel terbagi"""
  3.     isi = []  # menggunakan list di sini akan terbagi untuk semua instance. JANGAN DILAKUKAN

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: opensortedintstr, dan sejumlah lainnya. Terkait metode, ada dua fungsi bawaan yang akan kita bahas, yakni classmethod dan staticmethod.

Catatan:

fungsi decorator adalah sebuah fungsi yang mengembalikan fungsi lain, biasanya digunakan sebagai fungsi transformasi dengan "pembungkus" sintaksis @wrapper.

Referensi: https://docs.python.org/id/3.8/glossary.html#term-decorator.

Classmethod adalah sebuah fungsi yang mengubah metode menjadi metode dari class (class method). Dalam penggunaannya, fungsi ini dijadikan sebagai fungsi decorator @classmethod, kemudian pemanggilannya bisa langsung dari class yang terdefinisi ataupun melalui objek.
Metode dari class (class method) menerima masukan class secara implisit sebagai argumen pertama yang secara konvensi diberikan nama cls.

Berdasar contoh yang sama dengan class sebelumnya, berikut adalah metode dari class.

  1. class Kalkulator:
  2.     """contoh kelas kalkulator sederhana"""
  3.  
  4.     def f(self):
  5.         return 'hello world'
  6.  
  7.     @classmethod
  8.     def tambah_angka(cls, angka1, angka2):
  9.         return '{} + {} = {}'.format(angka1, angka2, angka1 + angka2)

Nampak pada kode, sesuai konvensi ada metode yang menggunakan argumen pertama self, sedangkan untuk class method menggunakan konvensi argumen pertama cls

Untuk melakukan pemanggilan dari class, dilakukan seperti berikut, dimana argumen pertama cls sudah mendapatkan masukan class Kalkulator.

  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.

202001151133158180e9a4eb105ed1eb62e8ee93c69a3e.pngSuatu kelas B dapat mewarisi kelas A, sehingga secara otomatis memiliki semua fitur yang dimiliki oleh kelas A, dalam hal ini atribut-atribut dan metode-metode.

Dalam contoh ini, kelas A disebut sebagai kelas dasar, yakni kelas yang memberikan warisan atau biasa juga disebut kelas yang diturunkan.

Kemudian kelas B disebut sebagai kelas turunan, yakni kelas yang mendapatkan warisan.
Jika di kelas B memiliki metode dengan nama yang sama dengan yang dimiliki kelas A, maka metode tersebut akan menimpa metode yang diwariskan dari kelas A.

Catatan:

  • Frasa kelas dasar adalah terjemahan bahasa Inggris dari frasa base class.
  • Frasa kelas turunan adalah terjemahan bahasa Inggris dari frasa derived class.
  • Frasa menimpa metode adalah terjemahan bahasa Inggris dari frasa method override.
  • Di Python, mekanisme pewarisan memungkinkan untuk memiliki lebih dari satu kelas dasar (kelas orang tua, yang diwarisi).

Referensi: https://docs.python.org/id/3.8/tutorial/classes.html#multiple-inheritance

Kita akan mengembangkan aplikasi yang sudah dimiliki di atas, class Kalkulator sebagai kelas dasar yang mempunyai fungsi melakukan penambahan melalui metode tambah_angka.

  1. class Kalkulator:
  2.     """contoh kelas kalkulator sederhana. anggap kelas ini tidak boleh diubah!"""
  3.  
  4.     def __init__(self, nilai=0):
  5.         self.nilai = nilai
  6.  
  7.     def tambah_angka(self, angka1, angka2):
  8.         self.nilai = angka1 + angka2
  9.         if self.nilai > 9:  # kalkulator sederhana hanya memroses sampai 9
  10.             print('kalkulator sederhana melebihi batas angka: {}'.format(self.nilai))
  11.         return self.nilai

Kemudian kita punya kebutuhan membuat sebuah kelas yang punya fitur perkalian tapi juga punya fitur penambahan, dalam contoh ini misalnya kita tidak boleh mengubah kalkulator yang sudah ada. Dibandingkan dengan membuat kelas baru kemudian menuliskan kembali implementasi penambahan angka, maka mewarisi kelas yang sudah ada akan lebih efisien.

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.         self.nilai = angka1 * angka2
  6.         return self.nilai

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.         self.nilai = angka1 * angka2
  6.         return self.nilai
  7.  
  8.     def tambah_angka(self, angka1, angka2):
  9.         self.nilai = angka1 + angka2
  10.         return self.nilai

Kemudian kita coba kembali, apakah batasan yang dimiliki sudah hilang?

  1. kk = KalkulatorKali()
  2.  
  3. b = kk.tambah_angka(5, 6)  # fitur tambah_angka yang dipanggil milik KalkulatorKali
  4. print(b)


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.             self.nilai = angka1 + angka2
  9.         return self.nilai


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. don.nama = 'Don Doo'
  8. don.bagian = 'IT'
  9. don.gaji = 999

Unit Testing

Sampai di tahap ini, sudah banyak modul pemrograman Python yang kita dipelajari. Kita telah mengenal operasi-operasi dasar di Python seperti perulangan, fungsi, hingga OOP pada Python.

Ketika aplikasi yang kita kembangkan nantinya semakin kompleks, akan muncul dependensi yaitu satu atau lebih fungsi digunakan oleh fungsi lain. Atau bahkan ketika kita mulai membangun aplikasi dengan rekan kita, kita membuat fungsi yang digunakan oleh rekan kita, ataupun sebaliknya.

Pada saat membuat fungsi baru ataupun mengubah fungsi yang sudah ada, tentunya perlu dipastikan bahwa fungsionalitas aplikasi yang sebelumnya tidak terganggu dengan adanya perubahan baru tersebut. Bagaimana jika fungsionalitas bukan hanya 5 atau 10, tapi lebih dari itu? Tentu menyulitkan sekali untuk mengeceknya satu per satu setiap kita melakukan perubahan.

Di sinilah kita butuh pengujian (test) untuk fungsi-fungsi tersebut yang dapat dilakukan secara otomatis. Kita dapat melakukan ini dengan salah satu library bawaan Python yaitu unittest, yang penamaannya sesuai  dengan tugas yang dilakukannya. Unittest merupakan proses pengujian perangkat lunak yang memastikan setiap unit/fungsi dari program teruji. Jika fungsionalitas dari aplikasi yang kita bangun terdiri dari prosedur-prosedur dan fungsi-fungsi yang kita tulis, maka kita perlu melakukan unit test untuk setiap prosedur atau fungsi yang ada.

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(unittest.TestCase):
  4.     
  5.     def test_strip(self):
  6.         self.assertEqual('www.dicoding.com'.strip('c.mow'), 'dicoding')
  7.     
  8.     def test_isalnum(self):
  9.         self.assertTrue('c0d1ng'.isalnum())
  10.         self.assertFalse('c0d!ng'.isalnum())
  11.     
  12.     def test_index(self):
  13.         s = 'dicoding'
  14.         self.assertEqual(s.index('coding'), 2)
  15.         # cek s.index gagal ketika tidak ditemukan
  16.         with self.assertRaises(ValueError):
  17.             s.index('decode')
  18.     
  19. if __name__ == '__main__':
  20.     unittest.main()

Jalankan program di atas. Hasil keluarannya seperti berikut.

20200930135736f588b12a40066f23cd2c80e7be7b0bd3.jpeg

Mari kita bahas satu per satu dari kode di atas.

  • Kelas TestStringMethods merupakan sebuah kelas yang merupakan turunan (subclass) dari class unittest.TestCase, sehingga proses test dapat dilangsungkan tanpa banyak implementasi lain.

  • Ada 3 metode pada class tersebut yang semua namanya diawali dengan kata test, hal ini merupakan konvensi (aturan) yang wajib diikuti untuk menginformasikan ke test runner bahwa sejumlah metode tersebut merepresentasikan test yang akan dioperasikan.

  • Pada setiap metode, pengujian dilakukan dengan pemanggilan assert. Pada metode test_strip dilakukan pengecekan kesamaan menggunakan assertEqual untuk memastikan bahwa 'www.dicoding.com'.strip('c.mow') sama dengan ‘dicoding’.

  • Pada metode test_isalnum dilakukan pengecekan apakah fungsi bernilai benar (True), dengan assertTrue untuk memastikan bahwa 'c0d1ng'.isalnum() bernilai benar di mana ‘cOd1ng’ adalah betul bertipe alfanumerik . Kemudian juga ada pengecekan apakah fungsi bernilai salah (False) dengan assertFalse untuk memastikan bahwa 'c0d!ng'.isalnum() betul bernilai salah karena ada karakter yang bukan alfanumerik yaitu ‘!’.

  • Pada metode test_index dilakukan pengecekan kesamaan seperti sebelumnya dengan menggunakan assertEqual bahwa pencarian substring coding menempati index sama dengan 2. Kemudian juga ada pengecekan apakah akan membangkitkan ValueError dengan menggunakan assertRaises(ValueError), jika pencarian index tidak berhasil ditemukan pada string yang sudah ditentukan.

  • Pada bagian terakhir kode ada pemanggilan unittest.main() untuk mulai menjalankan test.

Selanjutnya kita akan membahas hasil keluarannya. Tampak pada keluaran bahwa ada 3 tanda titik (...) yang menyatakan bahwa ketiga fungsi yang dites berhasil melewati test. Dirangkum juga waktu pemrosesan dari total 3 test tersebut berlangsung sangat cepat selama 0.00 detik. serta di baris paling akhir adalah rangkuman bahwa semua test berlangsung sukses (OK).

Anda bisa mencoba melihat keluaran lain dengan membuat gagal salah satu test. Misalnya pada metode test_isalnum keduanya akan diubah menggunakan assertTrue sehingga salah satu fungsi akan gagal. Kodenya bisa Anda lihat di bawah.

  1. def test_isalnum(self):
  2. self.assertTrue('c0d1ng'.isalnum()) # ini akan berhasil
  3. self.assertTrue('c0d!ng'.isalnum()) # ini akan gagal

Kemudian jalankan kembali program Anda. Keluarannya akan seperti berikut:20200930135737ace48d6e79beb125480211704464dc95.jpeg

Berikut penjelasannya:

  • Seperti yang sudah Anda duga bahwa, akan ada pengujian yang gagal, sehingga tertulis .F. yang menggambarkan bahwa pengujian metode kedua gagal (FAIL).

  • Berikutnya dijelaskan bahwa kegagalan ada di metode test_isalnum, yaitu sebuah metode dari class __main__.TestStringMethods.

  • Lebih jauh, diinformasikan bahwa test_isalnum yang gagal berada pada baris ke 10 pada kode Anda, yakni pada pengecekan self.assertTrue('c0d!ng'.isalnum()) yang memang tadi kita ubah dari assertFalse. Sistem pengujian juga melaporkan bahwa pembandingannya tidak sesuai yakni False tidak bernilai benar seperti yang diharapkan dengan adanya pengujian assertTrue.

  • Rekap totalnya ada 3 tests yang dilakukan dalam 0.01 detik. Kemudian secara umum test menghasilkan 1 buah kegagalan (failure).

Cukup mudah dimengerti bukan? Kita dapat melihat sendiri bahwa pengujian hasilnya gagal. Tapi kali ini gagalnya memang sesuai dengan harapan kita.

Sekarang kita coba pengujian dengan contoh yang lebih nyata, misalnya kita memiliki class User di mana kita akan menguji aktif atau tidaknya user dengan melihat apakah dia terkoneksi ke basis data (DB) atau tidak.

Untuk menyederhanakan kodenya dan lebih fokus pada pengujiannya, tulis simulasinya dalam 1 file kode sebagai berikut:

  1. import unittest
  2.  
  3. def koneksi_ke_db():
  4. print('[terhubung ke db]')
  5. def putus_koneksi_db(db):
  6.     print('[tidak terhubung ke db {}]'.format(db))
  7.  
  8. class User:
  9. username = ''
  10. aktif = False
  11. def __init__(self, db, username): # using db sample
  12. self.username = username
  13. def set_aktif(self):
  14. self.aktif = True
  15.  
  16. class TestUser(unittest.TestCase):
  17. def test_user_default_not_active(self):
  18. db = koneksi_ke_db()
  19. dicoding = User(db, 'dicoding')
  20. self.assertFalse(dicoding.aktif) # tidak aktif secara default
  21. putus_koneksi_db(db)
  22.  
  23. def test_user_is_active(self):
  24. db = koneksi_ke_db()
  25. dicoding = User(db, 'dicoding')
  26. dicoding.set_aktif() # aktifkan user baru
  27. self.assertTrue(dicoding.aktif)
  28. putus_koneksi_db(db)
  29.  
  30. if __name__ == '__main__':
  31. unittest.main()

Sama seperti sebelumnya, kita akan membuat sebuah class TestUser yang merupakan turunan dari class unittest.TestCase, kemudian menulis 2 metode untuk pengujian kali ini.

Karena setiap test itu dioperasikan secara terpisah, akhirnya kita menjalankan fungsi koneksi ke basis data dan membuat User dicoding setiap kali proses test. Hal tersebut bukan praktik yang baik karena memakan lebih banyak memori apalagi jika program yang kita uji berukuran besar. Lalu apa praktik yang lebih baik?

Kita akan menggunakan metode bawaan dari class TestCase, yakni metode setUp() dan tearDown().

  • Metode setUp() akan dipanggil untuk menyiapkan test sehingga pemanggilannya akan dilakukan setiap sebelum metode test dilaksanakan.

  • Metode tearDown() akan dipanggil setiap setelah metode test selesai dilaksanakan, meskipun terjadi kesalahan (exception) pada proses test.

Kode sebelumnya akan kita ubah dengan implementasi kedua metode setUp() dan tearDown(). Kita cukup melakukan perubahan pada class TestUser saja seperti di bawah.

  1. class TestUser(unittest.TestCase):
  2. def setUp(self):
  3. self.db = koneksi_ke_db()
  4. self.dicoding = User(self.db, 'dicoding')
  5.  
  6. def tearDown(self):
  7. putus_koneksi_db(self.db)
  8. def test_user_default_not_active(self):
  9. self.assertFalse(self.dicoding.aktif) # tidak aktif secara default
  10.  
  11. def test_user_is_active(self):
  12. self.dicoding.set_aktif() # aktifkan user baru
  13. self.assertTrue(self.dicoding.aktif)

Kemudian jalankan kembali program Anda. Hasil keluarannya seperti berikut.

20200930135737d56688cde70afc1e823ec95636ce1e57.jpeg

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: https://docs.python.org/3/library/string.html.
String merupakan salah satu modul bawaan Python yang tidak perlu dideklarasikan. Modul yang sudah bawaan dari Python disebut modul built-in (https://docs.python.org/3/library/stdtypes.html). Termasuk di dalam modul built in antara lain adalah string, list, range, boolean operator, dan sebagainya. Pada modul string terdapat fungsi-fungsi yang dapat dioperasikan pada variabel bertipe string seperti di bawah. 

  • 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:

202010011032557366ed1d1cd065772094c278ef164f51.png 

OS

Dokumentasi: https://docs.python.org/3/library/os.html

Modul OS pada Python merupakan modul untuk fungsi-fungsi yang berkaitan dengan sistem operasi, misalnya open(), path(), getcwd(), dan fungsi lainnya. Modul ini memungkinkan Anda untuk memanfaatkan fungsi yang sama dan mengeksekusi fungsi terkait OS yang mungkin berbeda di setiap sistem operasi. Terdapat beberapa fitur yang hanya bekerja pada sistem operasi tertentu.

Contoh kode di bawah menunjukkan fungsi os.getcwd(). Fungsi ini akan mengembalikan string representasi dari Current Working Directory yaitu direktori di mana program Python kita berada. Fungsi ini berlaku di semua OS.

  1. import os
  2. print(os.getcwd())

20201001104157d43fbfb327b7ffeabf0bfaba452ab8f7.png 

File Input/Output

Dokumentasi: https://docs.python.org/3/tutorial/inputoutput.html.

Modul Input/Output adalah modul yang berkaitan untuk fungsi yang mengurus masukan dan keluaran pada Python. Contoh fungsi yang ada pada modul ini adalah fungsi untuk menampilkan hasil dari program Python ke layar dan membaca teks yang kita ketik di keyboard.

Kode di bawah menunjukkan 2 contoh fungsi yang ada pada modul Input/Output yaitu membaca teks yang kita ketik di keyboard dan menampilkan teks tersebut.

  1. string = raw_input("Masukkan sesuatu: ")
  2. print "Input yang masuk adalah : ",  string

 

Pickle

Dokumentasi: https://docs.python.org/3/library/pickle.html.

Jika Anda memiliki sebuah list yang ingin disimpan atau ditransmisikan tanpa khawatir bentuknya akan rusak atau kacau, Anda dapat memanfaatkan fungsi dari library pickle. Pickle merupakan fungsi Object Serialization pada Python. Pickling adalah istilah untuk mengubah objek menjadi byte stream, sedangkan Unpickling adalah perlakuan sebaliknya. 

Kode berikut adalah contoh bagaimana melakukan proses pickle pada sebuah object dictionary dan menyimpannya pada sebuah file.

  1. import pickle
  2. contoh_dictionary = {1:"6", 2:"2", 3:"f"}
  3. pickle_keluar = open("dict.pickle","wb")
  4. pickle.dump(contoh_dictionary, pickle_keluar)
  5. pickle_keluar.close()

 Kode berikut adalah contoh untuk mengekstraksi berkas pickle dan menaruhnya pada sebuah variabel.

  1. pickle_masuk = open("dict.pickle","rb")
  2. contoh_dictionary = pickle.load(pickle_masuk)

  

JSON

Dokumentasi: https://docs.python.org/3/library/json.html.

Untuk serialization dengan bahasa lain, umumnya kita menggunakan JSON (JavaScript Object Notation) yang memiliki beberapa perbedaan karakteristik dengan pickle, yakni:

  • JSON adalah format text-serialization dan umumnya menggunakan Unicode atau UTF-8. Sementara pickle bersifat binary serialization.
  • JSON dapat dibaca dengan mudah oleh manusia, sementara pickle tidak.
  • JSON dapat dioperasikan dan digunakan di luar ekosistem Python. Pickle adalah Python-specific.
  • JSON secara default hanya dapat merepresentasikan subset dari built-in type pada Python.
  • Pickle dapat merepresentasikan hampir (jika tidak seluruh) tipe Python dan secara default melakukan kompresi data.

Seperti yang telah disebutkan sebelumnya, JSON adalah format text yang ditujukan untuk serialization. Agar data dapat dengan mudah ditransmisikan antar berbagai sumber tanpa khawatir bentuknya kacau, menggunakan JSON adalah salah satu pilihan yang tepat.

JSON memiliki format yang hampir mirip dengan dictionary di mana data disimpan dengan format key & value pair. Namun tentunya JSON jauh lebih kompleks dari dictionary. Dapat dilihat dari contoh JSON untuk data pembelian di bawah. Dengan JSON kita dapat menyimpan data dengan lebih terorganisir. Sebuah key seperti children di bawah dapat memiliki sebuah dictionary baru yang berisi informasi terkait objek children tersebut tersebut.

20201001101830737354f3b84fca2dd4c1272d2c158b90.jpeg

Untuk membuat JSON sederhana ketik seperti kode di bawah.

  1. import json
  2.  
  3. # contoh JSON:
  4. x = '{ "nama":"Buchori", 
  5.       "umur":22, 
  6.   "Kota":"New York"}'
  7.  
  8. # parse x:
  9. y = json.loads(x)
  10.  
  11. print(y["umur"])

 

Scrapper 

Dokumentasi urllib: https://docs.python.org/3/library/urllib.html.
Dokumentasi beautifulsoup4: 
https://www.crummy.com/software/BeautifulSoup/bs4/doc/.

Web scrapping adalah sebuah proses terotomasi untuk mendapatkan dan parsing data dari web. Disiplin seperti data science, business intelligence, dan lainnya mendapatkan banyak manfaat dari menganalisis data pada situs-situs yang ada di internet. Ada 2 buah library yang terkenal untuk web scraping yaitu urrlib dan beautifulsoup.

  • Urrlibadalah library bawaan dari Python. Kode di bawah adalah contoh untuk memulai proses scraping pada situs dengan domain python.orgdan menampilkan isi dari tag title dari situs tersebut.
    1. url = "http://python.org/"
    2. page = urlopen(url)
    3. html = page.read().decode("utf-8")
    4. start_index = html.find("<title>") + len("<title>")
    5. end_index = html.find("</title>")
    6. title = html[start_index:end_index]
    7. title
  • Beautifulsoup adalah library yang penggunaanya lebih sederhana dari urrlib. Untuk menggunakan beautifulsoup Anda harus menginstalnya terlebih dahulu. Berikut adalah contoh penulisan kode beautifulsoup.
    1. url = "http://python.org/"
    2. page = urlopen(url)
    3. html = page.read().decode("utf-8")
    4. soup = BeautifulSoup(html, "html.parser")
    5. soup.title


Regex

Dokumentasi: https://docs.python.org/3/library/re.html.

Regex atau regular expression adalah sebuah cara untuk mencari teks berdasarkan pola tertentu. Ketika kita ingin mencari sebuah kata dalam kamus, misalnya arti dari kata parsing, kita akan mencari kata tersebut di halaman yang yang memiliki kata dengan awalan p, atau pa. Regex bekerja dengan konsep yang sama. Pada regex, kita mencari sebuah kata atau kumpulan kata dengan memberikan pola yang kita inginkan. Contoh umum regex adalah pada email di mana kita dapat menggunakan regex untuk mengecek apakah karakter @ ada pada email atau tidak.

Contoh di bawah menunjukkan penggunaan regex. Pada variabel pattern di bawah, ^a berarti kita ingin mencari teks dengan awalan 'a', dan s$ berarti kita ingin mencari string berakhiran 's'.

  1. import re
  2.  
  3. pola= '^a...s$'
  4. string_tes= 'abyss'
  5. hasil= re.match(pola, string_tes)
  6.  
  7. if hasil:
  8.     print("Pencarian berhasil.")
  9. else:
  10.     print("Pencarian gagal.")


Argument Parser

Dokumentasi Getopt: https://docs.python.org/3.8/library/getopt.html.
Dokumentasi ArgParse: https://docs.python.org/3.8/library/argparse.html.

Argument parser bermanfaat jika kita ingin membuat program atau skrip kecil yang langsung menerima parameter pada saat pemanggilan program. Hal ini biasa digunakan dalam pemanggilan aplikasi atau skrip di CLI/terminal *nix-based misalnya linux dan MacOS. Contoh perintah dimaksud adalah:

  1. python panggildicoding.py -o

Contoh dengan menggunakan ArgParse untuk menambahkan Argument yang bersifat opsional / tidak wajib:

file: panggildicoding.py

  1. import argparse
  2.  
  3. parser = argparse.ArgumentParser()
  4. parser.add_argument('-o', '--output', action='store_true', help="tampilkan output")
  5. args = parser.parse_args()
  6.  
  7. if args.output:
  8. print("Halo, ini merupakan sebuah output dari panggildicoding.py")

Maka pada saat dijalankan, terdapat beberapa hal yaitu:

  • Berkas panggildicoding.py 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 panggildicoding.py.
  • Jika kita memanggil --help, maka akan tampil help dengan penjelasan "tampilkan output".
    202010011654336745b3a38728ed34d7676316ba25ddef.jpeg

Kita juga bisa membuat argumennya bersifat wajib. Modifikasi berkas panggildicoding.py menjadi seperti berikut:

  1. import argparse
  2.  
  3. parser = argparse.ArgumentParser()
  4. parser.add_argument('-n', '--nama', required=True, help="Masukkan Nama Anda")
  5. args = parser.parse_args()
  6.  
  7. print("Terima kasih telah menggunakan panggildicoding.py, "+args.nama)

Maka pada saat dijalankan, terdapat beberapa hal yaitu:

  • Berkas panggildicoding.py 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 panggildicoding.py NAMAKITA.
  • Jika kita memanggil --help, maka akan tampil help dengan penjelasan "Masukkan Nama Anda".
    202010011654486c5da42aa448e80528f0620cd0d80107.jpeg 

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:

20201001113121acd3ec72f4ccd9b04beb7cca9b172b67.png

Ketentuan skrip:

  • Berkas panggildicoding.py 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.

Ref : [1]