Python vositalari · Kodni funksiyalarga bo‘lish; funksiya o‘zini chaqirganda
Funksiyalar va rekursiya
Medium
Nazariya
Funksiyalar
Funksiya — nomlangan kod bo‘lagi: bir marta yoziladi, ko‘p marta chaqiriladi. Masalani kichik va alohida tekshiriladigan qismlarga bo‘lishning eng yaxshi yo‘li.
def area(w, h):
return w * h
def min_max(a):
return min(a), max(a) # bir nechta qiymat — kortej
lo, hi = min_max([3, 1, 4])
print(area(3, 4)) # 12
Qoidalar
returnfunksiyadan darhol chiqadi.returnbo‘lmasa, funksiyaNoneqaytaradi.- Funksiya ichida yaratilgan o‘zgaruvchi tashqarida ko‘rinmaydi. Kerakli qiymatni parametr orqali bering.
- Ro‘yxatni funksiyaga bersangiz, funksiya o‘sha ro‘yxatni o‘zgartiradi, nusxasini emas.
def f(a=[])deb yozmang: bu ro‘yxat barcha chaqiruvlarda bitta bo‘lib qoladi.a=Noneqo‘yib, ichida yarating.
Rekursiya
Rekursiya — funksiya o‘zini kichikroq kirish bilan chaqiradi. Har rekursiyada ikki qism bo‘ladi: to‘xtash sharti (baza) va kichraytirish qadami.
def factorial(n):
if n == 0: # baza
return 1
return n * factorial(n - 1)
def digits_sum(n):
return n if n < 10 else n % 10 + digits_sum(n // 10)
Qanday o‘ylash kerak
«Kichikroq masala yechilgan deb faraz qilaman. Undan kattasini qanday yasayman?» — shu savolga javob rekursiv qadam bo‘ladi.
Diqqat
- Python’da chuqurlik chegarasi ~1000: chuqur rekursiyada
sys.setrecursionlimit(10**6)yoki siklga o‘tkazing. - Bir xil argument qayta-qayta hisoblansa — eslab qoling (
functools.lru_cache), bu allaqachon DP.
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
return n if n < 2 else fib(n - 1) + fib(n - 2)
Bu kurs uchun masalalar tayyorlanmoqda — hozircha nazariyani o‘qing.