From ee5eaa2044c5ece2d490cfa2165da91d36956187 Mon Sep 17 00:00:00 2001 From: novalagung Date: Fri, 8 May 2026 22:20:34 +0700 Subject: [PATCH] feat: add new chapter: pip & dependency --- docs/basic/abstract-method.md | 10 +- docs/basic/class-constructor.md | 14 +- docs/basic/class-inheritance.md | 26 +-- docs/basic/class-method.md | 18 +- docs/basic/class-object.md | 18 +- docs/basic/cli-arguments-flags.md | 10 +- docs/basic/csv.md | 16 +- docs/basic/dataclass.md | 18 +- docs/basic/datetime-parsing-formatting.md | 16 +- docs/basic/datetime-timezone.md | 12 +- docs/basic/decorator.md | 16 +- docs/basic/del.md | 8 +- docs/basic/docstring.md | 12 +- .../basic/duck-typing-vs-structural-typing.md | 10 +- docs/basic/enum.md | 18 +- docs/basic/error-exception.md | 14 +- docs/basic/eval-exec.md | 16 +- ...eption-handling-try-except-else-finally.md | 16 +- docs/basic/file.md | 30 +-- docs/basic/generator-yield.md | 12 +- .../instance-attribute-class-attribute.md | 12 +- docs/basic/instance-method.md | 20 +- docs/basic/iterable-iterator.md | 12 +- docs/basic/json.md | 8 +- docs/basic/local-global-var.md | 16 +- docs/basic/none.md | 10 +- docs/basic/pack-unpack-elements.md | 14 +- docs/basic/packages.md | 15 +- docs/basic/pattern-matching.md | 14 +- docs/basic/pip.md | 181 ++++++++++++++++++ docs/basic/property-visibility.md | 8 +- docs/basic/special-names.md | 24 +-- docs/basic/static-method.md | 12 +- 33 files changed, 419 insertions(+), 237 deletions(-) create mode 100644 docs/basic/pip.md diff --git a/docs/basic/abstract-method.md b/docs/basic/abstract-method.md index 8e6615cb..7e60c741 100644 --- a/docs/basic/abstract-method.md +++ b/docs/basic/abstract-method.md @@ -1,12 +1,12 @@ --- -sidebar_position: 42 -title: A.42. Python OOP ➜ Abstract Method -sidebar_label: A.42. OOP ➜ Abstract Method +sidebar_position: 43 +title: A.43. Python OOP ➜ Abstract Method +sidebar_label: A.43. OOP ➜ Abstract Method --- Pada chapter ini kita akan mempelajari tentang apa itu abstract method beserta bagaimana penerapannya pada pemrograman OOP menggunakan Python. -## A.42.1. Pengenalan abstract method +## A.43.1. Pengenalan abstract method Abstract method merupakan jenis method yang dideklarasikan dengan isi tidak melakukan apa-apa, hanya statement `pass`. Nantinya ketika class (dimana method tersebut berada) di-inherit ke sub class lain, maka sub-class harus meng-override method milik super class tersebut. @@ -78,7 +78,7 @@ Kode di atas ketika di-run tidak menghasilkan error, berjalan normal, hanya saja Di *real life*, ukuran source code yang kita maintain bisa saja berisi ratusan atau bahkan puluhan ribu baris dengan jumlah file sangat banyak. Di case yang seperti itu cukup susah mengecek mana class yang implementasinya sudah sesuai spesifikasi dan mana yang belum, karena saat program dijalankan tidak ada error atau warning. Untuk mengatasi masalah tersebut, solusinya adalah dengan mengimplementasikan abstract method. -## A.42.2. Praktek abstract method +## A.43.2. Praktek abstract method Di Python versi 3.4+, suatu method menjadi abstract method ketika memenuhi kriteria berikut: diff --git a/docs/basic/class-constructor.md b/docs/basic/class-constructor.md index 95c81015..a60f61aa 100644 --- a/docs/basic/class-constructor.md +++ b/docs/basic/class-constructor.md @@ -1,14 +1,14 @@ --- -sidebar_position: 35 -title: A.35. Python OOP ➜ Constructor -sidebar_label: A.35. OOP ➜ Constructor +sidebar_position: 36 +title: A.36. Python OOP ➜ Constructor +sidebar_label: A.36. OOP ➜ Constructor --- Constructor/konstruktor adalah salah satu topik penting dalam pemrograman berbasis object (OOP). Konstruktor sendiri adalah fungsi khusus yang dipanggil saat pembuatan object dilakukan dari suatu class. Pada chapter ini kita akan belajar tentang konstruktor dan apa saja yang bisa dilakukan didalamnya. -## A.35.1. Pengenalan constructor +## A.36.1. Pengenalan constructor Di bahasa yang mengadopsi konsep OOP, setiap class memiliki *default constructor*. Sebagai contoh pada statement pembuatan object bertipe class `Car`, syntax `Car()` digunakan dan syntax tersebut merupakan contoh penerapan pengaksesan konstruktor. @@ -72,7 +72,7 @@ mount_kilimanjaro.info() Pada contoh di atas, konstruktor `__init__(self)` meng-override default constructor milik class `Mountain` dan digunakan untuk deklarasi instance attribute. -## A.35.2. Constructor dengan custom param +## A.36.2. Constructor dengan custom param Konstruktor dapat didesain untuk memiliki parameter, dan metode ini sangat umum diterapkan. @@ -109,7 +109,7 @@ mount_kilimanjaro.info() Seperti halnya method, parameter pertama konstruktor harus `self`. Dari sini bisa disimpulkan berarti penambahan parameter harus dituliskan setelah `self`. Bisa dilihat di deklarasi konstruktor class `Mountain`, disitu ada tiga buah parameter dideklarasikan setelah `self`. -## A.35.3. Constructor overloading +## A.36.3. Constructor overloading Overloading merupakan istilah OOP untuk pembuatan banyak konstruktor dengan jumlah dan tipe parameter berbeda. @@ -160,7 +160,7 @@ Penjelasan: Silakan coba explore dengan mempraktekan penggunaan \*args / \*\*kwargs pada konstruktor. -## A.35.4. Constructor dengan return type `None` +## A.36.4. Constructor dengan return type `None` Constructor dipanggil saat inisialisasi object, maka bisa dibilang bahwa constructor tersebut selalu mengembalikan tipe data bertipe class dimana constructor tersebut dideklarasikan. diff --git a/docs/basic/class-inheritance.md b/docs/basic/class-inheritance.md index a5971606..9dfbfa41 100644 --- a/docs/basic/class-inheritance.md +++ b/docs/basic/class-inheritance.md @@ -1,12 +1,12 @@ --- -sidebar_position: 41 -title: A.41. Python OOP ➜ Class Inheritance -sidebar_label: A.41. OOP ➜ Class Inheritance +sidebar_position: 42 +title: A.42. Python OOP ➜ Class Inheritance +sidebar_label: A.42. OOP ➜ Class Inheritance --- Chapter ini membahas tentang salah satu aspek penting dalam pemrograman OOP, yaitu inheritance atau pewarisan sifat, dimana sifat yang dimaksud adalah property seperti attribute, method, dan lainnya. -## A.41.1. Pengenalan Inheritance +## A.42.1. Pengenalan Inheritance Untuk mewujudkan inheritance setidaknya dua buah class dibutuhkan: @@ -89,7 +89,7 @@ v3.info() Bisa dilihat dari contoh, bahwa property milik class `Vehicle` bisa diakses via instance object yang dibuat dari class itu sendiri maupun dari object yang dibuat dari subclass `ElectricCar`. -## A.41.2. Class `object` inheritance +## A.42.2. Class `object` inheritance Python memiliki class bawaan bernama `object` yang pada praktiknya otomatis menjadi super class dari semua class bawaan Python maupun custom class yang kita buat sendiri. @@ -136,7 +136,7 @@ if isinstance(v2, object): # v2 class inherit from class object ``` -## A.41.3. Constructor overriding +## A.42.3. Constructor overriding *Overriding* adalah istilah pemrograman OOP untuk menimpa/mengganti suatu method dengan method baru yang nama dan strukturnya sama tapi isinya berbeda. @@ -203,7 +203,7 @@ AttributeError: 'ElectricCar' object has no attribute 'number_of_wheels' Solusi permasalahan di atas ada pada penjelasan section berikut ini. -## A.41.4. Fungsi `super()` +## A.42.4. Fungsi `super()` Fungsi `super()` adalah salah satu fungsi istimewa bawaan python, yang ketika diakses di dalam suatu instance method maka pemanggilannya mengarah ke variabel `self` milik super class (bukan variabel `self` milik class itu sendiri). @@ -281,7 +281,7 @@ Jika dianalogikan, bisa dibilang kode di atas adalah ekuivalen dengan kode ke-2 Sampai sini semoga cukup jelas. -## A.41.5. Alternatif cara mengakses super class constructor +## A.42.5. Alternatif cara mengakses super class constructor Selain menggunakan `super().__init__()` ada cara lain untuk memanggil konstruktor super class, yaitu dengan mengakses method `__init__()` via class secara langsung. Contoh: @@ -309,7 +309,7 @@ Statement `Vehicle.__init__(self)` pada kode di atas adalah ekuivalen dengan kod Teknik pemanggilan constructor via class ini lebih sering digunakan pada class yang memiliki parent class lebih dari satu. Lebih jelasnya akan kita bahas di bawah. -## A.41.6. Method overriding +## A.42.6. Method overriding Tidak hanya constructor, method super class juga bisa di-override dengan method baru. Pada kode berikut, method `drive_sound()` di-override dengan isi mengembalikan nilai string berbeda, yang sebelumnya `vroom vroooommmm` kini menjadi `zzzzzzz`. @@ -353,7 +353,7 @@ Dalam konteks inheritance, ketika di sub class terdapat method dengan nama yang - Object `v1` dibuat via class `Vehicle`, pengaksesan method `drive_sound()` mengarah ke method milik class tersebut - Object `v2` dibuat via class `ElectricCar`, pengaksesan method `drive_sound()` (yang dilakukan secara implisit via method `info()`) mengarah ke method milik class tersebut, dan bukan milik super class. -## A.41.7. Aturan overriding +## A.42.7. Aturan overriding Setiap bahasa pemrograman yang mengadopsi OOP, aturan penerapan method overriding berbeda satu sama lain. Di Python sendiri, method dianggap meng-override suatu method atau constructor super class jika namanya adalah dideklarasikan sama persis. Perihal apakah skema parameter-nya diubah, atau return type-nya diubah, itu tidak menjadi syarat wajib overriding. @@ -392,7 +392,7 @@ v2.info() Method `drive_sound()` di-override dengan diubah skema parameternya, dari yang tidak memiliki parameter sekarang menjadi memiliki parameter `sound`. Selain itu tipe datanya juga diubah, dari yang sebelumnya string menjadi tuple. -## A.41.8. Nested inheritance +## A.42.8. Nested inheritance Penerapan inheritance tidak hanya terbatas pada dua buah class saja, melainkan bisa lebih. Class bisa diturunkan, kemudian turunannya diturunkan lagi, dan seterusnya. @@ -440,7 +440,7 @@ v3.info() # output ➜ electric car has 4 wheels. engine sound: ('friendly sound', 'zzzzzzz') ``` -## A.41.9. Special name ➜ class attribute `__mro__` +## A.42.9. Special name ➜ class attribute `__mro__` Setiap class memiliki class attribute `__mro__` yang berisi informasi hirarki class itu sendiri. Attribute tersebut bertipe data tuple. Dari nilai balik attribute tersebut gunakan perulangan untuk mengiterasi seluruh elemennya. @@ -479,7 +479,7 @@ Hirarki paling atas semua class selalu class `object`. > MRO sendiri merupakan kependekan dari istilah **Method Resolution Order** -## A.41.10. Multiple inheritance +## A.42.10. Multiple inheritance Suatu class tidak dibatasi hanya bisa menjadi sub class dari 1 buah class saja. Bisa jadi ada lebih dari 1 class yang diturunkan dengan level hirarki yang sama. diff --git a/docs/basic/class-method.md b/docs/basic/class-method.md index eb6fec76..9f256377 100644 --- a/docs/basic/class-method.md +++ b/docs/basic/class-method.md @@ -1,12 +1,12 @@ --- -sidebar_position: 38 -title: A.38. Python OOP ➜ Class Method -sidebar_label: A.38. OOP ➜ Class Method +sidebar_position: 39 +title: A.39. Python OOP ➜ Class Method +sidebar_label: A.39. OOP ➜ Class Method --- Pada chapter ini kita akan belajar tentang jenis method lain yang tersedia di Python, yaitu class method, serta perbedaannya dibanding instance method dan constructor. -## A.38.1. Pengenalan Class method +## A.39.1. Pengenalan Class method Class method adalah method yang pemiliknya adalah class dengan pengaksesan adalah via class, berbeda dibanding instance method yang diperuntukan untuk instance object. Jika instance method memiliki parameter `self` yang isinya adalah instance object, maka class method memiliki parameter `cls` yang isinya adalah tipe data class. @@ -70,7 +70,7 @@ p3.info() > Parameter `cls` bisa disebut dengan parameter *implicit* atau implisit karena kita tidak berinteraksi secara langsung saat pengisian nilai. Nilai `cls` otomatis terisi saat class method diakses. -## A.38.2. Class method parameter +## A.39.2. Class method parameter Class method juga bisa memiliki parameter seperti umumnya fungsi. Jika pada instance method dan constructor parameter adalah ditulis setelah `self`, pada class method parameter ditulis setelah `cls`. Contoh: @@ -141,7 +141,7 @@ Sebagai perbandingan, kedua bentuk pemanggilan constructor via `cls()` berikut a return obj ``` -## A.38.3. Pengaksesan class method via instance object +## A.39.3. Pengaksesan class method via instance object Sampai sini penulis rasa bisa dipahami perbedaan cara pengaksesan antara instance method dan class method. Instance method diakses via instance object, dan class method diakses via class. @@ -185,7 +185,7 @@ Dari kode di atas bisa dilihat perbedaan dari sisi pembuatan object dan pengakse Yang menarik untuk dibahas adalah `p5`. Object `p5` dibuat dari pemanggilan class method `create()` namun pengaksesannya adalah via instance object `p2`. Penulisan seperti itu diperbolehkan. Parameter `cls` pada class method `create()` akan terisi dengan nilai tipe data class object `p2` (yaitu `ClanHouse`). -## A.38.4. Pengaksesan instance method via class +## A.39.4. Pengaksesan instance method via class Jika class method bisa diakses via instance object, instance method juga bisa diakses via Class. Caranya cukup panggil instance method via class lalu isi parameter `self` dengan instance object. Contoh: @@ -205,7 +205,7 @@ ClanHouse.info(p5) Pengaksesan instance method via class mengharuskan parameter `self` milik method untuk diisi dengan object. Hal ini berbeda dibanding pengaksesan instance method via instance object dimana parameter `self` otomatis terisi nilai instance object. -## A.38.5. Pengaksesan class attribute via `cls` +## A.39.5. Pengaksesan class attribute via `cls` Pada chapter sebelumnya, [OOP ➜ Instance Attribute & Class Attribute](/basic/instance-attribute-class-attribute), kita telah mempelajari tentang perbedaan instance attribute dibanding class attribute. @@ -241,7 +241,7 @@ Output program: ![class method](img/class-method-1.png) -## A.38.6. Summary +## A.39.6. Summary Dari banyak hal yang telah dipelajari di chapter ini, secara garis besar perbedaan antara constructor, instance method, dan class method bisa dilihat di bawah ini: diff --git a/docs/basic/class-object.md b/docs/basic/class-object.md index fd8aa444..3cc26622 100644 --- a/docs/basic/class-object.md +++ b/docs/basic/class-object.md @@ -1,14 +1,14 @@ --- -sidebar_position: 33 -title: A.33. Python OOP ➜ Class & Object -sidebar_label: A.33. OOP ➜ Class & Object +sidebar_position: 34 +title: A.34. Python OOP ➜ Class & Object +sidebar_label: A.34. OOP ➜ Class & Object --- Python mendukung paradigma pemrograman berbasis objek (OOP) melalui implementasi Class dan Object API. Pada bab ini, kita akan mempelajari konsep dasar beserta penerapannya. > Pembahasan OOP pada ebook ini lebih fokus pada pengaplikasiannya di Python. Jadi pembahasan teorinya tidak terlalu banyak. -## A.33.1. Pengenalan Class +## A.34.1. Pengenalan Class Class adalah *blueprint* untuk membuat variabel, class bisa diartikan juga sebagai tipe data. Di Python, setiap data pasti memiliki tipe data yang tipe tersebut adalah class. Sebagai contoh: @@ -56,11 +56,11 @@ class Car: > Pembahasan detail mengenai keyword `pass` ada di chapter [Function section Keyword pass](/basic/function#a225-keyword-pass) -## A.33.2. Naming convention class +## A.34.2. Naming convention class Berdasarkan dokumentasi [PEP 8 – Style Guide for Python Code](https://peps.python.org/pep-0008/), disarankan untuk menulis nama class dalam bentuk TitleCase, contoh: `FavoriteFood`. -## A.33.3. Pembuatan Instance object +## A.34.3. Pembuatan Instance object Object (atau instance object) adalah variabel yang dibuat dari class. Cara pembuatan object adalah dengan memanggil nama class diikuti oleh tanda kurung fungsi `()` (seperti pemanggilan fungsi). Statement tersebut mengembalikan nilai balik berupa object baru yang bertipe data sesuai dengan class yang digunakan. @@ -104,7 +104,7 @@ car2 = Car() car3 = Car() ``` -## A.33.4. Instance Attribute +## A.34.4. Instance Attribute Salah satu property class adalah attribute. Attribute adalah variabel yang terasosiasi dengan class, jadi dalam pengaksesannya harus dilakukan melalui class dan/atau instance object. @@ -175,7 +175,7 @@ Jalankan program untuk melihat outputnya: > > Perbedaan utama dari keduanya adalah pada dictionary key-nya bisa dikelola secara dinamis, sedangkan pada class nama attribute-nya adalah fixed. -## A.33.5. Pengecekan instance object +## A.34.5. Pengecekan instance object Fungsi `isinstance()` cukup berguna untuk mengecek apakah suatu instance object tipe datanya adalah class tertentu atau class yang meng-*inherit* class tertentu. @@ -192,7 +192,7 @@ if isinstance(car1, Car): # output ➜ car1 class is Car ``` -## A.33.6. Class turunan `object` +## A.34.6. Class turunan `object` Setiap class yang ada di Python baik itu class bawaan Python Standard Library ataupun custom class, secara otomatis adalah turunan dari class bernama `object`. diff --git a/docs/basic/cli-arguments-flags.md b/docs/basic/cli-arguments-flags.md index 8d41fab6..058314ea 100644 --- a/docs/basic/cli-arguments-flags.md +++ b/docs/basic/cli-arguments-flags.md @@ -1,14 +1,14 @@ --- -sidebar_position: 50 -title: A.50. Python CLI Arguments & Flags -sidebar_label: A.50. CLI Arguments & Flags +sidebar_position: 51 +title: A.51. Python CLI Arguments & Flags +sidebar_label: A.51. CLI Arguments & Flags --- Chapter ini membahas tentang pengaksesan CLI argument eksekusi program Python. Yang dimaksud dengan argument adalah apapun yang ditulis setelah command `python` (atau `python.exe` di Windows). Umumnya program yang dibuat untuk keperluan tooling ataupun utility lainnya banyak memanfaatkan *command line interface* arguments ini. Python mengenal 2 jenis CLI arguments, yaitu raw arguments (atau cukup arguments) dan flags, keduanya dibahas di sini. -## A.50.1. CLI arguments `sys.argv` +## A.51.1. CLI arguments `sys.argv` Data CLI argument eksekusi program bisa diakses via `sys.argv`. Variabel `sys.argv` ini berisi data argument bertipe string tersimpan dalam list. @@ -87,7 +87,7 @@ Output program: ![Python CLI Arguments & Flags](img/cli-arguments-flags-2.png) -## A.50.2. CLI flags `argparse` +## A.51.2. CLI flags `argparse` Flags adalah istilah untuk argument dengan label. Contohnya seperti `python main.py --name Noval` adalah contoh pengaplikasian flag, dengan label adalah `--name` berisi data string `Noval`. diff --git a/docs/basic/csv.md b/docs/basic/csv.md index 31a84a70..226f2bcd 100644 --- a/docs/basic/csv.md +++ b/docs/basic/csv.md @@ -1,7 +1,7 @@ --- -sidebar_position: 51 -title: A.51. Python CSV File/Data Format -sidebar_label: A.51. File/Data Format ➜ CSV +sidebar_position: 52 +title: A.52. Python CSV File/Data Format +sidebar_label: A.52. File/Data Format ➜ CSV --- Pada chapter ini kita akan belajar tentang penggunaan Python untuk membaca dan mengelola data CSV. @@ -27,7 +27,7 @@ Penjelasan singkat tentang CSV: ::: -## A.51.1. Implementasi CSV di Python +## A.52.1. Implementasi CSV di Python Python menyediakan beberapa API untuk berinteraksi dengan data CSV, ada `csv.DictWriter()` dan `csv.writer()` untuk operasi tulis data, dan `csv.DictReader()` dan `csv.reader()` untuk operasi baca data. @@ -72,7 +72,7 @@ Program yang dibuat adalah aplikasi CLI interaktif, dimana user bisa berinteraks Selanjutnya, program dimodifikasi dengan penambahan implementasi untuk masing-masing mode. -## A.51.2. Insert data CSV +## A.52.2. Insert data CSV Sebuah file CSV akan dibuat dan difungsikan sebagai *database* untuk penyimpanan data yang di-insert via program. File CSV berisi 3 buah kolom data point: @@ -167,7 +167,7 @@ Jalankan program lalu coba test fungsionalitasnya dengan insert beberapa data. B ![Python CSV](img/csv-2.png) -## A.51.3. Read data CSV +## A.52.3. Read data CSV Operasi baca data dilakukan via fungsi `csv.DictReader()` dengan argument parameter adalah object file. Lewat object reader, gunakan fungsi `enumerate()` untuk membungkusnya lalu lakukan iterasi menggunakan keyword `for`. Lebih jelasnya silakan lihat kode `read_data()` berikut, dan tak lupa tambahkan ke program. @@ -212,7 +212,7 @@ Sekarang jalankan program untuk pengetesan. Bisa dilihat isi data yang muncul via pemanggilan fungsi `read_data()` sesuai dengan data yang di-insert. -## A.51.4. Delete data CSV +## A.52.4. Delete data CSV Operasi delete data bisa dilakukan dengan menuliskan ulang isi file CSV tetapi meng-exclude data yang ingin dihapus. Kurang lebih kodenya seperti ini: @@ -274,7 +274,7 @@ Jalankan ulang program, test fungsionalitas mode 1, 2, dan 3. Kurang lebih seperti itu penerapan operasi CSV di Python. Silakan lanjut explore dan praktek dengan pembuatan program sejenis lainnya agar makin paham. -## A.51.5. `csv.writer()` dan `csv.reader()` +## A.52.5. `csv.writer()` dan `csv.reader()` Selain menggunakan fungsi `csv.DictWriter()` dan `csv.DictReader()`, operasi baca tulis CSV bisa dilakukan menggunakan fungsi `csv.writer()` dan `csv.reader()`. diff --git a/docs/basic/dataclass.md b/docs/basic/dataclass.md index d4d2b0d3..1688b804 100644 --- a/docs/basic/dataclass.md +++ b/docs/basic/dataclass.md @@ -1,14 +1,14 @@ --- -sidebar_position: 43 -title: A.43. Python OOP ➜ DataClass -sidebar_label: A.43. OOP ➜ DataClass +sidebar_position: 44 +title: A.44. Python OOP ➜ DataClass +sidebar_label: A.44. OOP ➜ DataClass --- Data class adalah class yang didesain khusus untuk tujuan penyimpanan data. Python menyediakan module bernama `dataclasses` dengan isi beberapa API untuk mempermudah pembuatan data class. Pada chapter ini kita akan mempelajarinya. -## A.43.1. Pengenalan Data Class +## A.44.1. Pengenalan Data Class Di bawah ini dicontohkan class bernama `Planet` disiapkan untuk pembuatan data berisi informasi planet. Class ini memiliki 3 buah instance attribute, yaitu `name`, `diameter`, dan `natural_satellites`. Deklarasi attribute ditulis dalam fungsi `__init__()`. @@ -90,7 +90,7 @@ Cukup tambahkan decorator `@dataclass` saat deklarasi class, lalu tulis attribut self.natural_satellites = natural_satellites ``` -## A.43.2. Attribute mutability +## A.44.2. Attribute mutability Selayaknya seperti class biasa, instance attribute dataclass adalah *mutable* atau bisa diubah nilainya. Contoh penerapan: @@ -103,7 +103,7 @@ print(f"{mars.name} | {mars.diameter} km | {len(mars.natural_satellites)} moons" # output ➜ Red Planet | 6779 km | 2 moons ``` -## A.43.3. Instance method +## A.44.3. Instance method Data class bisa memiliki instance method dengan penulisan deklarasi sama persis seperti deklarasi method pada umumnya. Contohnya bisa dilihat di bawah ini, dimana ada data class bernama `Country` berisi 3 buah instance attribute dan satu buah instance method bernama `info()`. @@ -133,7 +133,7 @@ for c in countries: # Mongolia | 4 seasons | 3.398 million population ``` -## A.43.4. Attribute default value +## A.44.4. Attribute default value Attribute data class bisa ditentukan nilai defaultnya menggunakan operator assignment `=` (penulisannya seperti deklarasi variabel). Dengan memberikan nilai default pada attribute, menjadikan parameter konstruktor menjadi opsional. Contoh: @@ -152,7 +152,7 @@ print(c.info()) # output ➜ Indonesia | 2 seasons | 275.5 million population ``` -## A.43.5. Frozen attribute +## A.44.5. Frozen attribute Frozen data class adalah data class yang *immutable*, artinya setelah dideklarasikan maka tidak bisa diubah nilai attribute-nya. Cara meng-enable frozen attribute adalah dengan menambahkan `frozen=True` pada decorator `@dataclass`. @@ -172,7 +172,7 @@ Kode di atas menghasilkan error karena semua attribute class `Fruit` immutable. ![Data class Python](img/dataclass-1.png) -## A.43.6. Inheritance +## A.44.6. Inheritance Data class bisa diturunkan seperti umumnya class dengan cara penulisan masih sama. Contoh: diff --git a/docs/basic/datetime-parsing-formatting.md b/docs/basic/datetime-parsing-formatting.md index ad906758..f1aef3e2 100644 --- a/docs/basic/datetime-parsing-formatting.md +++ b/docs/basic/datetime-parsing-formatting.md @@ -1,12 +1,12 @@ --- -sidebar_position: 54 -title: A.54. Python DateTime Parsing & Formatting -sidebar_label: A.54. DateTime ➜ Parsing & Formatting +sidebar_position: 55 +title: A.55. Python DateTime Parsing & Formatting +sidebar_label: A.55. DateTime ➜ Parsing & Formatting --- Chapter ini merupakan lanjutan dari chapter sebelumnya. Di sini kita akan belajar tentang teknik parsing dan formatting pada tipe data `datetime`. -## A.54.1. Parsing `datetime` +## A.55.1. Parsing `datetime` Parsing adalah teknik konversi data date time berbentuk string ke tipe data `datetime`. Ada beberapa method yang tersedia untuk kebutuhan operasi ini: @@ -47,7 +47,7 @@ Contoh implementasinya seperti ini: # output ➜ datetime: 1985-04-12 23:20:50.520000+07:00 ``` -Selengkapnya silakan cek di bagian [A.54.3. Tabel kode format](/basic/datetime-parsing-formatting#a543-tabel-kode-format). +Selengkapnya silakan cek di bagian [A.55.3. Tabel kode format](/basic/datetime-parsing-formatting#a543-tabel-kode-format). ### ◉ Via `datetime.fromisoformat()` terhadap data ISO Date Time (ISO 8601) @@ -105,7 +105,7 @@ print("datetime:", data_datetime) Selengkapnya mengenai format yang didukung oleh parser ini bisa di cek di halaman dokumentasi Python https://dateutil.readthedocs.io/en/stable/parser.html -## A.54.2. Formatting `datetime` +## A.55.2. Formatting `datetime` Formatting adalah teknik untuk memformat data `datetime` menjadi bentuk string dengan susunan/format sesuai keinginan. Beberapa method untuk operasi formatting datetime bisa dilihat di bawah ini: @@ -127,7 +127,7 @@ print(data_datetime.strftime('%m/%d/%Y %H:%M:%S %z')) # output ➜ 04/12/1985 23:20:50 +0700 ``` -Selengkapnya silakan cek di bagian [A.54.3. Tabel kode format](/basic/datetime-parsing-formatting#a543-tabel-kode-format). +Selengkapnya silakan cek di bagian [A.55.3. Tabel kode format](/basic/datetime-parsing-formatting#a543-tabel-kode-format). ### ◉ Method `datetime.isoformat()` ➜ ISO Date Time (ISO 8601) @@ -149,7 +149,7 @@ print(data_datetime.timestamp()) # output ➜ 1703314863.975431 ``` -## A.54.3. Tabel kode format +## A.55.3. Tabel kode format Tabel kode format sesuai 1989 C standard: diff --git a/docs/basic/datetime-timezone.md b/docs/basic/datetime-timezone.md index 55a62745..cc98f8e4 100644 --- a/docs/basic/datetime-timezone.md +++ b/docs/basic/datetime-timezone.md @@ -1,12 +1,12 @@ --- -sidebar_position: 53 -title: A.53. Python Date, Time, DateTime, Timezone -sidebar_label: A.53. Date, Time, DateTime, Timezone +sidebar_position: 54 +title: A.54. Python Date, Time, DateTime, Timezone +sidebar_label: A.54. Date, Time, DateTime, Timezone --- Pada chapter ini kita akan belajar tentang tipe data `date`, `time`, `datetime` untuk penyimpanan informasi tanggal dan waktu di Python, serta peran dari tipe data `timezone` untuk penentuan zona waktu. -## A.53.1. Pengenalan `date`, `time`, dan `datetime` +## A.54.1. Pengenalan `date`, `time`, dan `datetime` Python menyediakan package `datetime` berisi banyak sekali API untuk keperluan operasi data yang berhubungan dengan tanggal dan waktu. Tiga diantaranya adalah tipe data berikut: @@ -135,9 +135,9 @@ print("sekarang (date):", data2) > Kode di atas outputnya adalah sesuai dengan output program di local penulis saat program di run. Di tempat pembaca output pastinya berbeda. -## A.53.2. Pengenalan timezone (`tz`) +## A.54.2. Pengenalan timezone (`tz`) -Setiap tipe data yang menyimpan informasi waktu (seperti `time` dan `datetime`) didalamnya ada informasi timezone yang bisa diakses ataupun ditentukan saat pembuatan data. Informasi timezone direpresentasikan menggunakan `dateutil.tz`, tipe data `tz` dalam package `dateutil`. +Setiap tipe data yang menyimpan informasi waktu (seperti `time` dan `datetime`) didalamnya ada informasi timezone yang bisa diakses ataupun ditentukan saat pembuatan data. Informasi timezone direpresentasikan menggunakan `dateutil.tz`, tipe data `tz` dalam package `dateutil` (package pihak ketiga, perlu di-install via `pip install python-dateutil`). Method `tz.gettz()` digunakan untuk membuat data timezone. Contoh pengaplikasiannya: diff --git a/docs/basic/decorator.md b/docs/basic/decorator.md index 0bc83397..76b1ddf0 100644 --- a/docs/basic/decorator.md +++ b/docs/basic/decorator.md @@ -1,12 +1,12 @@ --- -sidebar_position: 40 -title: A.40. Python Decorator -sidebar_label: A.40. Function ➜ Decorator +sidebar_position: 41 +title: A.41. Python Decorator +sidebar_label: A.41. Function ➜ Decorator --- Chapter ini membahas tentang decorator, yaitu syntax yang penulisannya diawali dengan huruf `@` dituliskan tepat sebelum deklarasi fungsi atau method. -## A.40.1. Pengenalan decorator +## A.41.1. Pengenalan decorator Pada dua chapter sebelumnya ([OOP ➜ Class Method](/basic/class-method) dan [OOP ➜ Static Method](/basic/static-method)) kita telah mempelajari 2 buah decorator, yaitu `@classmethod` dan `@staticmethod`. @@ -21,7 +21,7 @@ Selain dua decorator tersebut, ada juga beberapa lainnya yang nantinya akan diba Selain menggunakan decorator bawaan Python, kita juga bisa membuat custom decorator sendiri yang bisa kita desain sesuai kebutuhan. Pada chapter ini kita akan mempelajari caranya. -## A.40.2. Custom decorator +## A.41.2. Custom decorator Decorator sebenarnya adalah sebuah fungsi, yang menerima parameter berupa fungsi, yang isinya juga mengembalikan fungsi/closure. @@ -100,7 +100,7 @@ print("fungsi telah selesai dieksekusi, nilai baliknya:", res) Sampai sini semoga cukup jelas. Selanjutnya kita akan praktek penerapan decorator untuk case yang tidak sesederhana contoh di atas, dengan harapan pemahaman pembaca mengenai topik decorator ini makin mantab. -## A.40.3. Contoh penerapan custom decorator +## A.41.3. Contoh penerapan custom decorator Pada praktek selanjutnya ini, kita akan membuat program yang memunculkan list berisi angka random. Kemudian dari list tersebut dibentuk sebuah list baru berisi elemen unik, lalu darinya dibuat list baru lagi yang isi elemen uniknya diurutkan secara *descending*. @@ -224,7 +224,7 @@ Selanjutnya, dua buah fungsi baru dibuat yang masing-masing menggunakan decorato print(res) ``` -## A.40.4. Chaining decorator +## A.41.4. Chaining decorator Chaining decorator adalah istilah untuk penerapan lebih dari satu decorator pada sebuah fungsi. Pada contoh di atas, fungsi ditempeli hanya satu decorator saja. Pada praktiknya, fungsi bisa saja menggunakan lebih dari 1 decorator. @@ -282,7 +282,7 @@ data3 = decorator_reverse_list(data2) print(data3) ``` -## A.40.5. **\*args** & **\*\*kwargs** pada decorator +## A.41.5. **\*args** & **\*\*kwargs** pada decorator Idealnya, sebuah decorator dibuat dengan desain parameter se-fleksibel mungkin, karena bisa saja decorator diterapkan pada fungsi dengan berbagai macam skema parameter. diff --git a/docs/basic/del.md b/docs/basic/del.md index 5c7dbe91..7e303b16 100644 --- a/docs/basic/del.md +++ b/docs/basic/del.md @@ -1,14 +1,14 @@ --- -sidebar_position: 55 -title: A.55. Python Delete Object -sidebar_label: A.55. Delete Object +sidebar_position: 56 +title: A.56. Python Delete Object +sidebar_label: A.56. Delete Object --- Pada sekian chapter yang lalu kita telah belajar tentang object [None](/basic/none), fungsinya untuk menandai variabel agar bernilai kosong. Kali ini yang kita pelajari adalah keyword `del` untuk operasi delete object. Hasil penggunaan keyword `del` benar-benar menghapus variabel beserta isinya, jadi tidak hanya mengosongkan nilainya. -## A.55.1. Keyword `del` +## A.56.1. Keyword `del` Penggunaan `None` sebagai nilai suatu variabel menjadikan variabel tersebut tetap ada tapi nilainya berubah menjadi `None`. Jadi penggunaan `None` disini berguna untuk mengosongkan variabel tanpa menghapus variabel itu sendiri. diff --git a/docs/basic/docstring.md b/docs/basic/docstring.md index c203f8e6..39dfe5be 100644 --- a/docs/basic/docstring.md +++ b/docs/basic/docstring.md @@ -1,12 +1,12 @@ --- -sidebar_position: 48 -title: A.48. Python DocString -sidebar_label: A.48. DocString +sidebar_position: 49 +title: A.49. Python DocString +sidebar_label: A.49. DocString --- Pada chapter ini kita akan membahas tentang docstring beserta cara penerapan dan manfaatnya. -## A.48.1. Pengenalan docstring +## A.49.1. Pengenalan docstring Di pembelajaran awal yaitu pada chapter [Komentar](/basic/komentar), telah disinggung bahwa salah satu cara menulis komentar adalah menggunakan karakter `"""` dengan penulisan di awal dan akhir komentar. Contoh: `""" ini komentar """`. @@ -19,7 +19,7 @@ Komentar docstring otomatis menempel pada unit dimana komentar ditulis. Misalnya Perihal unit yang bisa ditempeli docstring bisa berupa fungsi, class, method, atau lainnya. -## A.48.2. Praktek penerapan docstring +## A.49.2. Praktek penerapan docstring Mari kita praktekan agar lebih jelas. Siapkan project sederhana dengan struktur seperti ini. Isinya hanya dua file saja: @@ -193,7 +193,7 @@ Output ketika di-hover: ![Python docstring](img/docstring-5.png) -## A.48.3. Special name ➜ class attribute `__doc__` +## A.49.3. Special name ➜ class attribute `__doc__` Informasi docstring milik fungsi, method, dan class bisa diakses secara excplit menggunakan class attribute `__doc__`. Jika mengacu ke kode yang sudah ditulis, maka pengaksesannya seperti ini: diff --git a/docs/basic/duck-typing-vs-structural-typing.md b/docs/basic/duck-typing-vs-structural-typing.md index 3950f482..d5bdd20a 100644 --- a/docs/basic/duck-typing-vs-structural-typing.md +++ b/docs/basic/duck-typing-vs-structural-typing.md @@ -1,12 +1,12 @@ --- -sidebar_position: 44 -title: A.44. Python Duck Typing vs Structural Typing -sidebar_label: A.44. Duck Typing vs. Structural Typing +sidebar_position: 45 +title: A.45. Python Duck Typing vs Structural Typing +sidebar_label: A.45. Duck Typing vs. Structural Typing --- Pada chapter ini kita akan belajar salah satu konsep yang ada di bahasa pemrograman dinamis, yaitu **duck typing**, beserta perbandingannya dengan **structural typing** -## A.44.1. Duck typing +## A.45.1. Duck typing Istilah *duck typing* berasal dari kalimat *If it looks like a duck and quacks like a duck, it's a duck*. @@ -99,7 +99,7 @@ Hasilnya: OK ✅ Fungsi `do_the_math()` tetap bisa menjalankan tugasnya dengan baik, bahkan untuk argument yang bukan instance object sekalipun. Selama argument memiliki fungsi `calculate_area()` maka semuanya aman terkendali. -## A.44.2. Structural typing +## A.45.2. Structural typing Structural typing bisa diibaratkan sebagai duck typing tapi versi yang lebih ketat. Structural typing mengharuskan suatu fungsi atau method untuk memilki spesifikasi yang sama persis sesuai yang dideklarasikan. Misalnya ada suatu object berisi method dengan hanya nama fungsi dan skema parameternya saja yang sama dibanding yang dibutuhkan, maka itu tidak cukup dan error pasti muncul. diff --git a/docs/basic/enum.md b/docs/basic/enum.md index 2c785223..4470d166 100644 --- a/docs/basic/enum.md +++ b/docs/basic/enum.md @@ -1,14 +1,14 @@ --- -sidebar_position: 56 -title: A.56. Python Enumeration -sidebar_label: A.56. Enumeration +sidebar_position: 57 +title: A.57. Python Enumeration +sidebar_label: A.57. Enumeration --- Enumeration (Enum) adalah nilai konstan, umumnya disiapkan untuk merepresentasikan sekumpulan data konstan yang konteksnya masih sama. Misalnya, **warna** yang isinya bisa merah, biru, kuning, atau warna lain. Pembuatan enum di Python sangat mudah. Caranya dengan mendeklarasikan class baru yang meng-*inherit* class `enum.Enum`, kemudian menuliskan kumpulan data sebagai class property-nya. -## A.56.1. Enum / Enumeration +## A.57.1. Enum / Enumeration Di bawah ini, disiapkan sebuah enum bernama `City` dengan isi ada 4 buah pilihan kota. @@ -45,11 +45,11 @@ print(f"value {city1.value}") Nama enum property bisa diambil menggunakan property `name` sedangkan value-nya diambil via property `value`. -## A.56.2. Naming convention enum +## A.57.2. Naming convention enum Sesuai penjelasan di [halaman dokumentasi Python](https://docs.python.org/3/howto/enum.html), nama class enum dianjurkan ditulis menggunakan **CamelCase**, sedangkan nama class property dituliskan **UPPERCASE**. -## A.56.3. Notasi penulisan pengaksesan enum property +## A.57.3. Notasi penulisan pengaksesan enum property Dalam penggunaannya setidaknya ada 3 notasi pengaksesan enum property yang bisa digunakan. @@ -94,7 +94,7 @@ Dalam penggunaannya setidaknya ada 3 notasi pengaksesan enum property yang bisa Metode ini pas digunakan ketika value enum sudah diketahui nilainya. -## A.56.4. Nilai property enum +## A.57.4. Nilai property enum Property enum nilainya bisa berisi data numerik, string, atau tipe data lainnya. @@ -165,7 +165,7 @@ print(size1, size2) # output ➜ Size.M Size.XL ``` -## A.56.5. Pengecekan nilai enum +## A.57.5. Pengecekan nilai enum Operator identitas `is` dan operator perbandingan `==` dan `!=` bisa digunakan untuk pengecekan nilai enum. @@ -192,7 +192,7 @@ say_anything(city1) # output ➜ monggo ``` -## A.56.6. Perulangan enum +## A.57.6. Perulangan enum Enum merupakan tipe yang bisa langsung digunakan pada perulangan. Contoh penggunaannya: diff --git a/docs/basic/error-exception.md b/docs/basic/error-exception.md index 6b1d1db4..13548c09 100644 --- a/docs/basic/error-exception.md +++ b/docs/basic/error-exception.md @@ -1,14 +1,14 @@ --- -sidebar_position: 46 -title: A.46. Python Error & Exception -sidebar_label: A.46. Error & Exception +sidebar_position: 47 +title: A.47. Python Error & Exception +sidebar_label: A.47. Error & Exception --- Secara teknis Python interpreter mengenal dua jenis error, yaitu *syntax error* dan *exception*. Sebenarnya ada lagi satu jenis error lainnya, yaitu yang munculnya hanya di level linter (di editor) namun tidak membuat eksekusi program menjadi gagal. Pada chapter ini kita akan membahas tentang topik tersebut. -## A.46.1. Syntax error +## A.47.1. Syntax error Syntax error adalah salah satu jenis error yang ada di Python, yang jika muncul maka bisa dipastikan eksekusi program adalah gagal atau terhenti. Syntax error disebabkan oleh kesalahan penulisan. @@ -24,7 +24,7 @@ Output program: Satu-satunya solusi untuk mengatasi syntax error adalah dengan memperbaiki kode, memastikan semua penulisannya benar sesuai aturan di Python. -## A.46.2. Exception +## A.47.2. Exception Exception adalah jenis error yang muncul saat *runtime* (saat program dijalankan). Berbeda dengan syntax error yang munculnya saat proses eksekusi program (sebelum program benar-benar running). @@ -63,7 +63,7 @@ Output program: Alternatif solusi lainnya untuk mengatasi exception adalah dengan pengaplikasian kombinasi keyword `try` dan `catch`. Lebih detailnya akan dibahas di chapter berikutnya, di chapter [Exception Handling (try, catch, finally)](#). -## A.46.3. Throw exception +## A.47.3. Throw exception Di atas kita belajar salah satu cara antisipasi exception, yaitu dengan penambahan validasi sesuai kebutuhan, jika kondisi berpotensi menghasilkan exception maka pesan custom error dimunculkan. @@ -90,7 +90,7 @@ Cara membuat exception adalah dengan menggunakan keyword `raise` diikuti dengan Pada contoh di atas, exception dimunculkan dengan pesan error `we do not allow 0 or negative number`. -## A.46.4. Linter error / warning +## A.47.4. Linter error / warning Linter adalah suatu program utilitas yang berguna untuk melakukan pengecekan kualitas kode saat pengembangan (penulisan kode). Linter akan memunculkan error atau warning jika ditemukan pada beberapa bagian kode yang ditulis adalah kurang baik. diff --git a/docs/basic/eval-exec.md b/docs/basic/eval-exec.md index d027e5a8..1c528721 100644 --- a/docs/basic/eval-exec.md +++ b/docs/basic/eval-exec.md @@ -1,12 +1,12 @@ --- -sidebar_position: 57 -title: A.57. Python Eval & Exec -sidebar_label: A.57. Eval & Exec +sidebar_position: 58 +title: A.58. Python Eval & Exec +sidebar_label: A.58. Eval & Exec --- Pada chapter ini kita akan mempelajari fungsi `eval()` untuk eksekusi *expression*, fungsi `exec()` untuk eksekusi syntax Python, dan fungsi `compile()`. -## A.57.1. Fungsi `eval()` +## A.58.1. Fungsi `eval()` String berisi ekspresi seperti `PI * r * r` bisa dieksekusi kemudian diambil hasilnya menggunakan fungsi `eval()`. Cara penggunaannya sangat mudah, tulis saja ekspresi sebagai argument pemanggilan fungsi. Misalnya: @@ -57,7 +57,7 @@ By default, variabel dalam ekspresi terisi oleh nilai variabel yang sudah didekl > Pemanggilan `eval('expr')` tanpa parameter ke-2 dan ke-3 adalah ekuivalen dengan statement `eval('expr', globals(), locals())` -## A.57.2. Fungsi `exec()` +## A.58.2. Fungsi `exec()` Fungsi `exec()` berguna untuk eksekusi string berisi kode Python. Cara penggunaannya mirip seperti `eval()`. Contoh: @@ -118,7 +118,7 @@ Fungsi `exec()` berguna untuk eksekusi string berisi kode Python. Cara penggunaa Selama string berisi kode Python dengan syntax valid, maka bisa dijalankan via fungsi `exec()` ini. -## A.57.3. Fungsi `compile()` +## A.58.3. Fungsi `compile()` Fungsi `compile()` digunakan untuk kompilasi expression maupun kode Python, untuk kemudian digunakan pada fungsi `eval()`, `exec()`, ataupun untuk keperluan lainnya (seperti parse AST dan lainnya). @@ -187,9 +187,9 @@ print(res) # 314.0 ``` -## A.57.4. Fungsi `ast.literal_eval()` +## A.58.4. Fungsi `ast.literal_eval()` -Seperti yang sudah disebutkan pada peringatan di [A.57.1](#a571-fungsi-eval), fungsi `eval()` dan `exec()` berbahaya jika digunakan dengan input dari sumber tidak terpercaya karena dapat mengeksekusi kode berbahaya. +Seperti yang sudah disebutkan pada peringatan di [A.58.1](#a571-fungsi-eval), fungsi `eval()` dan `exec()` berbahaya jika digunakan dengan input dari sumber tidak terpercaya karena dapat mengeksekusi kode berbahaya. Sebagai alternatif yang aman untuk mengevaluasi literal Python (seperti string, angka, list, tuple, dict, bool, `None`), Python menyediakan fungsi `ast.literal_eval()` dari module `ast` (bagian dari stdlib). diff --git a/docs/basic/exception-handling-try-except-else-finally.md b/docs/basic/exception-handling-try-except-else-finally.md index f82d8dad..5745f110 100644 --- a/docs/basic/exception-handling-try-except-else-finally.md +++ b/docs/basic/exception-handling-try-except-else-finally.md @@ -1,14 +1,14 @@ --- -sidebar_position: 47 -title: A.47. Python Exception Handling (try, except, else, finally) -sidebar_label: A.47. Exception Handling ➜ try, except, else, finally +sidebar_position: 48 +title: A.48. Python Exception Handling (try, except, else, finally) +sidebar_label: A.48. Exception Handling ➜ try, except, else, finally --- Chapter ini membahas tentang penanganan exception via keyword `try`, `except`, `else`, dan `finally`. Metode exception handler ini sangat efektif karena tidak membutuhkan validasi error secara manual satu per satu menggunakan seleksi kondisi. > Pembahasan tentang apa itu exception sendiri ada di chapter [Error & Exception](/basic/error-exception) -## A.47.1. Keyword `try` & `except` +## A.48.1. Keyword `try` & `except` Kita mulai pembelajaran dengan sebuah kode sederhana untuk menghitung pembagian pisang ke warga. Hasil operasi pembagian tersebut kemudian di-print. @@ -95,7 +95,7 @@ Output program: Silakan gunakan block `try` & `except` sesuai kebutuhan, tempatkan di bagian kode yang memang dirasa paling pas. -## A.47.2. Explicit exception handler +## A.48.2. Explicit exception handler Suatu exception bisa ditangkap secara spesifik dengan menuliskan varian exception-nya setelah keyword `except`. Contoh penerapannya bisa di lihat pada kode berikut, dimana exception `ZeroDivisionError` perlu ditangkap ketika muncul. @@ -236,7 +236,7 @@ except Exception as err: print(f"oops! something wrong. {err}") ``` -## A.47.3. Keyword `try`, `except` & `else` +## A.48.3. Keyword `try`, `except` & `else` Keyword `else` bisa dikombinasikan dengan `try` dan `except`. Block `else` tersebut hanya akan dieksekusi ketika tidak terjadi exception. @@ -269,7 +269,7 @@ Penjelasan alur program di atas: Block `else` mengenali semua variabel yang dideklarasikan di block `try`. Oleh karena itu variabel `res` bisa langsung di-print di block tersebut. -## A.47.4. Keyword `try`, `except` & `finally` +## A.48.4. Keyword `try`, `except` & `finally` Keyword `finally` adalah keyword yang berguna untuk menandai bahwa eksekusi suatu block `try` & `except` telah selesai. Block `finally` hanya dieksekusi ketika deretan block selesai, tanpa mengecek apakah ada exception atau tidak. @@ -301,7 +301,7 @@ Penjelasan alur program di atas: ![Python Exception Handling (try, except, finally)](img/exception-handling-try-except-else-finally-7.png) -## A.47.5. Keyword `try`, `except`, `else` & `finally` +## A.48.5. Keyword `try`, `except`, `else` & `finally` Bentuk sempurna dari exception handler adalah kombinasi dari 4 keyword yang telah dipelajari (`try`, `except`, `else` & `finally`). diff --git a/docs/basic/file.md b/docs/basic/file.md index 48eca736..9d0f09fe 100644 --- a/docs/basic/file.md +++ b/docs/basic/file.md @@ -1,12 +1,12 @@ --- -sidebar_position: 49 -title: A.49. Python File I/O -sidebar_label: A.49. File I/O +sidebar_position: 50 +title: A.50. Python File I/O +sidebar_label: A.50. File I/O --- Pada chapter ini kita akan belajar tentang pengolahan file dan folder, dan beberapa hal relevan lainnya yang masih berhubungan dengan manajemen file & folder. -## A.49.1. Membuka stream file +## A.50.1. Membuka stream file Di Python, hampir semua operasi file diawali dengan pemanggilan fungsi `open()`, dan diakhiri pemanggilan method `close()` (milik object yang dikembalikan oleh fungsi `open()`). @@ -55,7 +55,7 @@ print("file is closed:", f.closed) # output ➜ file is closed: True ``` -## A.49.2. Keyword `with` +## A.50.2. Keyword `with` Ada cara yang lebih efisien dalam operasi buka file agar file otomatis ter-close setelah digunakan, yaitu dengan menggunakan keyword `with` diikuti statement `open()` lalu syntax `as nama_variabel`. Kurang lebih seperti ini penulisannya: @@ -69,7 +69,7 @@ print("file is closed:", f.closed) # output ➜ file is closed: True ``` -## A.49.3. Menulis file +## A.50.3. Menulis file Operasi penulisan konten ke file dilakukan via method `write()` milik object file. Contoh penerapannya bisa dilihat pada kode berikut, dimana ada method `write()` digunakan 3x untuk menulis karakter string. @@ -86,7 +86,7 @@ Output program: Program di-run 3x dan isinya tetap sama (tidak menumpuk), ini karena setiap kali statement `open()` dijalankan dengan mode `w`, file akan dikosongkan terlebih dahulu. -## A.49.4. Append konten ke file +## A.50.4. Append konten ke file Gunakan mode `a` untuk append konten ke file yang isinya bisa saja tidak kosong (agar isi konten tidak ditimpa). @@ -103,7 +103,7 @@ Output program: Bisa dilihat, setiap kali program dieksekusi konten `happy monday\n` bertambah terus. -## A.49.5. Membaca file +## A.50.5. Membaca file Method `readline()` dan `read()` milik object file, keduanya digunakan untuk membaca isi file. @@ -193,7 +193,7 @@ with open("file.txt", "r", encoding="utf-8") as f: print(f.read()) ``` -## A.49.6. Membaca dan menulis dalam 1 sesi +## A.50.6. Membaca dan menulis dalam 1 sesi Di awal chapter telah dijelaskan tentang kegunaan mode `w`, `a`, dan `r`. Lalu bagaimana jika ada kebutuhan untuk membaca dan menulis file dalam satu sesi? Jawabannya adalah dengan menambahkan tanda `+` pada mode (jadinya `w+`, `a+`, atau `r+`). @@ -228,7 +228,7 @@ Mode `w+`, `a+`, dan `r+` kesemuanya bisa digunakan untuk baca dan tulis dalam 1 https://stackoverflow.com/questions/1466000/difference-between-modes-a-a-w-w-and-r-in-built-in-open-function/30566011#30566011 -## A.49.7. Mengosongkan isi file +## A.50.7. Mengosongkan isi file Cara mengosongkan file bisa dilakukan dengan mudah menggunakan mode `w`. Baca file menggunakan mode tersebut kemudian langsung `close()` saja. Boleh menggunakan keyword `with` atau bisa langsung sebaris statement. Contoh penerapannya bisa dilihat di kode berikut. 3 block statement di situ semuanya ekuivalen, membuat isi file menjadi kosong. @@ -249,7 +249,7 @@ with open("file.txt", "w", encoding="utf-8") as f: f.truncate() ``` -## A.49.8. Menghapus file atau folder +## A.50.8. Menghapus file atau folder API `os.remove()` digunakan untuk menghapus file, sedangkan `os.rmdir()` untuk menghapus folder. Contoh penerapan: @@ -277,7 +277,7 @@ API `os.remove()` digunakan untuk menghapus file, sedangkan `os.rmdir()` untuk m os.rmdir("C:\\LibsSoftLink\\dasarpemrogramanpython\\examples") ``` -## A.49.9. Mengecek apakah file atau folder ada +## A.50.9. Mengecek apakah file atau folder ada API `os.path.isfile()` digunakan untuk mengecek apakah suatu file ada. @@ -308,7 +308,7 @@ else: print("file.txt is not exists") ``` -## A.49.10. Membuat folder baru +## A.50.10. Membuat folder baru API `os.makedirs()` digunakan untuk membuat folder baru. @@ -326,7 +326,7 @@ import os os.makedirs("C:\\LibsSoftLink\\dasarpemrogramanpython\\examples") ``` -## A.49.11. Menampilkan isi folder +## A.50.11. Menampilkan isi folder - Menggunakan `os.listdir()`: @@ -386,7 +386,7 @@ os.makedirs("C:\\LibsSoftLink\\dasarpemrogramanpython\\examples") - [File/Data Format ➜ CSV](/basic/csv) - [File/Data Format ➜ JSON](/basic/json) -## A.49.12. `pathlib.Path` (modern file path handling) +## A.50.12. `pathlib.Path` (modern file path handling) Selain menggunakan `os.path` dan fungsi manual string untuk manipulasi path, Python menyediakan module `pathlib` yang menawarkan pendekatan object-oriented dalam pengelolaan path file dan folder. `pathlib.Path` bisa digunakan untuk operasi yang telah dibahas sebelumnya dengan cara yang lebih intuitif. diff --git a/docs/basic/generator-yield.md b/docs/basic/generator-yield.md index 411b5bdd..c50c6054 100644 --- a/docs/basic/generator-yield.md +++ b/docs/basic/generator-yield.md @@ -1,18 +1,18 @@ --- -sidebar_position: 59 -title: A.59. Python Generator & Yield -sidebar_label: A.59. Generator & Yield +sidebar_position: 60 +title: A.60. Python Generator & Yield +sidebar_label: A.60. Generator & Yield --- Pada chapter ini kita akan belajar tentang konsep generator serta pengaplikasiannya menggunakan keyword `yield` dan *generator expression*. -## A.59.1. Generator object +## A.60.1. Generator object Generator object adalah object iterator yang dibuat via fungsi generator (menggunakan keyword `yield`) atau via *generator expression*. > Mengenai apa itu iterator, pembahasannya ada di chapter sebelumnya, yaitu [Iterable & Iterator](/basic/iterable-iterator) -## A.59.2. Generator function +## A.60.2. Generator function Generator function adalah salah satu cara pembuatan generator object. Ciri khasnya di dalam fungsi ada statement berisi keyword `yield`. @@ -114,7 +114,7 @@ for row in file_reader('content.txt'): print(row.strip()) ``` -## A.59.3. Generator expression +## A.60.3. Generator expression Generator comprehension (atau yang umumnya dikenal sebagai generator expression) adalah ekspresi statement yang ditulis dalam format tertentu yang otomatis terdeteksi sebagai *generator object*. diff --git a/docs/basic/instance-attribute-class-attribute.md b/docs/basic/instance-attribute-class-attribute.md index 0acb5be3..6c33c08f 100644 --- a/docs/basic/instance-attribute-class-attribute.md +++ b/docs/basic/instance-attribute-class-attribute.md @@ -1,12 +1,12 @@ --- -sidebar_position: 37 -title: A.37. Python OOP ➜ Instance Attribute & Class Attribute -sidebar_label: A.37. OOP ➜ Instance & Class Attribute +sidebar_position: 38 +title: A.38. Python OOP ➜ Instance Attribute & Class Attribute +sidebar_label: A.38. OOP ➜ Instance & Class Attribute --- Pada chapter ini, kita akan belajar lebih dalam tentang attribute suatu class, jenis-jenisnya, dan penerapannya. -## A.37.1. Attributes +## A.38.1. Attributes Attribute merupakan salah satu property class selain method. Python mengenal dua jenis attribute yaitu instance attribute (yang sudah kita bahas di beberapa chapter sebelumnya) dan class attribute. @@ -108,7 +108,7 @@ Class attribute biasanya diterapkan untuk menyimpan data yang sifatnya global da Berbeda dengan instance attribute yang digunakan untuk menyimpan data spesifik per object. Bisa dilihat di contoh ada list berisi 2 element yang dibuat dari class `Song`. Masing-masing instance object tersebut data attribute-nya berbeda satu sama lain. -## A.37.2. Attribute lookup +## A.38.2. Attribute lookup Saat suatu instance attribute diakses dari instance object, yang terjadi di balik layar adalah Python melakukan *lookup* (atau pengecekan) terhadap attribute dengan urutan sebagai berikut: @@ -139,7 +139,7 @@ print(f"Class Person name: {Person.name}") Variabel `person1` ketika diakses attribute `name`-nya, yang dikembalikan adalah nilai instance attribute, meskipun sebenarnya class `Person` juga memiliki class attribute dengan nama yang sama. -## A.37.3. Attribute mutability +## A.38.3. Attribute mutability ### ◉ Perubahan nilai instance attribute diff --git a/docs/basic/instance-method.md b/docs/basic/instance-method.md index bf198c81..ec41063a 100644 --- a/docs/basic/instance-method.md +++ b/docs/basic/instance-method.md @@ -1,7 +1,7 @@ --- -sidebar_position: 34 -title: A.34. Python OOP ➜ Instance Method -sidebar_label: A.34. OOP ➜ Instance Method +sidebar_position: 35 +title: A.35. Python OOP ➜ Instance Method +sidebar_label: A.35. OOP ➜ Instance Method --- Jika attribute adalah variabel yang berasosiasi dengan class, maka method adalah fungsi yang berasosiasi dengan class. @@ -11,7 +11,7 @@ Python mengenal 3 jenis method yaitu instance method, class method, dan static m > - Pembahasan detail mengenai class method ada di chapter [OOP ➜ Class Method](/basic/class-method) > - Pembahasan detail mengenai static method ada di chapter [OOP ➜ Static Method](/basic/static-method) -## A.34.1. Pengenalan Instance Method +## A.35.1. Pengenalan Instance Method Instance method memiliki beberapa karakteristik jika dilihat dari syntax-nya: @@ -103,7 +103,7 @@ Pada bagian blok kode perulangan, ganti tiga baris statement print dengan pemang Jalankan program dan lihat outputnya, pasti sama persis dengan program sebelumnya. -## A.34.2. Variabel `self` +## A.35.2. Variabel `self` Salah satu aturan pada instance method adalah fungsi harus memiliki parameter pertama bernama `self`. Parameter tersebut wajib ada saat deklarasi, dan tidak boleh diisi argument saat pemanggilan. Jika dipaksa diisi dengan argument, maka pasti muncul error. @@ -188,7 +188,7 @@ Pada pemanggilan method `set_details()` object `car1`: - Argument `2001` ditampung oleh parameter `year` - Argument `Best car in NFS Most Wanted` ditampung oleh parameter `description`. -## A.34.3. Naming convention method & param +## A.35.3. Naming convention method & param Mengacu pada dokumentasi [PEP 8 – Style Guide for Python Code](https://peps.python.org/pep-0008/), nama method dianjurkan untuk ditulis menggunakan snake_case (seperti fungsi). Contohnya bisa dilihat pada method `get_name()` berikut: @@ -221,7 +221,7 @@ class FavoriteFood: self.name = name ``` -## A.34.4. Pengaksesan instance method dari class +## A.35.4. Pengaksesan instance method dari class Sebenarnya ada dua cara untuk mengakses instance method: @@ -324,7 +324,7 @@ FavoriteFood.get_name(food1) -## A.34.5. Pengaksesan method dari method lain +## A.35.5. Pengaksesan method dari method lain Lewat variabel `self` tidak hanya instance attribute yang dapat diakses, melainkan semua jenis property (termasuk instance method). Pada contoh berikut, di dalam method `info()` terdapat statement pemanggilan method yaitu `get_name()`. @@ -351,7 +351,7 @@ class Car: print(f"Year released: {self.year}") ``` -## A.34.6. Argument method: positional, optional, keyword arg +## A.35.6. Argument method: positional, optional, keyword arg Aturan-aturan dalam deklarasi parameter dan pengisian argument fungsi juga berlaku pada method, diantaranya: @@ -396,7 +396,7 @@ Aturan-aturan dalam deklarasi parameter dan pengisian argument fungsi juga berla car3.set_details(description="Best car in NFS Carbon", year=2003) ``` -## A.34.7. Argument method: args & kwargs +## A.35.7. Argument method: args & kwargs Sama seperti fungsi, method juga bisa berisi parameter **args** maupun **kwargs**. diff --git a/docs/basic/iterable-iterator.md b/docs/basic/iterable-iterator.md index 08bf1a63..1ea07178 100644 --- a/docs/basic/iterable-iterator.md +++ b/docs/basic/iterable-iterator.md @@ -1,12 +1,12 @@ --- -sidebar_position: 58 -title: A.58. Python Iterable & Iterator -sidebar_label: A.58. Iterable & Iterator +sidebar_position: 59 +title: A.59. Python Iterable & Iterator +sidebar_label: A.59. Iterable & Iterator --- Pada chapter ini kita akan belajar tentang konsep sekaligus penerapan iterable dan iterator di Python. -## A.58.1. Apa itu iterable? +## A.59.1. Apa itu iterable? **Iteration** atau iterasi adalah proses pengaksesan item-item suatu data kolektif sesuai urutannya satu-per-satu (menggunakan metode perulangan). Penerapan keyword `for in` pada data string, list, atau data kolektif lainnya adalah contoh dari iterasi. @@ -26,7 +26,7 @@ Begitu juga dengan variabel `numbers`, nilai numerik dalam list di-iterasi denga **Iterable** adalah object yang bisa di-iterasi, contohnya seperti tuple, list, string, dan tipe data kolektif lainnya. Sederhananya, setiap object yang bisa digunakan pada keyword `for in` adalah pasti iterable. -## A.58.2. Apa itu iterator? +## A.59.2. Apa itu iterator? Iterator berbeda dibanding iterable. Iterator adalah object iterable yang bisa mengingat *state* perulangannya. Jadi object tersebut tau informasi seperti perulangan sedang berada di indeks ke berapa, elemen berikutnya apa, dan info mengenai kapan perulangan berhenti. @@ -74,7 +74,7 @@ Dari sini terlihat bahwa object iterator benar-benar mengingat informasi state-n > Penggunaan fungsi `next()` terhadap object iterator yang sudah terakses semua itemnya menghasilkan error. Manfaatkan keyword `try except` jika diperlukan. -## A.58.3. Custom iterator +## A.59.3. Custom iterator Selain menggunakan fungsi `iter()` pembuatan iterator juga bisa dilakukan via custom class. Caranya dengan mendesain custom class agar memiliki 2 hal berikut: diff --git a/docs/basic/json.md b/docs/basic/json.md index fd5316a9..5a5f6926 100644 --- a/docs/basic/json.md +++ b/docs/basic/json.md @@ -1,7 +1,7 @@ --- -sidebar_position: 52 -title: A.52. Python JSON File/Data Format -sidebar_label: A.52. File/Data Format ➜ JSON +sidebar_position: 53 +title: A.53. Python JSON File/Data Format +sidebar_label: A.53. File/Data Format ➜ JSON --- Pada chapter ini kita akan belajar tentang penerapan tipe data JSON di Python. @@ -52,7 +52,7 @@ jstr2 = """ ::: -## A.52.1. Implementasi JSON di Python +## A.53.1. Implementasi JSON di Python Operasi JSON di Python umumnya dilakukan terhadap data yang tersimpan di variabel/memory atau data yang tersimpan di file, dengan memanfaatkan module `json` (baawan Python Standard Library) untuk proses decode maupun encode data json. diff --git a/docs/basic/local-global-var.md b/docs/basic/local-global-var.md index 87067318..8e51159f 100644 --- a/docs/basic/local-global-var.md +++ b/docs/basic/local-global-var.md @@ -1,12 +1,12 @@ --- -sidebar_position: 29 -title: A.29. Python Variables Scope (Local vs. Global) -sidebar_label: A.29. Variables Scope (Local vs. Global) +sidebar_position: 30 +title: A.30. Python Variables Scope (Local vs. Global) +sidebar_label: A.30. Variables Scope (Local vs. Global) --- Pada chapter ini kita akan membahas tentang variable scope, yaitu kapan suatu variabel valid dan bisa digunakan di dalam block serta beberapa fungsi yang masih relevan dengan topik variabel scope. -## A.29.1. Local vs. global variable +## A.30.1. Local vs. global variable Global variable adalah variabel yang dideklarasikan di root (tidak di dalam suatu block fungsi). Sedangkan local variable adalah yang dideklarasikan di dalam suatu block dan hanya valid di block tersebut saja. @@ -53,7 +53,7 @@ Sampai sini bisa ditarik kesimpulan bahwa variabel global bisa diakses dari mana - Jika variabel local dideklarasikan di dalam block fungsi/lambda/closure, maka pengaksesannya dari luar block menghasilkan error. - Jika variabel local dideklarasikan di block seleksi kondisi atau lainnya, maka pengaksesannya dari luar block diperbolehkan dan tidak membuat eksekusi program menjadi error. Namun warning atau error di level linter muncul. -## A.29.2. Local dan global variable dengan nama sama +## A.30.2. Local dan global variable dengan nama sama Katakanlah ada variabel global dan variabel local yang namanya sama persis, di situasi seperti ini maka nilai variabel local pada block-nya adalah sesuai dengan saat deklarasinya dalam block. Di luar block, variabel tersebut nilainya kembali berisi nilai variabel global. @@ -79,7 +79,7 @@ Bisa dilihat dari output bahwa variabel `name` nilainya adalah `Keymaster Urmgrg Dari sini bisa diambil kesimpulan bahwa di luar block, perubahan nilai variabel local tidak berefek ke variabel global, meskipun namanya sama persis. -## A.29.3. Keyword `global` +## A.30.3. Keyword `global` Untuk mengubah nilai suatu variabel global dari block, maka perlu adanya penggunaan keyword `global`. Keyword ini menandai variabel dalam block bahwa reference yang digunakan adalah variabel global. Efeknya, perubahan nilai pada variabel juga berpengaruh ke variabel global. @@ -104,7 +104,7 @@ print("greetings", name) Cara penggunaan keyword `global` adalah dengan cukup menuliskannya di dalam block kemudian diikuti nama variabel. Dari output terlihat bahwa di luar block fungsi `greet()` nilai variabel `name` berubah. -## A.29.4. Fungsi `globals()` +## A.30.4. Fungsi `globals()` Fungsi `globals()` mengembalikan informasi semua variabel global yang bisa diakses dari tempat dimana fungsi dipanggil. Nilai balik berbentuk dictionary dengan `key` adalah nama variabel dan `value` adalah nilai variabel. @@ -121,7 +121,7 @@ task_one() # output ➜ 12 ``` -## A.29.5. Fungsi `locals()` +## A.30.5. Fungsi `locals()` Fungsi `locals()` mengembalikan informasi variabel yang dideklarasikan di block dimana fungsi tersebut dipanggil dengan nilai balik berbentuk dictionary. diff --git a/docs/basic/none.md b/docs/basic/none.md index a5a59bbf..9bbbbb30 100644 --- a/docs/basic/none.md +++ b/docs/basic/none.md @@ -1,12 +1,12 @@ --- -sidebar_position: 31 -title: A.31. Python None -sidebar_label: A.31. None +sidebar_position: 32 +title: A.32. Python None +sidebar_label: A.32. None --- Pada chapter ini kita akan belajar tentang object special bernama `None`. -## A.31.1. Pengenalan `None` +## A.32.1. Pengenalan `None` `None` merupakan object bawaan Python yang umumnya digunakan untuk merepresentasikan nilai kosong atau *null*. @@ -54,7 +54,7 @@ Bisa dilihat pada program di atas output tiap statement adalah berbeda-beda sesu > > Pembahasan detail mengenai special name ada di chapter [Special Names ➜ Attribute __name__ milik class type](/basic/special-names#a294-attribute-__name__-milik-class-type) -## A.31.2. Penggunaan operator `is` terhadap `None` +## A.32.2. Penggunaan operator `is` terhadap `None` Ketika memeriksa apakah sebuah objek bernilai `None` atau tidak, disarankan untuk menggunakan operator `is` dibanding `==`, karena sifat dari operator `==` memanggil special method `__eq__()` dari objek yang diperiksa dan pada praktiknya tidak semua class menggunakan implementasi default method `__eq__()`. Dari sini maka potensi penggunaan operator `==` menghasilkan nilai yg berbeda dibanding yang diharapkan adalah ada (meskipun sangat kecil). diff --git a/docs/basic/pack-unpack-elements.md b/docs/basic/pack-unpack-elements.md index 375c3be4..7de52115 100644 --- a/docs/basic/pack-unpack-elements.md +++ b/docs/basic/pack-unpack-elements.md @@ -1,12 +1,12 @@ --- -sidebar_position: 32 -title: A.32. Python Pack Unpack tuple, list, set, dict -sidebar_label: A.32. Pack Unpack ➜ Tuple, List, Set, Dict +sidebar_position: 33 +title: A.33. Python Pack Unpack tuple, list, set, dict +sidebar_label: A.33. Pack Unpack ➜ Tuple, List, Set, Dict --- Python mengenal teknik packing dan unpacking, dimana teknik ini umum diterapkan sesuai kebutuhan pada beberapa jenis tipe data kolektif seperti tuple, list, set, dan dictionary. Pada chapter ini kita akan mempelajari cara penggunaannya, beserta peran penggunaan tanda `*` dan `**` pada operasi packing dan unpacking. -## A.32.1. Unpacking element tuple, list, set +## A.33.1. Unpacking element tuple, list, set Unpacking (yang dalam Bahasa Indonesia berarti bongkar muatan) adalah teknik pendistribusian elemen tipe data kolektif ke banyak variabel. @@ -140,7 +140,7 @@ print(warrior1) # output ➜ Reiner Braun print(warrior2) # output ➜ Annie Leonhart ``` -## A.32.2. Packing element tuple, list, set +## A.33.2. Packing element tuple, list, set Packing element adalah operasi pemuatan banyak data ke sebuah data kolektif. Cara penerapannya sangat mudah, cukup tulis saja variabel yang ingin di-pack sebagai element data kolektif. Untuk tipenya bisa berupa tuple, list, maupun set. @@ -332,7 +332,7 @@ print(names) > > Pembahasan detail mengenai set ada di chapter [Set](/basic/set) -## A.32.3. Pemanfaatan teknik unpacking pada argument parameter +## A.33.3. Pemanfaatan teknik unpacking pada argument parameter Tenik unpacking umum dimanfaatkan pada penyisipan data argument parameter pemanggilan fungsi/method. Contoh aplikasinya bisa dilihat pada kode berikut, dimana ada fungsi bernama `show_biography()` yang akan dipanggil beberapa kali dengan cara pemanggilan berbeda satu sama lain. @@ -376,7 +376,7 @@ def show_biography(id, name, occupation, gender): show_biography('U0004', *user4_data, 'male') ``` -## A.32.4. Packing-unpacking item dictionary +## A.33.4. Packing-unpacking item dictionary ### ◉ Operasi unpack pada dictionary diff --git a/docs/basic/packages.md b/docs/basic/packages.md index 90dd84b9..d7741c14 100644 --- a/docs/basic/packages.md +++ b/docs/basic/packages.md @@ -1,12 +1,12 @@ --- -sidebar_position: 28 -title: A.28. Python Packages -sidebar_label: A.28. Packages +sidebar_position: 29 +title: A.29. Python Packages +sidebar_label: A.29. Packages --- Pada chapter ini, kita akan membahas cara Python mengelola module melalui packages. Dengan package, module bisa diakses menggunakan notasi pengaksesan module, contohnya seperti `calculate.calc_hypotenuse()`. -## A.28.1. Pengenalan Packages +## A.29.1. Pengenalan Packages Mari kita mulai dengan sedikit mengulang pembahasan yang ada di chapter sebelumnya. Di Python, module direpresentasikan oleh file, dan agar bisa mengakses item yang ada dalam module tersebut kita perlu meng-import-nya terlebih dahulu. @@ -105,11 +105,11 @@ Ok, selanjutnya coba jalankan program dan lihat hasilnya: ![Python packages](img/packages-1.png) -## A.28.2. *Naming convention* package +## A.29.2. *Naming convention* package Berdasarkan dokumentasi [PEP 8 – Style Guide for Python Code](https://peps.python.org/pep-0008/), disarankan untuk menulis nama package dengan huruf kecil (lowercase) dan dianjurkan untuk menghindari penggunaan underscore. -## A.28.3. Metode import module package +## A.29.3. Metode import module package Seperti halnya module biasa, module dalam package bisa di-import dengan beberapa cara: @@ -207,7 +207,7 @@ Hasilnya adalah error: ![Python packages](img/packages-2.png) -## A.28.4. File `__init__.py` +## A.29.4. File `__init__.py` Melanjutkan pembahasan sebelumnya dimana `import *` menghasilkan error, hal tersebut terjadi karena Python tidak bisa mendeteksi module apa saja yang bisa direpresentasikan dengan `*` saat meng-import suatu package. @@ -291,6 +291,7 @@ Variabel yang diawali dan diakhir dengan karakter double underscore seperti `__a ### ◉ Chapter relevan lainnya - [Modules](/basic/modules) +- [PIP & Dependency Management](/basic/pip) - [Special names](/basic/special-names) ### ◉ Referensi diff --git a/docs/basic/pattern-matching.md b/docs/basic/pattern-matching.md index 90983e80..ca0c32d4 100644 --- a/docs/basic/pattern-matching.md +++ b/docs/basic/pattern-matching.md @@ -1,12 +1,12 @@ --- -sidebar_position: 45 -title: A.45. Python Pattern Matching ➜ match -sidebar_label: A.45. Pattern Matching ➜ match +sidebar_position: 46 +title: A.46. Python Pattern Matching ➜ match +sidebar_label: A.46. Pattern Matching ➜ match --- Pada chapter ini, kita akan membahas tentang teknik seleksi kondisi pencocokan pola di Python yang cukup advance untuk mengenali banyak variasi pola, yaitu structural pattern matching. -## A.45.1. Pengenalan pattern matching +## A.46.1. Pengenalan pattern matching Pattern matching merupakan teknik pencocokan pola menggunakan kombinasi keyword `match` dan `case`. Penggunaan dasarnya mirip seperti seleksi kondisi menggunakan keyword `if`. @@ -79,7 +79,7 @@ Pada penerapannya, keyword `match` ditulis diikuti oleh suatu data yang ingin di Gunakan kondisi `case _:` untuk menangkap kondisi yang tidak terpenuhi (seperti `else` pada seleksi kondisi `if`). Kondisi yang selalu terpenuhi ini biasa disebut dengan *wildcard*, yang idealnya ditulis di paling akhir. -## A.45.2. Pencocokan pola data sequence +## A.46.2. Pencocokan pola data sequence Kode yang telah dipraktekan kita akan refactor, dimodifikasi agar inputan bisa menerima command sekaligus argument (ditandai dengan karakter spasi). @@ -255,7 +255,7 @@ Output program: ![Python pattern matchin](img/pattern-matching-5.png) -## A.45.3. Pencocokan pola + seleksi kondisi +## A.46.3. Pencocokan pola + seleksi kondisi ### ◉ Pencocokan pola + logika OR @@ -332,7 +332,7 @@ match command.split(' '): print(f"command {other} is not recognized") ``` -## A.45.4. Pencocokan pola tipe data lainnya +## A.46.4. Pencocokan pola tipe data lainnya Tidak hanya tipe data string dan list saja yang bisa digunakan pada pattern matching, melainkan banyak sekali tipe data lainnya juga bisa digunakan. Termasuk diantaranya adalah tipe data sequence seperti `tuple` dan `dictionary`, dan juga tipe data dari custom class. diff --git a/docs/basic/pip.md b/docs/basic/pip.md new file mode 100644 index 00000000..99dbc720 --- /dev/null +++ b/docs/basic/pip.md @@ -0,0 +1,181 @@ +--- +sidebar_position: 28 +title: A.28. Python PIP & Dependency Management +sidebar_label: A.28. PIP & Dependency +--- + +Chapter ini merupakan lanjutan dari chapter [Packages](/basic/packages). Setelah belajar membuat module dan package sendiri, sekarang kita akan belajar cara menginstall dan menggunakan package milik orang lain (third-party) menggunakan **pip**. + +## A.28.1. Apa itu pip? + +**pip** adalah package manager resmi untuk Python, digunakan untuk menginstall, mengupdate, dan menghapus package dari [Python Package Index (PyPI)](https://pypi.org/). PyPI adalah repository tempat ribuan package Python open-source tersedia. + +Untuk mengecek apakah pip sudah terinstall, jalankan perintah berikut di terminal: + +```bash +pip --version +``` + +Jika belum terinstall, bisa diinstall via: + +```bash +python -m ensurepip --upgrade +``` + +## A.28.2. Menginstall package dengan `pip install` + +Cara paling dasar menginstall package adalah menggunakan perintah `pip install` diikuti nama package. + +```bash +pip install requests +``` + +Perintah di atas menginstall package `requests` beserta dependensinya. + +Beberapa opsi yang sering digunakan: + +```bash +# install versi spesifik +pip install requests==2.31.0 + +# install dengan versi minimal +pip install "requests>=2.28.0" + +# install multiple package +pip install requests pandas numpy + +# install dari file requirements.txt +pip install -r requirements.txt +``` + +### ◉ Menggunakan `pip` via Python module + +Alternatif lain adalah memanggil pip melalui module Python, cara ini lebih direkomendasikan karena menghindari konflik environment: + +```bash +python -m pip install requests +``` + +## A.28.3. Mencari package yang terinstall + +```bash +# menampilkan semua package yang terinstall +pip list + +# mencari package spesifik +pip show requests +``` + +Output `pip show` menampilkan informasi detail seperti versi, dependensi, dan lokasi install. + +## A.28.4. Mengupdate & menghapus package + +```bash +# update package ke versi terbaru +pip install --upgrade requests + +# menghapus package +pip uninstall requests +``` + +## A.28.5. File `requirements.txt` + +File `requirements.txt` digunakan untuk mendokumentasikan daftar package yang dibutuhkan oleh suatu project. Format penulisannya adalah satu baris per package, dengan versi (opsional). + +Contoh `requirements.txt`: + +```text +requests==2.31.0 +pandas>=2.0.0 +numpy +flask==3.0.0 +``` + +Cara install semua package dari file tersebut: + +```bash +pip install -r requirements.txt +``` + +Cara membuat file `requirements.txt` dari environment saat ini: + +```bash +pip freeze > requirements.txt +``` + +Perintah `pip freeze` akan menghasilkan daftar seluruh package yang terinstall beserta versinya. Output ini bisa langsung disimpan ke `requirements.txt` untuk digunakan di environment lain. + +## A.28.6. Virtual Environment (`venv`) + +Virtual environment berguna untuk mengisolasi dependensi antar project agar tidak saling bertabrakan. + +Membuat virtual environment: + +```bash +python -m venv venv +``` + +Mengaktifkan virtual environment: + +```bash +# macOS / Linux +source venv/bin/activate + +# Windows (Command Prompt) +venv\Scripts\activate + +# Windows (PowerShell) +venv\Scripts\Activate.ps1 +``` + +Setelah aktif, gunakan `pip install` seperti biasa — package akan terinstall di dalam virtual environment, bukan global. + +Untuk menonaktifkan: + +```bash +deactivate +``` + +### ◉ Best practice + +1. Buat virtual environment untuk setiap project +2. Simpan daftar dependensi di `requirements.txt` +3. Jangan commit folder `venv/` ke git — tambahkan ke `.gitignore` +4. Gunakan `python -m pip` daripada `pip` langsung untuk menghindari masalah PATH + +## A.28.7. Ringkasan perintah pip + +| Perintah | Kegunaan | +|:-|:-| +| `pip install ` | Install package | +| `pip install ==x.x` | Install versi spesifik | +| `pip install -r requirements.txt` | Install dari file requirements | +| `pip list` | Lihat semua package terinstall | +| `pip show ` | Detail package | +| `pip install --upgrade ` | Update package | +| `pip uninstall ` | Hapus package | +| `pip freeze` | Output semua package + versi | +| `python -m venv ` | Buat virtual environment | + +--- + +
+ +## Catatan chapter 📑 + +### ◉ Source code praktik + +Tidak ada source code khusus untuk chapter ini karena semua operasi dilakukan via terminal. + +### ◉ Chapter relevan lainnya + +- [Modules](/basic/modules) +- [Packages](/basic/packages) + +### ◉ Referensi + +- https://pip.pypa.io/en/stable/ +- https://pypi.org/ +- https://docs.python.org/3/tutorial/venv.html + +
diff --git a/docs/basic/property-visibility.md b/docs/basic/property-visibility.md index b21afb98..dbbdd0e1 100644 --- a/docs/basic/property-visibility.md +++ b/docs/basic/property-visibility.md @@ -1,14 +1,14 @@ --- sidebar_position: 35 -title: A.36. Python OOP ➜ Property Visibility -sidebar_label: A.36. OOP ➜ Property Visibility +title: A.37. Python OOP ➜ Property Visibility +sidebar_label: A.37. OOP ➜ Property Visibility --- Visibility atau privacy dalam konteks OOP merujuk pada penentuan apakah property (baik itu attribute atau method) dapat diakses secara public atau hanya bisa diakses dari dalam class (private). Di bab ini, kita akan membahas implementasinya di Python. -## A.36.1. Pengenalan visibility/privacy +## A.37.1. Pengenalan visibility/privacy Python, dari segi API kode yang tersedia, sebenarnya tidak secara eksplisit mendukung implementasi visibility property instance class. Semua attribute dan method secara default bersifat public di Python. @@ -108,7 +108,7 @@ Output program: ![Property visibility Python](img/property-visibility-1.png) -## A.36.2. Property dengan prefix `__` +## A.37.2. Property dengan prefix `__` Sebelumnya telah disebutkan bahwa prefix `__` dalam penerapannya tidak benar-benar membuat property menjadi private. Silakan test dengan autocompletion editor, property private masih muncul, menandakan bahwa property tersebut tidak benar-benar private. diff --git a/docs/basic/special-names.md b/docs/basic/special-names.md index 9b3947d3..9461680e 100644 --- a/docs/basic/special-names.md +++ b/docs/basic/special-names.md @@ -1,7 +1,7 @@ --- -sidebar_position: 30 -title: A.30. Python Special Names -sidebar_label: A.30. Special Names +sidebar_position: 31 +title: A.31. Python Special Names +sidebar_label: A.31. Special Names --- Chapter ini membahas tentang variabel spesial yang ada di Python (umumnya disebut special names). @@ -10,7 +10,7 @@ Python memiliki variabel spesial yang bisa diakses secara global. Ciri khas spec Setiap special names memiliki kegunaan yang unik dan berbeda satu sama lain. -## A.30.1. Variabel `__name__` +## A.31.1. Variabel `__name__` Variabel `__name__` adalah salah satu special names di Python. Isinya mencakup informasi nama modul atau string `__main__`, tergantung apakah variabel tersebut di-print dari file entrypoint eksekusi program atau di-import. File entrypoint yang dimaksud disini adalah file yang digunakan pada argument command `python `. @@ -137,7 +137,7 @@ Penjelasan: ![Python special names](img/special-names-2.png) -## A.30.2. Variabel `__file__` +## A.31.2. Variabel `__file__` Variabel special name `__file__` berisi informasi path file di mana variabel tersebut ditulis atau digunakan. Ada dua cara untuk menggunakan variabel ini: @@ -190,13 +190,13 @@ Bisa dilihat pada gambar berikut bahwa output program adalah memunculkan nama mo Penggunaan `__file__` akan menampilkan path file dimana variabel tersebut ditulis, sedangkan penggunaannya sebagai property module (misalnya `calculate.__file__`) menghasilkan informasi path module. -## A.30.3. Variabel `__all__` & file `__init__.py` +## A.31.3. Variabel `__all__` & file `__init__.py` Variabel `__all__` digunakan untuk menentukan module apa saja yang ter-import ketika statement `import *` digunakan. Variabel `__all__` wajib ditulis di file `__init__.py` yang ditempatkan dalam package. > Penjelasan detail mengenai `import *` ada pada chapter [Packages](/basic/packages). -## A.30.4. Attribute `__name__` milik class `type` +## A.31.4. Attribute `__name__` milik class `type` Kita telah menggunakan fungsi `type()` beberapa kali pada banyak chapter sebelum ini. Fungsi `type()` adalah fungsi yang mengembalikan data dengan tipe yaitu class `type`. @@ -212,7 +212,7 @@ print(f"var: data2, data: {data2}, type: {type(data2).__name__}") # output ➜ var: data2, data: 168, type: int ``` -## A.30.5. Attribute `__class__` milik semua class / tipe data +## A.31.5. Attribute `__class__` milik semua class / tipe data Setiap tipe data memiliki akses ke attribute bernama `__class__`. Isi dari attribute ini adalah data yang sama hasil pemanggilan fungsi `type()` yaitu informasi tipe data atau class. @@ -228,11 +228,11 @@ print(f"var: data2, data: {data2}, type: {data2.__class__.__name__}") # output ➜ var: data2, data: 168, type: int ``` -## A.30.6. Attribute `__mro__` milik semua class / tipe data +## A.31.6. Attribute `__mro__` milik semua class / tipe data Class attribute `__mro__` berisi informasi hirarki class dalam tipe data tuple. Penjelasan lebih lanjut mengenai `__mro__` ada di chapter [OOP ➜ Class Inheritance](/basic/class-inheritance). -## A.30.7. Package `__future__` +## A.31.7. Package `__future__` Package `__future__` berisi modules yang hanya tersedia di Python versi terbaru. Package ini biasa di-import pada program yang dijalankan menggunakan Python versi lama (misalnya 2.5), yang didalamnya ada penerapan kode yang hanya ada di versi Python terbaru. @@ -250,11 +250,11 @@ print(8 // 7) # output ➜ 1 ``` -## A.30.8. Fungsi `__init__()` +## A.31.8. Fungsi `__init__()` Fungsi `__init__()` digunakan untuk membuat konstruktor pada suatu class. Penjelasan lebih lanjut mengenai `__init__()` ada di chapter [OOP ➜ Class & Object](/basic/class-object). -## A.30.9. Attribute `__doc__` milik semua class dan fungsi +## A.31.9. Attribute `__doc__` milik semua class dan fungsi Attribute `__doc__` digunakan untuk melihat informasi komentar docstring. Penjelasan lebih lanjut mengenai `__doc__` ada di chapter [DocString](/basic/docstring). diff --git a/docs/basic/static-method.md b/docs/basic/static-method.md index 1841fb8b..bde5e411 100644 --- a/docs/basic/static-method.md +++ b/docs/basic/static-method.md @@ -1,12 +1,12 @@ --- -sidebar_position: 39 -title: A.39. Python OOP ➜ Static Method -sidebar_label: A.39. OOP ➜ Static Method +sidebar_position: 40 +title: A.40. Python OOP ➜ Static Method +sidebar_label: A.40. OOP ➜ Static Method --- Chapter ini membahas tentang static method beserta penggunaan dan perbedaannya dibanding jenis method lainnya. -## A.39.1. Pengenalan static method +## A.40.1. Pengenalan static method Telah kita pelajari bahwa suatu fungsi agar dikenali sebagai method harus dideklarasikan di dalam block `class` dan memiliki parameter implicit `self` (untuk instance method) dan `cls` (untuk class method). @@ -68,7 +68,7 @@ Kedua method tersebut diakses untuk memunculkan 5 buah output berbeda via instan - Method `say_hello()` dipanggil 2x via instance object `edward` dan via class `Person` - Method `say_something()` juga sama, diakses via instance object 2x dan diakses via class 1x -## A.39.2. Fungsi `staticmethod()` +## A.40.2. Fungsi `staticmethod()` Python menyediakan fungsi bernama `staticmethod()` yang kegunaannya adalah untuk mengkonversi fungsi biasa (yang dideklarasikan di luar class) menjadi static method milik suatu class. @@ -153,7 +153,7 @@ say_something("nice to meet you") Fungsi `say_something()` sendiri tetap bisa digunakan secara normal meskipun telah dijadikan sebagai static method milik class `Person`. -## A.39.3. Summary +## A.40.3. Summary Perbedaan antara constructor, instance method, class method, dan static method bisa dilihat di bawah ini: