Python Academy · Pelajaran

Penutupan dan Pemboleh Ubah Bebas

Tangkap keadaan dalam fungsi dalaman

Pelajaran 2 daripada 413 langkah

Penutupan dan Pemboleh Ubah Bebas ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Python Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Fungsi bersarang

Python membolehkan anda mentakrifkan fungsi dalam fungsi lain. Fungsi inner dicipta semula setiap kali fungsi outer dijalankan.

def outer():
    def inner():
        return 'from inner'
    return inner()
print(outer())

Inner melihat pemboleh ubah outer

Fungsi inner boleh membaca pemboleh ubah yang ditakrifkan dalam fungsi yang merangkuminya. Pemboleh ubah ini dipanggil pemboleh ubah bebas kerana pemboleh ubah tersebut bukan setempat kepada fungsi inner.

def outer():
    message = 'hello'
    def inner():
        return message
    return inner()
print(outer())

Apakah penutupan

Penutupan berlaku apabila fungsi inner dipulangkan dan masih mengingati pemboleh ubah bebas daripada skop yang merangkuminya, walaupun skop itu telah selesai.

def make_greeter(name):
    def greet():
        return 'Hi ' + name
    return greet
g = make_greeter('Ada')
print(g())

Keadaan yang ditangkap kekal

Fungsi outer telah pun dipulangkan, namun penutupan itu masih menyimpan name. Nilai tersebut terus wujud di dalam fungsi yang dipulangkan.

def make_greeter(name):
    def greet():
        return 'Hi ' + name
    return greet
a = make_greeter('Ada')
b = make_greeter('Bob')
print(a())
print(b())

Kilang multiplier

Penutupan amat berguna sebagai kilang yang menghasilkan fungsi tersuai. Di sini, setiap fungsi yang dipulangkan mendarab 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 adalah berasingan

Setiap panggilan kepada kilang mencipta penutupan berasingan dengan nilai tangkapannya sendiri. Penutupan tersebut tidak saling mengganggu.

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 ditutup

Nama yang ditangkap disenaraikan dalam __code__.co_freevars, manakala 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 pemboleh ubah, bukan nilai

Penutupan menangkap pemboleh ubah itu sendiri, jadi penutupan melihat nilai akhir pemboleh ubah tersebut. Hal ini penting apabila pemboleh ubah berubah selepas penutupan dicipta.

def build():
    x = 1
    def show():
        return x
    x = 99
    return show
print(build()())

Perangkap gelung pengikatan lewat

Ini ialah perangkap klasik: semua penutupan yang dicipta dalam gelung berkongsi pemboleh ubah gelung yang sama, jadi semuanya menangkap nilai terakhirnya.

funcs = []
for i in range(3):
    funcs.append(lambda: i)
print([f() for f in funcs])

Membaiki pengikatan lewat

Ikat nilai semasa dengan argumen lalai supaya setiap penutupan menangkap salinannya sendiri pada masa 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 tingkah laku, seakan-akan objek kecil — selalunya lebih kemas daripada kelas penuh untuk kes yang ringkas.

def counter_start(start):
    def value():
        return start
    return value
c = counter_start(10)
print(c())

Semakan Pantas

Apakah penutupan dalam Python?

Imbas Kembali: Penutupan dan Pemboleh Ubah Bebas

Idea utama:

  • Fungsi inner boleh membaca pemboleh ubah skop yang merangkuminya, iaitu pemboleh ubah bebas.
  • Penutupan ialah fungsi inner yang dipulangkan dan mengingati pemboleh ubah tersebut.
  • Setiap panggilan kilang mencipta penutupan yang berasingan.
  • Penutupan menangkap pemboleh ubah, bukan nilai, lalu menyebabkan perangkap pengikatan lewat dalam gelung — baikinya dengan argumen lalai.
def power_of(exp):
    return lambda base: base ** exp
square = power_of(2)
print(square(9))
Percuma untuk bermula

Pelajari Python dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
76
Pelajaran
320

Soalan Lazim

Adakah pelajaran “Penutupan dan Pemboleh Ubah Bebas” percuma?

Ya — teks penuh “Penutupan dan Pemboleh Ubah Bebas” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Python Academy, tingkat taraf kepada CoddyKit PRO. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penutupan dan Pemboleh Ubah Bebas”?

Tangkap keadaan dalam fungsi dalaman Anda berlatih Python Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Python Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Python Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Penutupan dan Pemboleh Ubah Bebas” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Fungsi Kelas Pertama
  2. Penutupan dan Pemboleh Ubah Bebas
  3. nonlocal dan Keadaan Boleh Ubah
  4. Fungsi Separa
← Kembali ke Python Academy