Pas awal-awal belajar Python, aku pede banget kalau setahun aja sudah cukup buat menguasai semuanya. Sintaksnya simpel, komunitasnya asik, tutorialnya pun bertebaran di mana-mana—kurang apa lagi, kan? Tapi makin lama aku berkecimpung, aku makin sadar kalau aku justru melewatkan hal-hal fundamental.

Lucunya, hal-hal yang bikin aku bingung ini bukan topik “berat” seperti metaclasses atau bikin compiler. Ini cuma dasar-dasar yang selama ini aku salah tangkap atau bahkan kulupakan. Tapi tiap kali aku akhirnya paham konsepnya, rasanya seperti ada hambatan di otak yang tiba-tiba hilang.

Nah, di artikel ini, aku mau berbagi 10 konsep Python yang aku butuh waktu bertahun-tahun buat beneran paham, lengkap dengan contoh simpelnya. Kalau kamu sudah di level intermediate, mungkin kamu bakal manggut-manggut sambil mikir: “Wah, harusnya aku tahu ini dari dulu!”

Yuk, kita mulai.

1. Objek Mutable vs Immutable

Ini “jebakan Batman” klasik di Python. Dulu aku bingung banget kenapa isi list aku bisa berubah sendiri secara ajaib di dalam fungsi.

Python

def add_item(items, value):
    items.append(value)
    return items

my_list = [1, 2, 3]
add_item(my_list, 4)
print(my_list)  # [1, 2, 3, 4] - Terubah langsung di tempatnya!

Kuncinya:

  • Tipe Immutable (int, float, str, tuple) → Kalau diubah, dia bikin objek baru.
  • Tipe Mutable (list, dict, set) → Kalau diubah, dia bakal memodifikasi objek aslinya.Begitu paham bedanya, proses debugging jadi jauh lebih masuk akal.

2. Default Argument yang Mutable

Ini salah satu yang paling sering bikin pusing. Menggunakan objek mutable sebagai default argument bisa bikin perilaku yang “aneh”.

Python

def add_to_list(value, items=[]):
    items.append(value)
    return items

print(add_to_list(1))  # [1]
print(add_to_list(2))  # [1, 2] - Loh, kok list-nya nggak baru?

Solusinya:

Python

def add_to_list(value, items=None):
    if items is None:
        items = []
    items.append(value)
    return items

Penjelasannya: Default argument itu dievaluasi cuma sekali pas fungsi didefinisikan, bukan setiap kali fungsinya dipanggil.

3. Sistem Pass-By-Object-Reference

Dulu aku sering debat apakah Python itu pass-by-reference atau pass-by-value. Kenyataannya? Python pakai pass-by-object-reference.

Simpelnya begini: Variabel itu cuma “label” buat suatu objek. Argumen di fungsi adalah nama baru buat objek yang sama.

Python

def modify(num):
    num += 1
    print("Inside:", num)

x = 5
modify(x)
print("Outside:", x)  # Tetap 5

Pass-by-value terasa benar buat nilai immutable, tapi pass-by-reference terasa benar buat objek mutable. Detail kecil inilah yang sering aku lupakan dulu.

4. is vs ==

Aku sempat mikir keduanya sama saja—sampai akhirnya aku kena batunya.

Python

a = [1, 2]
b = [1, 2]
print(a == b) # True (nilainya sama)
print(a is b) # False (objeknya beda di memori)
  • == → Membandingkan nilai (isinya).
  • is → Membandingkan identitas (alamat memorinya).Aturannya: Selalu pakai is None, jangan == None.

5. Iterator dan Generator

Aku sudah pakai Python bertahun-tahun sebelum akhirnya paham apa itu iterator. Intinya ada di fungsi __next__ dan __iter__.

Python

my_iter = iter([1, 2, 3])
print(next(my_iter)) # 1
print(next(my_iter)) # 2

Generator bikin ini jadi jauh lebih simpel:

Python

def countdown(n):
    while n > 0:
        yield n
        n -= 1

for i in countdown(3):
    print(i)

