Penutupan python

Pada artikel ini, kita akan membahas penutupan python. Sebelum memahami penutupan python, kita perlu memahami fungsi bersarang dan variabel non-lokal.

Fungsi bersarang:

Fungsi bersarang didefinisikan di dalam fungsi lain. Fungsi-fungsi ini dapat mengakses variabel dari fungsi luar. Variabel non-lokal yang dapat kita akses dalam cakupannya.

Mantan:

defouter_fun(s):
    msg = s #non local variable
definner_fun():
print(msg)
inner_fun()

outer_fun('Good morning')

Keluaran:

Dalam contoh di atas, inner_fun adalah fungsi bersarang, dan msg adalah variabel non-lokal. Kita dapat mengaksesnya di dalam outer_fun body.

Definisi Penutupan:

Penutupan Python adalah fungsi bersarang. Kita dapat mengakses variabel di luar lingkup. Konsep ini penting untuk memahami dekorator python.

Semua fungsi bersarang bukan merupakan penutupan. Tiga kriteria berikut harus memenuhi untuk menentukan penutupan:

  1. Kita harus memiliki fungsi bersarang (fungsi di dalam fungsi lain)
  2. Fungsi bersarang harus merujuk ke variabel nonlokal untuk itu
  3. Fungsi lingkup luar harus mengembalikan fungsi dalam.

Contoh :

#defining nested functions
defgreet_msg(s):
    msg = s# msg is having scope in outer function
defprint_msg():
print(msg)#using non local variable
returnprint_msg#return object instead of calling a inner function

call_fun=greet_msg('Good morning')
call_fun()
call_fun()

Keluaran:

Dalam contoh di atas, salam_msg adalah fungsi luar. Ini menciptakan fungsi dalam (greet_msg adalah penutupan di sini), dan itu dikembalikan.

Fungsi luar greet_msg mengembalikan fungsi print_msg, dan ditugaskan ke variabel call_fun. Di sini kita melihat fungsi luar selesai dieksekusi, tetapi kita masih dapat mengakses variabel msg.

Cara memodifikasi variabel di dalam Penutupan:

Menggunakan kata kunci nonlocal kita dapat memodifikasi variabel di dalam fungsi dalam.

Contoh: Tanpa menggunakan kata kunci nonlokal. Di sini kami mencoba memodifikasi variabel num di dalam penutupan dan mendapatkan unboundLocalError karena python menganggap num sebagai variabel lokal dan num tidak didefinisikan di dalam fun().

defgenerate_num():
    num =0
deffun():
        num +=1
print(num)
return fun
g =generate_num()
g()
g()
g()

Keluaran:

Contoh: Dengan menggunakan kata kunci non
lokal.
Dalam contoh di bawah ini menggunakan kata kunci nonlocal kita akan dapat memodifikasi variabel num.

defgenerate_num():
    num =0
deffun():
nonlocal num
        num +=1
print(num)
return fun
g =generate_num()
g()
g()
g()

Keluaran:

Kami akan menulis lebih banyak contoh menggunakan penutupan:

Contoh : Ini akan mencetak argumen yang diteruskan dan nama fungsi

defouter(func):
defclosure(*args):
print('Running "{}" with arguments {}'.format(func.__name__, args))
print(func(*args))
return closure

defadd(a, b):
returna+b

defsub(a, b):
return a-b

defmul(a, b):
return a*b

defdiv(a, b):
return a/b

add_closure= outer(add)
sub_closure= outer(sub)

mul_closure= outer(mul)
div_closure= outer(div)

add_closure(3, 3)
add_closure(4, 5)

sub_closure(10, 5)
sub_closure(20, 10)

mul_closure(10, 5)
mul_closure(20, 10)

div_closure(10, 5)
div_closure(20, 10)

Keluaran:

Contoh: Dalam contoh di bawah ini, setiap kali penutupan dipanggil, nilai akan ditambahkan ke daftar dan itu akan menambahkan semua nilai dalam daftar lalu mengembalikan nilai.

defaddition():
    res = []
deffunc_sum(val):
res.append(val)
sum_res=sum(res)
returnsum_res
returnfunc_sum

s =addition()

t =s(2)
print(t)

t =s(5)
print(t)

t =s(10)
print(t)

t =s(100)
print(t)

Keluaran:

Contoh : Dalam contoh ini, kalikan nomor parameter fungsi dalam dengan parameter fungsi luar
def multiply_by_number(m):

# inner function
defoperation(n):
# m is multiplied  by n
return n * m
# return inner function
return operation

multiply_by_10 =multiply_by_number(10)

# should print 20
print(multiply_by_10(2))
# should print 100
print(multiply_by_10(10))
# should print 120
print(multiply_by_10(12))

Keluaran:

Kesimpulan:

Penutupan Python adalah fungsi bersarang. Dengan ini, kita dapat menghindari useran variabel global menggunakan variabel non-lokal. Ini memberikan beberapa penyembunyian data dan pemahaman konsep ini membantu dalam membangun dekorator python.

Related Posts