Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Python

Penutupan Python

Penutupan Python

Dalam tutorial ini, Anda akan belajar tentang penutupan Python, cara mendefinisikan penutupan, dan alasan Anda harus menggunakannya.

Variabel nonlokal dalam fungsi bertingkat

Sebelum masuk ke dalam apa itu penutupan, kita harus terlebih dahulu memahami apa itu fungsi bersarang dan variabel nonlokal.

Fungsi yang didefinisikan di dalam fungsi lain disebut fungsi bersarang. Fungsi bersarang dapat mengakses variabel lingkup terlampir.

Dalam Python, variabel non-lokal ini hanya-baca secara default dan kita harus mendeklarasikannya secara eksplisit sebagai non-lokal (menggunakan kata kunci nonlokal) untuk mengubahnya.

Berikut adalah contoh fungsi bersarang yang mengakses variabel non-lokal.

def print_msg(msg):
    # This is the outer enclosing function

    def printer():
        # This is the nested function
        print(msg)

    printer()

# We execute the function
# Output: Hello
print_msg("Hello")

Keluaran

Hello

Kita dapat melihat bahwa printer() . bersarang fungsi dapat mengakses msg non non-lokal variabel fungsi terlampir.


Mendefinisikan Fungsi Penutupan

Pada contoh di atas, apa yang akan terjadi jika baris terakhir dari fungsi print_msg() mengembalikan printer() fungsi alih-alih memanggilnya? Ini berarti fungsi didefinisikan sebagai berikut:

def print_msg(msg):
    # This is the outer enclosing function

    def printer():
        # This is the nested function
        print(msg)

    return printer  # returns the nested function


# Now let's try calling this function.
# Output: Hello
another = print_msg("Hello")
another()

Keluaran

Hello

Itu tidak biasa.

print_msg() fungsi dipanggil dengan string "Hello" dan fungsi yang dikembalikan terikat dengan nama another . Saat memanggil another() , pesannya tetap diingat meskipun kita sudah selesai mengeksekusi print_msg() fungsi.

Teknik ini dimana beberapa data ("Hello dalam hal ini) dilampirkan ke kode yang disebut penutupan dengan Python .

Nilai dalam lingkup terlampir diingat bahkan ketika variabel keluar dari lingkup atau fungsi itu sendiri dihapus dari namespace saat ini.

Coba jalankan perintah berikut di shell Python untuk melihat hasilnya.

>>> del print_msg
>>> another()
Hello
>>> print_msg("Hello")
Traceback (most recent call last):
...
NameError: name 'print_msg' is not defined

Di sini, fungsi yang dikembalikan masih berfungsi meskipun fungsi aslinya telah dihapus.


Kapan kami tutup?

Seperti yang terlihat dari contoh di atas, kita memiliki penutupan di Python ketika fungsi bersarang mereferensikan nilai dalam cakupan terlampirnya.

Kriteria yang harus dipenuhi untuk membuat penutupan dengan Python dirangkum dalam poin-poin berikut.


Kapan menggunakan penutupan?

Jadi apa gunanya penutupan?

Penutupan dapat menghindari penggunaan nilai global dan menyediakan beberapa bentuk penyembunyian data. Ini juga dapat memberikan solusi berorientasi objek untuk masalah tersebut.

Ketika ada beberapa metode (satu metode dalam banyak kasus) untuk diimplementasikan di kelas, penutupan dapat memberikan solusi alternatif dan lebih elegan. Tetapi ketika jumlah atribut dan metode bertambah besar, lebih baik mengimplementasikan sebuah kelas.

Berikut adalah contoh sederhana di mana penutupan mungkin lebih disukai daripada mendefinisikan kelas dan membuat objek. Tapi preferensi ada di tangan Anda.

def make_multiplier_of(n):
    def multiplier(x):
        return x * n
    return multiplier


# Multiplier of 3
times3 = make_multiplier_of(3)

# Multiplier of 5
times5 = make_multiplier_of(5)

# Output: 27
print(times3(9))

# Output: 15
print(times5(3))

# Output: 30
print(times5(times3(2)))

Keluaran

27
15
30

Dekorator Python juga menggunakan penutupan secara ekstensif.

Sebagai catatan penutup, ada baiknya untuk menunjukkan bahwa nilai-nilai yang terlampir dalam fungsi penutupan dapat ditemukan.

Semua objek fungsi memiliki __closure__ atribut yang mengembalikan tuple objek sel jika itu adalah fungsi penutupan. Mengacu pada contoh di atas, kita tahu times3 dan times5 adalah fungsi penutupan.

>>> make_multiplier_of.__closure__
>>> times3.__closure__
(<cell at 0x0000000002D155B8: int object at 0x000000001E39B6E0>,)

Objek sel memiliki atribut cell_contents yang menyimpan nilai tertutup.

>>> times3.__closure__[0].cell_contents
3
>>> times5.__closure__[0].cell_contents
5

Python

  1. Tipe Data Python
  2. Operator Python
  3. Pernyataan lulus python
  4. Fungsi Python Anonim/Lambda
  5. Kamus Python
  6. Generator Python
  7. Dekorator Python
  8. Python String strip() Fungsi dengan CONTOH
  9. Fungsi Python Lambda dengan CONTOH
  10. Python abs() Fungsi:Contoh Nilai Absolut