Python da decorator
Bekzod
Posted on January 25, 2023
Decorator larni tushunishdan avval Python da closure funksiyalar ko'rib chiqamiz.
def hello(name):
# ichki funksiya
def get_name():
return f"Hello, {name}!"
# ichki funksiyani qaytarish
return get_name
hello_func = hello("Sarvar")
print(hello_func()) # Hello, Sarvar!
Closure bu ichma-ich funksiyada tashqi funksiya o'zgaruvchilarini ichki funksiyada foydalanish mumkin bo'ladi.
Quyida ikkita sonni ko'paytiradigan closure yaratamiz.
def multiplier(n):
def mul(x):
return x * n
return mul
# Multiplier of 3
mul_three = multiplier(3)
# Multiplier of 5
mul_five = multiplier(5)
print(mul_three(9)) # 27
print(mul_five(3)) # 15
print(mul_five(mul_three(2))) # 30
Decorator yaratishimiz da ham closure orqali amalga oshiramiz.
Decorator orqali boshqa funksiyada ishlatilgan holda uning xususiyatini o'zgartirishimiz mumkin bo'ladi.
Manba: Medium
Decorator funksiya argument sifatida funksiya qabul qiladi.
def make_decorator(func):
def inner():
# Ichki funksiya orqali func xususiyatlarini o'zgartirishimiz mumkin
print("Dekorator ishlayapti")
func()
# Ichki funksiya qaytariladi
return inner
def my_func():
print("Dekorator uchun ishlatiladigan funksiya")
decorated_func = make_decorator(my_func)
decorated_func()
# Dekorator ishlayapti
# Dekorator uchun ishlatiladigan funksiya
Decorator funksiya @
orqali ishlatiladi.
@make_decorator
def my_func():
print("Dekorator uchun ishlatiladigan funksiya")
my_func()
# Dekorator ishlayapti
# Dekorator uchun ishlatiladigan funksiya
Funksiyani argumentlar orqali decoratorda ishlatishni ko'rib chiqamiz.
2 ta sonni bo'ladigan divider(a, b)
funksiya yaratamiz.
def divider(a, b):
return a / b
print(divider(10, 5)) # 2.0
print(divider(10, 0)) # ZeroDivisionError: division by zero
b
o'zgaruvchiga 0 qiymat beriladigan bo'lsa ZeroDevisionError
xatolik qaytaradi, buni oldini olish uchun decorator funksiya yaratamiz.
def divide_decorator(func):
def divide_inner(a, b):
try:
return func(a, b)
except ZeroDivisionError:
print("Nolga bo'lish mumkin emas!")
return divide_inner
@divide_decorator
def divider(a, b):
return a / b
print(divider(10, 5)) # 2.0
print(divider(10, 0)) # Nolga bo'lish mumkin emas!
Bitta funksiyada bir nechta decorator ishlatishimiz ham mumkin, bunda birinchisidan boshlab decoratorlar ishlab keladi.
def divide_decorator(func):
def divide_inner(a, b):
try:
return func(a, b)
except ZeroDivisionError:
print("Nolga bo'lish mumkin emas!")
return divide_inner
def increment_arg_if_second_zero(func):
def inner(a, b):
if b == 0:
b += 1
return func(a, b)
return inner
@increment_arg_if_second_zero
@divide_decorator
def divider(a, b):
return a / b
print(divider(10, 5)) # 2.0
print(divider(10, 0)) # 10.0
Keyingi qismlarda decorator lar bo'yicha murakkab funksiyalarni ko'rib chiqamiz.
Posted on January 25, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.