Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/basic/abstract-method.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/args-kwargs.md
Original file line number Diff line number Diff line change
Expand Up @@ -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']
```

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/break-continue.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion docs/basic/class-inheritance.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand Down
4 changes: 2 additions & 2 deletions docs/basic/closure.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,8 @@ Di dalam fungsi `aggregate()`, closure `f` diharapkan untuk memiliki parameter y
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanpython-example/tree/master/args-kwargs">
github.com/novalagung/dasarpemrogramanpython-example/../args-kwargs
<a href="https://github.com/novalagung/dasarpemrogramanpython-example/tree/master/closure">
github.com/novalagung/dasarpemrogramanpython-example/../closure
</a>
</pre>

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/csv.md
Original file line number Diff line number Diff line change
Expand Up @@ -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()`.

Expand Down
32 changes: 16 additions & 16 deletions docs/basic/dataclass.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 ↓
#
Expand All @@ -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, []),
Expand All @@ -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 ↓
#
Expand All @@ -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
Expand All @@ -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
```

Expand All @@ -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),
Expand All @@ -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())
Expand Down
6 changes: 3 additions & 3 deletions docs/basic/datetime-parsing-formatting.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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)

Expand Down
48 changes: 48 additions & 0 deletions docs/basic/eval-exec.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 ➜ <class 'dict'>

# 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.

---

<div class="section-footnote">
Expand Down
4 changes: 2 additions & 2 deletions docs/basic/exception-handling-try-except-else-finally.md
Original file line number Diff line number Diff line change
Expand Up @@ -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}")
Expand Down
32 changes: 29 additions & 3 deletions docs/basic/file.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
7 changes: 4 additions & 3 deletions docs/basic/generator-yield.md
Original file line number Diff line number Diff line change
Expand Up @@ -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())
```

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/json.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

</div>
2 changes: 1 addition & 1 deletion docs/basic/lambda.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]]

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/local-global-var.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/number-bilangan.md
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ print(f"bin2: {bin2:b}")
</tbody>
</table>

> 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

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/operator.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`<br />`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

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/packages.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:

<div style={{ width: '250px' }}>

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/pattern-matching.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Loading
Loading