Гузариш ба мундариҷа
Мавзӯи 14 аз 18

Функсияҳо

Вақте як амал дар барнома якчанд бор лозим аст, онро ҳамчун функсия ташкил медиҳанд: ба порчаи код ном медиҳанд ва онро аз рӯи ном даъват мекунанд. Функсияҳо кодро кӯтоҳтар ва фаҳмотар мекунанд ва аз нусхабардорӣ халос мекунанд.

Аз функсияҳои дохилӣ ту аллакай истифода мебарӣ: print, len, max, sorted. Акнун навиштани функсияҳои худро меомӯзем.

def ва return

def square(x):
    return x * x

print(square(5))          # 25
print(square(3) + 1)      # 10
  • def ном(параметрҳо): — сарлавҳаи функсия;
  • ҷисм бо отступ навишта мешавад;
  • return қимат — функсияро тамом мекунад ва натиҷаро ба ҷое, ки аз он даъват шуда буд, бармегардонад.

Вақте Python def-ро мехонад, функсия танҳо муайян мешавад. Он ҳангоми даъват иҷро мешавад — square(5).

Параметрҳо

Параметрҳо метавонанд якчанд бошанд ё умуман набошанд:

def area(w, h):
    return w * h

def line():
    print("-" * 20)

print(area(3, 4))   # 12
line()

Параметр метавонад қимати пешфарз дошта бошад:

def power(x, n=2):
    return x ** n

print(power(5))      # 25
print(power(2, 10))  # 1024

return ва print — як чиз нестанд

print қиматро дар экран нишон медиҳад, return бошад онро ба барнома медиҳад. Натиҷаи функсияи бе return — None аст:

def bad_square(x):
    print(x * x)        # чоп мекунад, вале барнамегардонад

y = bad_square(4)       # дар экран 16
print(y + 1)            # хато: None + 1

Қоидаи хуб: функсия ҳисоб мекунад ва бармегардонад, барномаи асосӣ бошад чоп мекунад.

return-ро якчанд бор истифода бурдан мумкин аст — функсия дар аввалини иҷрошуда тамом мешавад:

def sign(x):
    if x > 0:
        return 1
    if x < 0:
        return -1
    return 0

Якчанд қиматро бо кортеж баргардонидан мумкин аст: return q, r, ва бо кушодан қабул кардан: q, r = divide(17, 5).

Функсияҳо-санҷишҳо

Функсияе, ки True ё False бармегардонад, шартҳоро хонотар мекунад:

def is_even(x):
    return x % 2 == 0

def has_seven(x):
    while x > 0:
        if x % 10 == 7:
            return True
        x //= 10
    return False

count = 0
for x in range(1, 101):
    if is_even(x) and has_seven(x):
        count += 1
print(count)     # 5

Муқоиса кун: бе функсияҳо ҳамаи ин як давраи дароз бо шартҳои дарунӣ мешуд.

Доираи намоёнӣ

Тағйирёбандаҳое, ки дар дохили функсия сохта шудаанд, маҳаллӣ мебошанд: онҳо аз берун намоён нестанд ва тағйирёбандаҳои барномаи асосиро бо ҳамон ном вайрон намекунанд.

total = 100

def f():
    total = 1       # ин тағйирёбандаи дигари маҳаллӣ аст
    return total

print(f(), total)   # 1 100

Тағйирёбандаҳои глобалиро дар дохили функсия хондан мумкин аст, вале ҳама чизи лозимиро тавассути параметрҳо додан беҳтар аст — ҳамин тавр функсияро санҷидан ва аз нав истифода бурдан осонтар аст.

Функсияҳо ҳамчун қимат ва lambda

Функсияро ба функсияи дигар додан мумкин аст. key дар мураттабсозӣ ҳамин тавр кор мекунад — мо медиҳем, ки аз рӯи кадом қоида муқоиса кардан лозим:

def last_digit(x):
    return x % 10

nums = [35, 12, 99, 41]
print(sorted(nums, key=last_digit))   # [41, 12, 35, 99]

Барои функсияи кӯтоҳи яксатра lambda ҳаст:

print(sorted(nums, key=lambda x: x % 10))   # ҳамон чиз

lambda x: ифода — функсияи беном аст, ки қимати ифодаро бармегардонад.

Мураттабсозӣ аз рӯи якчанд аломат

Калид метавонад кортеж баргардонад — он гоҳ элементҳо аз рӯи аломати аввал, ҳангоми баробарӣ аз рӯи дуюм ва ҳамин тавр муқоиса мешаванд:

words = ["нок", "гурба", "себ", "анор", "дарахт"]
words.sort(key=lambda w: (len(w), w))
print(words)   # ['нок', 'себ', 'анор', 'гурба', 'дарахт']

Аввал аз рӯи дарозӣ, ҳангоми дарозии якхела — аз рӯи алифбо. Барои он ки ягон аломат бо тартиби камшавӣ равад, ба ададҳо минус мегузоранд: key=lambda p: (-p[1], p[0]).

Хулоса

  • def ном(параметрҳо): функсияро эълон мекунад, return натиҷаро бармегардонад;
  • бе return функсия None бармегардонад; дар функсия ҳисоб кун, берун чоп кун;
  • тағйирёбандаҳо дар дохили функсия маҳаллианд;
  • функсияро ҳамчун key додан мумкин аст; lambda x: ... — функсияи кӯтоҳ;
  • калид-кортеж аз рӯи якчанд аломат мураттаб мекунад, минус дар адад — бо тартиби камшавӣ.