diff --git a/docs/basic/abstract-method.md b/docs/basic/abstract-method.md index 64c2abdf..8e6615cb 100644 --- a/docs/basic/abstract-method.md +++ b/docs/basic/abstract-method.md @@ -4,7 +4,7 @@ title: A.42. Python OOP ➜ Abstract Method sidebar_label: A.42. OOP ➜ Abstract Method --- -Pada chapter ini kita akan mempelejari tentang apa itu abstract method beserta bagaimana penerapannya pada pemrograman OOP menggunakan Python. +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 diff --git a/docs/basic/args-kwargs.md b/docs/basic/args-kwargs.md index feb2e732..3c574a34 100644 --- a/docs/basic/args-kwargs.md +++ b/docs/basic/args-kwargs.md @@ -140,7 +140,7 @@ print_data("sesuk prei", 2023, phone="nokia 3315", networks=["GSM", "TDMA"]) # message: sesuk prei # number: 2023 # -# param: phone, value: nokia 3310 +# param: phone, value: nokia 3315 # param: networks, value: ['GSM', 'TDMA'] ``` diff --git a/docs/basic/break-continue.md b/docs/basic/break-continue.md index a9d54d02..7acfdbbf 100644 --- a/docs/basic/break-continue.md +++ b/docs/basic/break-continue.md @@ -81,7 +81,7 @@ for i in range(max): Penjelasan: -- Program yang memiliki perulanga *nested* dengan jumlah perulangan ada 2. +- Program yang memiliki perulangan *nested* dengan jumlah perulangan ada 2. - Disiapkan sebuah variabel `bool` bernama `outer_loop` untuk kontrol perulangan terluar. - Ketika nilai `j` (yang merupakan variabel counter perulangan terdalam) adalah lebih dari atau sama dengan `7`, maka variabel `outer_loop` di set nilainya menjadi `False`, dan perulangan terdalam di-`break` secara paksa. - Dengan ini maka perulangan terluar akan terhenti. diff --git a/docs/basic/class-inheritance.md b/docs/basic/class-inheritance.md index 324464ab..a5971606 100644 --- a/docs/basic/class-inheritance.md +++ b/docs/basic/class-inheritance.md @@ -11,7 +11,7 @@ Chapter ini membahas tentang salah satu aspek penting dalam pemrograman OOP, yai Untuk mewujudkan inheritance setidaknya dua buah class dibutuhkan: - Super class / parent class, yaitu class yang property-nya ingin diwariskan atau diturunkan ke class dibawahnya. -- Sub class / derrived class, yaitu class yang mewarisi property dari parent class. +- Sub class / derived class, yaitu class yang mewarisi property dari parent class. Misalkan, ada sebuah class bernama `Vehicle` dan class ini memiliki property berikut: diff --git a/docs/basic/closure.md b/docs/basic/closure.md index 29241dfb..dd77eb1e 100644 --- a/docs/basic/closure.md +++ b/docs/basic/closure.md @@ -159,8 +159,8 @@ Di dalam fungsi `aggregate()`, closure `f` diharapkan untuk memiliki parameter y ### ◉ Source code praktik
-    
-        github.com/novalagung/dasarpemrogramanpython-example/../args-kwargs
+    
+        github.com/novalagung/dasarpemrogramanpython-example/../closure
     
 
diff --git a/docs/basic/csv.md b/docs/basic/csv.md index e7e98ed4..31a84a70 100644 --- a/docs/basic/csv.md +++ b/docs/basic/csv.md @@ -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.4. `csv.writer()` dan `csv.reader()` +## A.51.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 2186bbf9..d4d2b0d3 100644 --- a/docs/basic/dataclass.md +++ b/docs/basic/dataclass.md @@ -10,23 +10,23 @@ Python menyediakan module bernama `dataclasses` dengan isi beberapa API untuk me ## A.43.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_sattelites`. Deklarasi attribute ditulis dalam fungsi `__init__()`. +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__()`. ```python class Planet: - def __init__(self, name, diameter, natural_sattelites): + def __init__(self, name, diameter, natural_satellites): self.name = name self.diameter = diameter - self.natural_sattelites = natural_sattelites + self.natural_satellites = natural_satellites planets = [ Planet("Mercury", 4879, []), - Planet(name="Venus", diameter=12104, natural_sattelites=[]), - Planet(diameter=12742, name="Earth", natural_sattelites=["Moon"]), + Planet(name="Venus", diameter=12104, natural_satellites=[]), + Planet(diameter=12742, name="Earth", natural_satellites=["Moon"]), ] for p in planets: - print(f"{p.name} | {p.diameter} km | {len(p.natural_sattelites)} moons") + print(f"{p.name} | {p.diameter} km | {len(p.natural_satellites)} moons") # output ↓ # @@ -48,7 +48,7 @@ from dataclasses import dataclass class Planet: name: str diameter: float - natural_sattelites: list[str] + natural_satellites: list[str] planets = [ Planet("Mercury", 4879, []), @@ -57,7 +57,7 @@ planets = [ ] for p in planets: - print(f"{p.name} | {p.diameter} km | {len(p.natural_sattelites)} moons") + print(f"{p.name} | {p.diameter} km | {len(p.natural_satellites)} moons") # output ↓ # @@ -77,17 +77,17 @@ Cukup tambahkan decorator `@dataclass` saat deklarasi class, lalu tulis attribut class Planet: name: str diameter: float - natural_sattelites: list[str] + natural_satellites: list[str] ``` - Penulisan class biasa ```python class Planet: - def __init__(self, name, diameter, natural_sattelites): + def __init__(self, name, diameter, natural_satellites): self.name = name self.diameter = diameter - self.natural_sattelites = natural_sattelites + self.natural_satellites = natural_satellites ``` ## A.43.2. Attribute mutability @@ -99,7 +99,7 @@ mars = Planet("Mars", 4, ["Phobos", "Deimos"]) mars.name = "Red Planet" mars.diameter = 6779 -print(f"{mars.name} | {mars.diameter} km | {len(mars.natural_sattelites)} moons") +print(f"{mars.name} | {mars.diameter} km | {len(mars.natural_satellites)} moons") # output ➜ Red Planet | 6779 km | 2 moons ``` @@ -112,10 +112,10 @@ Data class bisa memiliki instance method dengan penulisan deklarasi sama persis class Country: name: str seasons: list - number_of_populations: float + number_of_population: float def info(self) -> str: - return f"{self.name} | {len(self.seasons)} seasons | {self.number_of_populations} million population" + return f"{self.name} | {len(self.seasons)} seasons | {self.number_of_population} million population" countries = [ Country("Indonesia", ["Rainy", "Dry"], 275.5), @@ -142,10 +142,10 @@ Attribute data class bisa ditentukan nilai defaultnya menggunakan operator assig class Country: name = "Indonesia" seasons = ["Rainy", "Dry"] - number_of_populations = 275.5 + number_of_population = 275.5 def info(self) -> str: - return f"{self.name} | {len(self.seasons)} seasons | {self.number_of_populations} million population" + return f"{self.name} | {len(self.seasons)} seasons | {self.number_of_population} million population" c = Country() print(c.info()) diff --git a/docs/basic/datetime-parsing-formatting.md b/docs/basic/datetime-parsing-formatting.md index 0e655ccd..ad906758 100644 --- a/docs/basic/datetime-parsing-formatting.md +++ b/docs/basic/datetime-parsing-formatting.md @@ -4,7 +4,7 @@ title: A.54. Python DateTime Parsing & Formatting sidebar_label: A.54. DateTime ➜ Parsing & Formatting --- -Chapter ini merupakan lanjutan dari chapter sebelumnmya. Di sini kita akan belajar tentang teknik parsing dan formatting pada tipe data `datetime`. +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` @@ -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.md#a543-tabel-kode-format). +Selengkapnya silakan cek di bagian [A.54.3. Tabel kode format](/basic/datetime-parsing-formatting#a543-tabel-kode-format). ### ◉ Via `datetime.fromisoformat()` terhadap data ISO Date Time (ISO 8601) @@ -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.md#a543-tabel-kode-format). +Selengkapnya silakan cek di bagian [A.54.3. Tabel kode format](/basic/datetime-parsing-formatting#a543-tabel-kode-format). ### ◉ Method `datetime.isoformat()` ➜ ISO Date Time (ISO 8601) diff --git a/docs/basic/eval-exec.md b/docs/basic/eval-exec.md index 8d863632..d027e5a8 100644 --- a/docs/basic/eval-exec.md +++ b/docs/basic/eval-exec.md @@ -23,6 +23,8 @@ Variabel `a`, `b`, dan `c` di ekspresi `'(a + b) / 20 + (c * c)'` nilainya teris Ekspresi string berisi apapun bisa digunakan pada fungsi `eval()` ini, asalkan ekspresinya hanya 1 baris. +> ⚠️ **Peringatan**: Fungsi `eval()` dan `exec()` sangat berbahaya jika digunakan dengan input dari sumber tidak terpercaya, karena dapat mengeksekusi kode berbahaya. Hindari menggunakannya pada data dari user. Sebagai alternatif yang lebih aman, gunakan `ast.literal_eval()` untuk mengevaluasi literal Python. + Jika ekspresi tidak valid, maka eksekusi fungsi `eval()` menghasilkan error, dan ketika itu terjadi ada baiknya di-handle dengan baik. Contoh: ```python @@ -185,6 +187,52 @@ print(res) # 314.0 ``` +## A.57.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. + +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). + +Fungsi `ast.literal_eval()` hanya mengevaluasi literal — tidak bisa mengeksekusi ekspresi arbitrer. Ini membuatnya aman digunakan untuk parsing data dari user. + +Contoh penggunaan: + +```python +import ast + +# aman: mengevaluasi literal dict +data = ast.literal_eval("{'name': 'Noval', 'age': 30}") +print(data) +# output ➜ {'name': 'Noval', 'age': 30} +print(type(data)) +# output ➜ + +# aman: mengevaluasi literal list +numbers = ast.literal_eval("[1, 2, 3, 4, 5]") +print(numbers) +# output ➜ [1, 2, 3, 4, 5] + +# aman: mengevaluasi literal tuple +coord = ast.literal_eval("(10, 20)") +print(coord) +# output ➜ (10, 20) + +# aman: mengevaluasi tipe data primitif +value = ast.literal_eval("3.14") +print(value) +# output ➜ 3.14 +``` + +### ◉ Perbedaan `ast.literal_eval()` vs `eval()` + +| Aspek | `eval()` | `ast.literal_eval()` | +|:-|:-|:-| +| Keamanan | Berbahaya dengan input tidak terpercaya | Aman (hanya literal) | +| Kode yang dieksekusi | Ekspresi Python apapun | Hanya literal Python | +| Risiko injeksi | Tinggi | Tidak ada | + +Jika input yang akan dievaluasi bukan literal (misalnya ekspresi matematika), tetap gunakan `eval()`, tapi pastikan input berasal dari sumber terpercaya. + ---
diff --git a/docs/basic/exception-handling-try-except-else-finally.md b/docs/basic/exception-handling-try-except-else-finally.md index 3b228318..f82d8dad 100644 --- a/docs/basic/exception-handling-try-except-else-finally.md +++ b/docs/basic/exception-handling-try-except-else-finally.md @@ -228,9 +228,9 @@ try: print(f"in fair distribution, each person shall receive {res:.0f} banana") except Exception as err: - if err == ValueError: + if isinstance(err, ValueError): print(f"oops! not valid number detected. {err}") - elif err == ZeroDivisionError: + elif isinstance(err, ZeroDivisionError): print(f"oops! unable to distribute banana because there is no person available. {err}") else: print(f"oops! something wrong. {err}") diff --git a/docs/basic/file.md b/docs/basic/file.md index 437be12e..48eca736 100644 --- a/docs/basic/file.md +++ b/docs/basic/file.md @@ -386,10 +386,36 @@ os.makedirs("C:\\LibsSoftLink\\dasarpemrogramanpython\\examples") - [File/Data Format ➜ CSV](/basic/csv) - [File/Data Format ➜ JSON](/basic/json) -### ◉ TBA +## A.49.12. `pathlib.Path` (modern file path handling) -- Pathlib https://docs.python.org/3/library/pathlib.html -- Search pattern +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. + +```python +from pathlib import Path + +# membuat folder +Path("/path/to/somefolder").mkdir(parents=True, exist_ok=True) + +# mengecek apakah file ada +if Path("/path/to/something/file.txt").is_file(): + print("file.txt is exists") + +# membaca isi file +content = Path("/path/to/something/file.txt").read_text(encoding="utf-8") +print(content) + +# menulis file +Path("/path/to/something/file.txt").write_text("hello python", encoding="utf-8") + +# menampilkan isi folder +for f in Path("/path/to/something").iterdir(): + print(f) + +# menghapus file +Path("/path/to/something/file.txt").unlink() +``` + +Dengan `pathlib`, kode menjadi lebih ringkas dan mudah dibaca tanpa perlu meng-import module `os` secara terpisah. ### ◉ Referensi diff --git a/docs/basic/generator-yield.md b/docs/basic/generator-yield.md index fa340e66..411b5bdd 100644 --- a/docs/basic/generator-yield.md +++ b/docs/basic/generator-yield.md @@ -106,10 +106,11 @@ Contoh operasi baca file yang setiap baris konten file dikembalikan sebagai data ```python def file_reader(file_name): - for row in open(file_name, "r"): - yield row + with open(file_name, "r") as f: + for row in f: + yield row -for row in open('content.txt'): +for row in file_reader('content.txt'): print(row.strip()) ``` diff --git a/docs/basic/json.md b/docs/basic/json.md index 3e3d105e..fd5316a9 100644 --- a/docs/basic/json.md +++ b/docs/basic/json.md @@ -290,6 +290,6 @@ for key in data: ### ◉ Referensi -- https://docs.python.org/3/library/csv.html +- https://docs.python.org/3/library/json.html
diff --git a/docs/basic/lambda.md b/docs/basic/lambda.md index 2d22d646..652b2747 100644 --- a/docs/basic/lambda.md +++ b/docs/basic/lambda.md @@ -161,7 +161,7 @@ def transpose_matrix1(m): tm.append(tr) return tm -transpose_matrix2 = lambda m : [[row[i] for row in matrix] for i in range(len(m[0]))] +transpose_matrix2 = lambda m : [[row[i] for row in m] for i in range(len(m[0]))] matrix = [[1, 2], [3, 4], [5, 6]] diff --git a/docs/basic/local-global-var.md b/docs/basic/local-global-var.md index d191a8b5..87067318 100644 --- a/docs/basic/local-global-var.md +++ b/docs/basic/local-global-var.md @@ -51,7 +51,7 @@ Di editor terlihat variabel `greet_message` digaris-bawahi merah, menandakan ada Sampai sini bisa ditarik kesimpulan bahwa variabel global bisa diakses dari mana saja, sedangkan variabel local bisa diakses di dalam block dimana ia dideklarasikan. Pengaksesan variabel local diluar block-nya memiliki efek samping berikut: - 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 pengaksesaannya dari luar block diperbolehkan dan tidak membuat eksekusi program menjadi error. Namun warning atau error di level linter muncul. +- 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 diff --git a/docs/basic/number-bilangan.md b/docs/basic/number-bilangan.md index 787fca37..fe193e3e 100644 --- a/docs/basic/number-bilangan.md +++ b/docs/basic/number-bilangan.md @@ -204,7 +204,7 @@ print(f"bin2: {bin2:b}") -> Lebih detailnya mengenai string formatting dibahas pada chapter [String Formatting](/basic/string.md#a173-string-formatting) +> Lebih detailnya mengenai string formatting dibahas pada chapter [String Formatting](/basic/string#a173-string-formatting) ### ◉ Operasi perbandingan antar basis diff --git a/docs/basic/operator.md b/docs/basic/operator.md index 0a70a9fc..999c0f28 100644 --- a/docs/basic/operator.md +++ b/docs/basic/operator.md @@ -69,7 +69,7 @@ Python mengenal operasi perbandingan standar yang umumnya juga dipakai di bahasa | :-: | :- | :- | | `and` | operasi logika **AND** | `res = (4 == 5) and (2 != 3)` ➜ hasilnya `res` nilainya `False` | | `or` | operasi logika **OR** | `res = (4 == 5) or (2 != 3)` ➜ hasilnya `res` nilainya `True` | -| `not` atau `!` | operasi logika **negasi** (atau **NOT**) | `res = not (2 == 3)` ➜ hasilnya `res` nilainya `True`
`res = !(2 == 3)` ➜ hasilnya `res` nilainya `True` | +| `not` | operasi logika **negasi** (atau **NOT**) | `res = not (2 == 3)` ➜ hasilnya `res` nilainya `True` | ## A.7.5. Operator bitwise diff --git a/docs/basic/packages.md b/docs/basic/packages.md index 3f840c6d..90dd84b9 100644 --- a/docs/basic/packages.md +++ b/docs/basic/packages.md @@ -211,7 +211,7 @@ Hasilnya adalah error: 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. -Untuk mengatasi error, tambahkan file bernama `___init___.py` di setiap package/folder. Dengan ini maka struktur file program menjadi seperti ini: +Untuk mengatasi error, tambahkan file bernama `__init__.py` di setiap package/folder. Dengan ini maka struktur file program menjadi seperti ini:
diff --git a/docs/basic/pattern-matching.md b/docs/basic/pattern-matching.md index 8009a89c..90983e80 100644 --- a/docs/basic/pattern-matching.md +++ b/docs/basic/pattern-matching.md @@ -431,7 +431,7 @@ class Point: self.x = x self.y = y def info(self): - return f"({x},{y})" + return f"({self.x},{self.y})" import random diff --git a/docs/basic/positional-optional-keyword-argument.md b/docs/basic/positional-optional-keyword-argument.md index 06e3702f..df11e5e0 100644 --- a/docs/basic/positional-optional-keyword-argument.md +++ b/docs/basic/positional-optional-keyword-argument.md @@ -38,7 +38,7 @@ Coba lakukan sedikit experiment dengan mengubah urutan pengisian data contohnya ```python obj4 = create_sorcerer("400 year ago", 400, "human", "Hajime Kashimo") -print(obj3) +print(obj4) # output ➜ {'name': '400 year ago', 'age': 400, 'race': 'human', 'era': 'Hajime Kashimo'} ``` @@ -189,19 +189,19 @@ print_matrix(res4) # output ↓ # # matrix * scalar 4: -# [2, 4, 6, 8] -# [10, 12, 14, 16] -# [18, 20, 22, 24] +# [4, 8, 12, 16] +# [20, 24, 28, 32] +# [36, 40, 44, 48] print(f"matrix * scalar {7}:") res5 = matrix_multiply_scalar(scalar=7, matrix=matrix) +print_matrix(res5) # output ↓ # -# print_matrix(res5) # matrix * scalar 7: -# [2, 4, 6, 8] -# [10, 12, 14, 16] -# [18, 20, 22, 24] +# [7, 14, 21, 28] +# [35, 42, 49, 56] +# [63, 70, 77, 84] ``` Pada kode di atas fungsi `matrix_multiply_scalar()` dipanggil beberapa kali: diff --git a/docs/basic/run-program-python.md b/docs/basic/run-program-python.md index b0b9e65a..70ec5a09 100644 --- a/docs/basic/run-program-python.md +++ b/docs/basic/run-program-python.md @@ -21,7 +21,7 @@ python main.py ### ◉ Menggunakan tombol run `▶` -Cara run program ini lebih praktis karena tingal klik-klik saja. Di toolbar VSCode sebelah kanan atas ada tombol `▶`, gunakan tombol tersebut untuk menjalankan program. +Cara run program ini lebih praktis karena tinggal klik-klik saja. Di toolbar VSCode sebelah kanan atas ada tombol `▶`, gunakan tombol tersebut untuk menjalankan program. ![hello world python](img/hello-python-3.png) diff --git a/docs/basic/slice.md b/docs/basic/slice.md index 372de3c8..a4d47894 100644 --- a/docs/basic/slice.md +++ b/docs/basic/slice.md @@ -169,6 +169,73 @@ print(list3) # output ➜ [6, 7, 9, 11] ``` +## A.20.3. Negative index slicing + +Selain menggunakan index positif (dimulai dari `0`), Python juga mendukung index negatif untuk mengakses element dari akhir sequence. Index `-1` mengacu pada element terakhir, `-2` pada element kedua dari akhir, dan seterusnya. + +```python +data_str = "hello world" +print(data_str[-1]) +# output ➜ d + +print(data_str[-5]) +# output ➜ w +``` + +Notasi slice juga bisa menggunakan index negatif: + +```python +data_str = "hello world" + +# slicing 3 karakter terakhir +slice1 = data_str[-3:] +print(slice1) +# output ➜ rld + +# slicing dari index -5 hingga -2 +slice2 = data_str[-5:-2] +print(slice2) +# output ➜ wor + +# slicing dengan step negatif (reverse) +slice3 = data_str[::-1] +print(slice3) +# output ➜ dlrow olleh + +# slicing dengan step negatif -2 +slice4 = data_str[::-2] +print(slice4) +# output ➜ drwolh +``` + +Kombinasi index negatif dan positif juga diperbolehkan: + +```python +data_list = [2, 4, 6, 7, 9, 11, 13] + +# dari index 1 hingga 2 element terakhir +list1 = data_list[1:-2] +print(list1) +# output ➜ [4, 6, 7, 9] + +# 3 element terakhir +list2 = data_list[-3:] +print(list2) +# output ➜ [9, 11, 13] + +# seluruh element kecuali 2 terakhir +list3 = data_list[:-2] +print(list3) +# output ➜ [2, 4, 6, 7, 9] + +# reverse list +list4 = data_list[::-1] +print(list4) +# output ➜ [13, 11, 9, 7, 6, 4, 2] +``` + +Teknik negative slicing sangat sering digunakan, terutama `[::-1]` untuk reverse sequence dan `[-1]` untuk mengakses element terakhir. + ---
@@ -190,10 +257,6 @@ print(list3) - [String](/basic/string) - [Object ID & Reference](/basic/object-id-reference) -### ◉ TBA - -- Negative index slicing - ### ◉ Referensi - https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range diff --git a/docs/basic/static-method.md b/docs/basic/static-method.md index 821c38c1..1841fb8b 100644 --- a/docs/basic/static-method.md +++ b/docs/basic/static-method.md @@ -72,7 +72,7 @@ Kedua method tersebut diakses untuk memunculkan 5 buah output berbeda via instan Python menyediakan fungsi bernama `staticmethod()` yang kegunaannya adalah untuk mengkonversi fungsi biasa (yang dideklarasikan di luar class) menjadi static method milik suatu class. -Sebagai contoh, kode praktek yang telah ditulis kita *refator* menjadi seperti ini. Fungsi `say_hello()` dan `say_something()` dideklarasikan sebagai fungsi biasa. Kemudian dijadikan sebagai class method milik class `Person` via peneparan `staticmethod()`. +Sebagai contoh, kode praktek yang telah ditulis kita *refactor* menjadi seperti ini. Fungsi `say_hello()` dan `say_something()` dideklarasikan sebagai fungsi biasa. Kemudian dijadikan sebagai class method milik class `Person` via penerapan `staticmethod()`. ```python def say_hello(): diff --git a/docs/basic/string.md b/docs/basic/string.md index a2175406..cb4e7198 100644 --- a/docs/basic/string.md +++ b/docs/basic/string.md @@ -196,7 +196,7 @@ Ada beberapa metode yang bisa digunakan untuk *string concatenation* atau operas Pada penerapannya, karakter pembatas atau *separator* ditulis terlebih dahulu, kemudian di-*chain* dengan method join dengan isi argument adalah list yang ingin digabung. - ````python + ```python text = " ".join(["hello", "python"]) print(text) # output ➜ hello python diff --git a/docs/basic/tipe-data.md b/docs/basic/tipe-data.md index 0a8dd971..0f67ce31 100644 --- a/docs/basic/tipe-data.md +++ b/docs/basic/tipe-data.md @@ -21,7 +21,7 @@ Ada setidaknya 3 tipe data numerik di Python, yaitu: | `float` | menampung bilangan desimal atau *floating point* | ` number_2 = 3.14 ` | | `complex` | menampung nilai berisi kombinasi bilangan real dan imajiner | ` number_3 = 120+3j ` | -> Penjelasan detail mengenai string ada pada chapter [Number](/basic/number-bilangan) +> Penjelasan detail mengenai numerik ada pada chapter [Number](/basic/number-bilangan) ## A.6.2. Tipe data string / `str` @@ -83,7 +83,7 @@ print(data) data = None print(data) -# output ➜ data +# output ➜ None data = "python" print(data) @@ -165,7 +165,7 @@ print("name: %s" % (profile_1["name"])) # output ➜ name: Noval print("hobbies: %s" % (profile_1["hobbies"])) -# output ➜ name: ["gaming", "learning"] +# output ➜ hobbies: ["gaming", "learning"] ``` Penulisan data dictionary diperbolehkan secara horizontal, contohnya seperti berikut: diff --git a/docs/basic/tuple.md b/docs/basic/tuple.md index cfc3e6cd..11275969 100644 --- a/docs/basic/tuple.md +++ b/docs/basic/tuple.md @@ -17,7 +17,7 @@ Tuple adalah tipe data sequence yang ideal digunakan untuk menampung nilai kolek Pada chapter ini kita akan belajar tentang topik ini. -## A.15.1. Tuple vs. List +## A.14.1. Tuple vs. List Tipe data tuple sekilas memiliki beberapa kemiripan dan juga perbedaan jika dibandingkan dengan list. @@ -305,7 +305,7 @@ Bisa dilihat penerapan metode *packing* cukup mudah. Tulis saja data atau variab Pada contoh di atas, variabel `row_data` menampung nilai tuple hasil *packing* variabel `first_name`, `rank`, dan `win`. -O iya, penulisan tuple boleh juga dituliskan tanpa menggunakan karakterk `(` & `)`. +O iya, penulisan tuple boleh juga dituliskan tanpa menggunakan karakter `(` & `)`. ```python # dengan () diff --git a/docs/basic/unicode.md b/docs/basic/unicode.md index b394351e..2485f1b7 100644 --- a/docs/basic/unicode.md +++ b/docs/basic/unicode.md @@ -102,7 +102,7 @@ print(f'code point of {text} in hex: {hex(codePoint)}') # output ➜ code point of 안 in hex: 0xc548 ``` -Bisa dilihat dari program di atas, unicode code point dari karakter `안` dalam bentuk heksadesimal adalah `c548`. Jika dicek pada praktek sebelumnya, kode heksadesimal yang sama kita gunakan juga dalam penulisan karakter unicode menggunakan notasi `\uXXXX` (yaitu `\uc548`). +Bisa dilihat dari program di atas, unicode code point dari karakter `안` dalam bentuk heksadesimal adalah `c548`. Jika dicek pada praktek sebelumnya, kode heksadesimal yang sama kita gunakan juga dalam penulisan karakter unicode menggunakan notasi `\uXXXX` (yaitu `\uC548`). ### ◉ Fungsi `chr()` diff --git a/docs/installation/instalasi-python.md b/docs/installation/instalasi-python.md index af7a468c..d7bc152e 100644 --- a/docs/installation/instalasi-python.md +++ b/docs/installation/instalasi-python.md @@ -10,15 +10,15 @@ Ada banyak cara yang bisa dipilih untuk instalasi Python, silakan pilih sesuai p ### ◉ Instalasi di Windows -- Via [Microsoft Store Package](https://apps.microsoft.com/store/detail/python-310/9PJPW5LDXLZ5?hl=en-id&gl=id&rtc=1) -- Via [Official Python installer](https://www.python.org/downloads/release/python-3106/) -- Via [Chocolatey package manager](https://community.chocolatey.org/packages/python/3.10.6) +- Via [Microsoft Store Package](https://apps.microsoft.com/detail/9ncvdn91xzqp?hl=en-id&gl=id) +- Via [Official Python installer](https://www.python.org/downloads/release/python-3120/) +- Via [Chocolatey package manager](https://community.chocolatey.org/packages/python/3.12.0) - Via [Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/python/web-frameworks) ### ◉ Instalasi di MacOS - Via [Homebrew](https://docs.brew.sh/Homebrew-and-Python) -- Via [Official Python installer](https://www.python.org/downloads/release/python-3106/) +- Via [Official Python installer](https://www.python.org/downloads/release/python-3120/) ### ◉ Instalasi di OS lainnya @@ -26,7 +26,7 @@ Ada banyak cara yang bisa dipilih untuk instalasi Python, silakan pilih sesuai p ### ◉ Instalasi via source code -- Tarball source code bisa diunduh di [situs official Python](https://www.python.org/downloads/release/python-3106/) +- Tarball source code bisa diunduh di [situs official Python](https://www.python.org/downloads/release/python-3120/) ### ◉ Instalasi via Anaconda diff --git a/docs/installation/python-editor-plugin.md b/docs/installation/python-editor-plugin.md index aed849ed..b7eb8da2 100644 --- a/docs/installation/python-editor-plugin.md +++ b/docs/installation/python-editor-plugin.md @@ -12,14 +12,14 @@ Ada cukup banyak pilihan editor dan IDE untuk development menggunakan Python, di - [GNU Emacs](https://www.gnu.org/s/emacs/) - [JetBrains PyCharm](https://www.jetbrains.com/pycharm/) - [Spyder](https://www.spyder-ide.org/) -- [Sublime Text](http://www.sublimetext.com/), dengan tambahan package [Python](https://realpython.com/python-modules-packages/) +- [Sublime Text](http://www.sublimetext.com/), dengan tambahan package [Python](https://www.sublimetext.com/docs/python.html) - [Vim](https://www.vim.org/) - [Visual Studio](https://visualstudio.microsoft.com/vs/features/python/) - [Visual Studio Code (VSCode)](https://code.visualstudio.com/), dengan tambahan extension [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) dan [Jupyter](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) Selain list di atas, ada juga editor lainnya yang bisa digunakan, contohnya seperti: -- [Python standard shell (REPL)](https://www.python.org/shell/) +- [Python standard shell (REPL)](https://docs.python.org/3/tutorial/interpreter.html) - [Jupyter](https://jupyter.org/) ## Preferensi editor penulis