Aku sempat kaget pas tahu kalau generator nggak menyimpan semua datanya di memori, makanya jauh lebih hemat!

6. List Comprehension vs Generator Expression

Awalnya aku kira mereka cuma beda di kurung saja. Ternyata beda jauh!

Python

# List comprehension: langsung bikin list utuh di RAM
squares = [x*x for x in range(5)]

# Generator expression: "malas", cuma proses satu-satu pas butuh
squares_gen = (x*x for x in range(5))

Kalau kamu lagi mengolah data yang gede banget, generator expression adalah penyelamat memori kamu.

7. Context Managers (Statement with)

Dulu aku sering nulis begini:

Python

f = open("data.txt")
data = f.read()
f.close()

Sampai akhirnya aku dikasih tahu kalau cara ini berisiko. Kalau ada yang error di tengah jalan, filenya nggak bakal pernah tertutup. Solusinya ya context manager:

Python

with open("data.txt") as f:
    data = f.read()

Kerennya, with menjamin proses “bersih-bersih” tetap jalan walaupun ada error. Kamu juga bisa bikin context manager sendiri pakai __enter__ dan __exit__.

8. Kekuatan *args dan **kwargs

Dulu aku menghindari ini karena keliatannya “seram” dan ribet. Padahal sebenarnya ini cuma cara buat membongkar argumen yang dinamis.

Python

def demo(a, *args, **kwargs):
    print("a:", a)
    print("args:", args)
    print("kwargs:", kwargs)

demo(1, 2, 3, x=4, y=5)
# Output:
# a: 1
# args: (2, 3)
# kwargs: {'x': 4, 'y': 5}

Begitu aku mulai pakai ini, nulis fungsi yang bisa dipakai berulang kali (reusable) jadi jauh lebih gampang.

9. Decorator

Lama banget aku cuma jadi “tukang copas” decorator tanpa beneran paham cara kerjanya. Sampai akhirnya contoh ini bikin aku tercerahkan:

Python

def log(func):
    def wrapper(*args, **kwargs):
        print(f"Memanggil fungsi: {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log
def greet(name):
    print(f"Halo, {name}")

greet("Python")

Decorator itu sebenarnya cuma fungsi yang menerima fungsi lain dan mengeluarkan fungsi baru. Begitu paham ini, kesan “ajaib” atau “mistis” dari decorator langsung hilang.

10. Rahasia if __name__ == "__main__"

Dulu aku pikir ini cuma kode formalitas yang harus ada, sampai aku tahu gunanya:

Python

def main():
    print("Dijalankan sebagai skrip!")

if __name__ == "__main__":
    main()

Ini fungsinya biar file kamu bisa fleksibel: bisa dijalankan langsung sebagai skrip, atau di-import sebagai modul tanpa menjalankan kode di dalamnya secara otomatis. Penting banget buat proyek serius!


Penutup

Sepuluh konsep di atas mungkin terdengar sepele kalau cuma dibaca, tapi jujur saja, buatku dulu nggak sesimpel itu. Tiap poin di atas adalah momen “Aha!” dalam perjalananku belajar Python, di mana tiba-tiba semuanya jadi terasa lebih masuk akal.

Kalau kamu masih merasa bingung dengan beberapa poin, tenang saja—itu normal kok. Kuncinya cuma satu: teruslah bereksperimen dengan contoh kode sampai kamu dapat “klik”-nya. Di dunia pemrograman, satu contoh yang pas bisa mengubah cara kamu nulis kode selamanya.

Python itu seru karena banyak hal unik di dalamnya. Jangan cuma dihafal sintaksnya, tapi dimainin, dirusak, dan dipelajari. Semangat ya!

About the Author

Dzul Qurnain

Suka nonton Anime, ngoding dan bagi-bagi tips kalau tahu.. Oh iya, suka baca ( tapi yang menarik menurutku aja)... Praktisi WordPress, web development, SEO, dan server administration yang membagikan tutorial teknis dan catatan implementasi nyata.

View All Articles