Funksiya — ma'lum bir vazifani bajarish uchun qayta ishlatiladigan kod bloki. Funksiyalar katta dasturni kichikroq, nomlangan bo'laklarga ajratishga, takrorlanishdan qochishga hamda kodni o'qish, test qilish va saqlashni osonlashtirishga yordam beradi.
Python'da funksiyalarning ikki turi mavjud:
- Built-in funksiyalar — allaqachon mavjud, masalan
print(),len(),sum()varange(). - Foydalanuvchi aniqlagan funksiyalar — siz
defbilan o'zingiz yaratadigan funksiyalar.
Python funksiyalarini aniqlash
def kalit so'zi, so'ng funksiya nomi va parametrlar yoziladi:
def print_message(text):
"""Print a message to the console."""
print(text)
Muhim qoidalar:
- Funksiya bloklari
defbilan boshlanadi. - Parametrlar
()ichida yoziladi. - Funksiya tanasi indentatsiya bilan ajratiladi.
returnqiymatni chaqiruvchiga qaytaradi.- Agar
returnbo'lmasa, funksiyaNoneqaytaradi.
Funksiyani chaqirish
Funksiyani aniqlash uni ishga tushirmaydi. Uni chaqirish kerak — buning uchun funksiya nomidan keyin qavslar yoziladi:
def greet():
print("Hello, Python!")
greet() # Hello, Python!
greet() # Hello, Python!
Ichidagi kod faqat funksiya chaqirilganda ishlaydi va uni kerak bo'lganicha ko'p marta chaqirishingiz mumkin.
Parametrlar va argumentlar
Parametr — funksiya aniqlanganda qavslar ichida yoziladigan o'zgaruvchi. Argument — funksiya chaqirilganda yuboriladigan haqiqiy qiymat.
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
print(greet("Bob"))
print(greet("Bob", greeting="Hi"))
Odatda funksiya to'g'ri sondagi argumentlar bilan chaqirilishi shart:
def add(a, b):
return a + b
print(add(3, 4)) # 7
add(3) yoki add(3, 4, 5) deb chaqirish TypeError xatosini keltirib chiqaradi.
return operatori
return funksiyani tugatadi va qiymatni chaqiruvchiga qaytaradi. return'siz (yoki bo'sh return bilan) funksiya None qaytaradi.
def square(n):
return n * n
result = square(5)
print(result) # 25
def no_return():
pass
print(no_return()) # None
Bir nechta qiymat qaytarish
Funksiya bir vaqtning o'zida bir nechta qiymatni tuple sifatida qaytarishi mumkin, uni esa unpack qilib olish mumkin:
def min_max(numbers):
return min(numbers), max(numbers)
low, high = min_max([4, 1, 9, 2])
print(low, high) # 1 9
Keyword argumentlar
Argumentlarni nom bo'yicha berishingiz mumkin. U holda tartib muhim emas:
def describe_pet(animal, name):
print(f"I have a {animal} named {name}.")
describe_pet(name="Milo", animal="cat")
Standart argument qiymatlari
Parametrga standart qiymat bering, shunda chaqiruvchi uni yozmasdan ketishi mumkin:
def power(base, exponent=2):
return base ** exponent
print(power(5)) # 25 (exponent standart 2 bo'ladi)
print(power(5, 3)) # 125
Eslatma: Standart qiymat sifatida o'zgaruvchan (
mutable) obyektdan, masalan ro'yxat yoki dictionary'dan, foydalanmang. Standart qiymat bir marta yaratiladi va barcha chaqiruvlar o'rtasida ulashiladi. Buning o'rnigaNoneishlating va obyektni funksiya ichida yarating.
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item(1)) # [1]
print(add_item(2)) # [2]
Maxsus parametr turlari (Python 3)
Python faqat pozitsiya bilan beriladigan (positional-only) va faqat nom bilan beriladigan (keyword-only) parametrlarni qo'llab-quvvatlaydi:
def combine(a, b, /, sep="-", *, upper=False):
text = f"{a}{sep}{b}"
return text.upper() if upper else text
print(combine("py", "thon"))
print(combine("py", "thon", sep="_", upper=True))
/dan oldingi parametrlar positional-only.*dan keyingi parametrlar keyword-only.
O'zgaruvchan uzunlikdagi argumentlar
Istalgan sondagi pozitsion argumentlarni qabul qilish uchun *args, istalgan sondagi nomli argumentlar uchun **kwargs ishlating:
def total(*numbers):
return sum(numbers)
def show_info(**kwargs):
for key, value in kwargs.items():
print(key, "=", value)
print(total(1, 2, 3, 4))
show_info(name="Alice", age=22)
Funksiya ichida args — tuple, kwargs esa dictionary bo'ladi.
Docstring'lar
Docstring — funksiyaning birinchi qatoriga joylashtirilgan satr literalidir. U funksiya nima qilishini hujjatlashtiradi va help() yoki __doc__ atributi orqali ish vaqtida mavjud bo'ladi.
def area(width, height):
"""Return the area of a rectangle."""
return width * height
print(area.__doc__) # Return the area of a rectangle.
pass operatori
Funksiya tanasi bo'sh bo'lishi mumkin emas. Kodni keyinroq yozmoqchi bo'lsangiz, joy egallovchi sifatida pass ishlating:
def todo_later():
pass
O'zgaruvchi ko'rinish doirasi (scope)
O'zgaruvchi qayerda yaratilgani uning qayerda ishlatilishi mumkinligini belgilaydi. Python nomlarni LEGB qoidasi bo'yicha qidiradi: Local → Enclosing → Global → Built-in.
Funksiya ichida yaratilgan o'zgaruvchi local bo'ladi — u faqat funksiya ishlaganda mavjud bo'ladi:
def show():
message = "inside" # local o'zgaruvchi
print(message)
show()
# print(message) # NameError: message bu yerda aniqlanmagan
global kalit so'zi
Funksiya ichidan modul darajasidagi o'zgaruvchiga qiymat berish uchun uni global deb e'lon qiling:
count = 0
def increment():
global count
count += 1
increment()
increment()
print(count) # 2
nonlocal kalit so'zi
nonlocal ichki funksiyaga tashqi (enclosing) funksiyadagi o'zgaruvchini o'zgartirishga imkon beradi:
def outer():
value = "start"
def inner():
nonlocal value
value = "changed"
inner()
return value
print(outer()) # changed
Ichma-ich funksiyalar
Funksiyani boshqa funksiya ichida aniqlashingiz mumkin. Ichki funksiya tashqi funksiyaning o'zgaruvchilarini o'qiy oladi:
def make_greeter(greeting):
def greet(name):
return f"{greeting}, {name}!"
return greet
say_hi = make_greeter("Hi")
print(say_hi("Sam")) # Hi, Sam!
Rekursiya
Rekursiv funksiya o'zini o'zi chaqiradi. Har bir rekursiyada uni to'xtatadigan bazaviy holat (base case) bo'lishi shart, aks holda u cheksiz ishlaydi:
def factorial(n):
if n <= 1: # bazaviy holat
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120
Funksiyalarda type hint'lar
Parametrlar va qaytariladigan qiymatni annotatsiya qilishingiz mumkin. Hint'lar o'quvchilar va vositalar uchun hujjat bo'lib xizmat qiladi; Python ularni ish vaqtida majburlamaydi.
def greet(name: str, times: int = 1) -> str:
return f"Hello {name}! " * times
print(greet("Ada", 2))
Batafsil Type Hints darsida o'qing.
lambda (anonim funksiya)
Qisqa, bir qatordan iborat funksiyalar uchun:
square = lambda x: x * x
print(square(5))
Murakkab logika uchun kod o'qilishini saqlab qolish maqsadida def ishlating. Batafsil Lambda darsiga qarang.