Closure dan Variabel Bebas
Tangkap keadaan dalam fungsi bagian dalam
Closure dan Variabel Bebas adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
Fungsi bersarang
Python memungkinkan Anda mendefinisikan sebuah fungsi di dalam fungsi lain. Fungsi inner dibuat dari awal setiap kali fungsi outer dijalankan.
def outer():
def inner():
return 'from inner'
return inner()
print(outer())inner melihat variabel outer
Fungsi inner dapat membaca variabel yang didefinisikan dalam fungsi pembungkus. Variabel ini disebut variabel bebas karena bukan variabel lokal bagi fungsi inner.
def outer():
message = 'hello'
def inner():
return message
return inner()
print(outer())Apa itu penutupan?
Penutupan terjadi ketika fungsi inner dikembalikan dan tetap mengingat variabel bebas dari cakupan pembungkusnya, bahkan setelah cakupan tersebut selesai.
def make_greeter(name):
def greet():
return 'Hi ' + name
return greet
g = make_greeter('Ada')
print(g())Status yang ditangkap tetap ada
Fungsi outer sudah selesai dikembalikan, tetapi penutupan masih menyimpan name. Nilai tersebut tetap hidup di dalam fungsi yang dikembalikan.
def make_greeter(name):
def greet():
return 'Hi ' + name
return greet
a = make_greeter('Ada')
b = make_greeter('Bob')
print(a())
print(b())Pabrik multiplier
Penutupan sangat berguna sebagai pabrik yang menghasilkan fungsi yang disesuaikan. Di sini, setiap fungsi yang dikembalikan mengalikan nilai dengan faktor yang ditangkap.
def multiplier(factor):
def multiply(n):
return n * factor
return multiply
double = multiplier(2)
triple = multiplier(3)
print(double(10))
print(triple(10))Setiap penutupan berdiri sendiri
Setiap pemanggilan pabrik membuat penutupan terpisah dengan nilainya sendiri yang ditangkap. Penutupan-penutupan tersebut tidak saling memengaruhi.
def adder(amount):
def add(n):
return n + amount
return add
add5 = adder(5)
add100 = adder(100)
print(add5(1), add100(1))Memeriksa nilai yang ditangkap
Nama-nama yang ditangkap tercantum dalam __code__.co_freevars, sedangkan nilainya berada dalam sel __closure__.
def make(x):
def f():
return x
return f
fn = make(42)
print(fn.__code__.co_freevars)
print(fn.__closure__[0].cell_contents)Penutupan menangkap variabel, bukan nilai
Penutupan menangkap variabel itu sendiri, sehingga melihat nilai akhir variabel tersebut. Hal ini penting ketika variabel berubah setelah penutupan dibuat.
def build():
x = 1
def show():
return x
x = 99
return show
print(build()())Jebakan pengikatan terlambat dalam loop
Kesalahan klasik yang sering mengecoh: penutupan yang dibuat dalam loop semuanya berbagi variabel loop yang sama, sehingga menangkap nilai terakhirnya.
funcs = []
for i in range(3):
funcs.append(lambda: i)
print([f() for f in funcs])Memperbaiki pengikatan terlambat
Ikat nilai saat ini dengan argumen bawaan agar setiap penutupan menangkap salinannya sendiri pada waktu definisi.
funcs = []
for i in range(3):
funcs.append(lambda i=i: i)
print([f() for f in funcs])Penutupan sebagai objek ringan
Penutupan menggabungkan data dengan perilaku, mirip objek kecil—sering kali lebih rapi daripada kelas lengkap untuk kasus sederhana.
def counter_start(start):
def value():
return start
return value
c = counter_start(10)
print(c())Pemeriksaan Singkat
Apa yang dimaksud dengan penutupan dalam Python?
Ringkasan: Penutupan dan Variabel Bebas
Gagasan utama:
- Fungsi inner dapat membaca variabel dalam cakupan pembungkusnya (variabel bebas).
- Penutupan adalah fungsi inner yang dikembalikan dan mengingat variabel-variabel tersebut.
- Setiap pemanggilan pabrik membuat penutupan yang berdiri sendiri.
- Penutupan menangkap variabel, bukan nilai, sehingga menyebabkan jebakan pengikatan terlambat dalam loop—perbaiki dengan argumen bawaan.
def power_of(exp):
return lambda base: base ** exp
square = power_of(2)
print(square(9))Pertanyaan yang Sering Diajukan
Apakah pelajaran “Closure dan Variabel Bebas” gratis?
Ya — teks lengkap “Closure dan Variabel Bebas” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Closure dan Variabel Bebas”?
Tangkap keadaan dalam fungsi bagian dalam Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Closure dan Variabel Bebas” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Fungsi Kelas Utama
- Closure dan Variabel Bebas
- nonlocal dan Keadaan yang Dapat Diubah
- Fungsi Parsial