Məzmuna keç
Educora
Orta9-cu sinif25 dəq36 / 59

Funksiya: def, parametrlər və return

Funksiyanın elan edilməsi və çağırılması, formal və faktiki parametrlər, lokal dəyişənlər, bir funksiyanın digərini çağırması və siyahılar üzərində işləyən köməkçi funksiyalar — DİM tapşırıqlarının izlənməsi ilə.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • def ilə funksiya yazmaq, onu çağırmaq və return ilə print arasındakı fərqi izah etmək.
  • Formal və faktiki parametrləri ayırmaq, lokal dəyişənin əsas proqramın dəyişənlərini nə üçün dəyişmədiyini bilmək.
  • Bir funksiyanın digərini çağırdığı proqramda çağırışların ardıcıllığını izləmək və nəticəni tapmaq.
  • Rəqəm, sadəlik yoxlaması və ya tərs ədəd qaytaran funksiyaları siyahılarda və while şərtində tətbiq etmək.

Eyni hesablamanı proqramın beş yerində yazmaq əvəzinə onu bir dəfə funksiya kimi yazıb beş dəfə çağırmaq olar. DİM tapşırıqlarında funksiya iki rolda görünür: ya əsas qəhrəmandır (bir funksiya digərini çağırır, while şərtində f(i) dayanır), ya da köməkçidir — rəqəmi, sadəliyi və ya tərs ədədi hesablayıb siyahının hər elementinə tətbiq olunur. Hər iki halda əsas bacarıq eynidir: hansı çağırışın nə vaxt baş verdiyini və hansı qiymətin geri qayıtdığını izləmək.

Funksiyanın yazılışı: def və return

Tərif
Funksiya

Adı olan və yalnız çağırıldıqda yerinə yetirilən əmrlər qrupu. def ad(parametrlər): sətri ilə elan edilir, gövdəsi sağa çəkilərək yazılır, nəticəni isə return operatoru funksiyanın çağırıldığı yerə qaytarır.

Python
def square(n):
    return n * n

print(square(4))
print(square(3) + square(4))
x = square(square(2))
print(x)
▸ Gözlənilən nəticə
16
25
16
  • def sətri iki nöqtə ilə bitir, gövdə eyni sayda boşluqla sağa çəkilir.
  • Python def bloklarını oxuyub yadda saxlayır, amma icra etmir; proqram funksiyalardan sonrakı ilk sağa çəkilməmiş sətirdən başlayır.
  • return funksiyanı dərhal bitirir: ondan sonrakı sətirlər icra olunmur.
  • return olmayan funksiya None qaytarır.
  • Çağırış ifadənin içində də dura bilər: square(3) + square(4), square(square(2)).
Python
def f1(n):
    print(n * 2)

def f2(n):
    return n * 2
    print('never')

a = f1(5)
b = f2(5)
print(a, b)
▸ Gözlənilən nəticə
10
None 10

Formal və faktiki parametrlər, lokal dəyişənlər

Tərif
Formal parametr

def sətrində mötərizədəki ad: def f(m): yazılışında m. Çağırış zamanı ona faktiki parametrin qiyməti mənimsədilir.

Tərif
Faktiki parametr (arqument)

Çağırışda mötərizəyə yazılan qiymət və ya ifadə: f(a + 1) çağırışında a + 1. Parametrlər sıra ilə ötürülür: birinci faktiki parametr birinci formal parametrə düşür, adların eyni olub-olmaması rol oynamır.

Tərif
Lokal dəyişən

Funksiyanın içində yaranan dəyişən (formal parametrlər də lokaldır). O, yalnız çağırış müddətində yaşayır; əsas proqramdakı eyniadlı dəyişən başqa dəyişəndir və funksiya onu dəyişmir.

Python
def f(m):
    m = m * 2
    k = m + 1
    return k

m = 5
k = 100
print(f(m), m, k)

def zero_first(a):
    a[0] = 0

b = [7, 8, 9]
zero_first(b)
print(b)
▸ Gözlənilən nəticə
11 5 100
[0, 8, 9]

Funksiyanın içindəki m və k lokaldır: m 10, k 11 olur, amma əsas proqramdakı m = 5 və k = 100 toxunulmaz qalır. Siyahı ilə vəziyyət başqadır: funksiyaya siyahının surəti yox, özü ötürülür, ona görə a[0] = 0 əsas proqramdakı b-ni də dəyişir. Qısaca: ədəd parametri funksiyanın içində dəyişsə, çöldə heç nə dəyişmir; siyahının elementi dəyişsə, dəyişiklik çöldə də görünür.

Python
def f(a, b):
    a = a - b
    return a * 10 + b

a = 3
b = 7
print(f(b, a), a, b)
▸ Gözlənilən nəticə
43 3 7
DİM tipli tapşırıq (qapalı)

Yuxarıdakı proqramın nəticəsini müəyyən edin.
A) 43 3 7
B) -33 3 7
C) 43 4 3
D) 43 7 3
E) -33 -4 7

Həllini göstər
Çağırış f(b, a) = f(7, 3): sıra ilə formal a = 7, formal b = 3 olur — adların eyni olması heç nəyi dəyişmir.
Funksiyanın içində: a = 7 − 3 = 4, return 4 · 10 + 3 → 43.
Əsas proqramdakı a və b lokal dəyişənlərdən asılı deyil: 3 və 7 olaraq qalır.
Cavab: A. B parametrləri adlara görə ötürənlərin, C isə lokal dəyişənlərin çölə «sızdığını» düşünənlərin səhvidir.

Bir funksiya digərini çağırır: çağırışların ardıcıllığı

  1. 1
    Başlanğıcı tap

    def bloklarını ötür və əsas proqramın birinci sətrindən başla.

  2. 2
    Parametrləri yaz

    Hər çağırışda faktiki qiymətləri sıra ilə formal parametrlərə köçür; cədvəldə bir sətir: funksiya, parametrlər, lokal dəyişənlər.

  3. 3
    İçəridən çölə

    Funksiyanın içində başqa çağırış varsa, cari funksiyanı dayandır, daxili çağırışı sona qədər hesabla və onun qaytardığı qiymətlə davam et. f(g(x)) yazılışında əvvəl g(x) hesablanır.

  4. 4
    Geri qayıt

    return-dən sonra çağırışın olduğu yerə qayıt və çağırışı qaytarılan qiymətlə əvəz et.

  5. 5
    Say

    Hər funksiyanın neçə dəfə çağırıldığını qeyd et — buraxılmış çağırış ən çox rast gəlinən səhvdir.

Python
def g(x):
    return x % 10 + x // 10

def f(n):
    p = g(n) * 3
    q = g(p) + g(n + 5)
    return p + q

print(f(47))
▸ Gözlənilən nəticə
46
ÇağırışQaytarırf-in içində
g(47) = 7 + 411p = 11 · 3 = 33
g(33) = 3 + 36g(n + 5) hələ gözləyir
g(52) = 2 + 57q = 6 + 7 = 13
f(47)46return 33 + 13
g üç dəfə, f bir dəfə çağırılır; n + 5 = 52 funksiyaya ötürülməzdən əvvəl hesablanır.
Python
def g(k):
    k = k + 3
    return k * 2

def f(m):
    m = g(m) - m
    n = g(m) + m
    return n

a = 4
print(f(a) + a)
▸ Gözlənilən nəticə
40
DİM tipli tapşırıq (qapalı)

Yuxarıdakı proqramın nəticəsini müəyyən edin.
A) 36 B) 40 C) 22 D) 34 E) 52

Həllini göstər
Əsas proqram: a = 4, f(4) çağırılır.
g(4): k = 7, qaytarır 14 → m = 14 − 4 = 10 (lokal m dəyişdi).
g(10): k = 13, qaytarır 26 → n = 26 + 10 = 36.
f(4) = 36, çap olunur 36 + 4 = 40 (B).
Səhv yollar: A — sonda + a-nı unutmaq; C — m-in yeni qiymətini nəzərə almamaq: 14 + 4 + 4 = 22; D — ikinci sətirdə köhnə m = 4-ü götürmək: 26 + 4 + 4 = 34; E — birinci sətirdə - m-i unutmaq.

Köməkçi funksiyalar: siyahılarda və dövr şərtində

DİM proqramlarında ən çox rast gəlinən köməkçi funksiyalar kiçik alqoritmlərdir: rəqəm qaytarmaq (n // 10 % 10 — onluqlar rəqəmi), bölənlərin sayı ilə sadəlik yoxlaması, ədədi tərsinə çevirmək, rəqəmlərin cəmi. Onlar üç yerdə işləyir: a[i] = k(a[i]) kimi siyahının hər elementində, if f(x) != 0: b.append(x) kimi süzgəcdə və while f(i) < g(k): kimi dövr şərtində. Rəqəm alqoritmlərinin özü «Ədədlər üzərində əməllər: rəqəmlər, bölənlər və sadə ədədlər» dərsində izah olunub; burada onları funksiyaya «qablaşdırırıq».

Python
def d(n):
    k = 0
    for i in range(1, n + 1):
        if n % i == 0:
            k = k + 1
    return k

a = [9, 11, 15, 2, 21, 29, 1]
for i in range(0, len(a)):
    if d(a[i]) != 2:
        a[i] = d(a[i])
print(a)
▸ Gözlənilən nəticə
[3, 11, 4, 2, 4, 29, 1]

d(n) bölənlərin sayını qaytarır. Sadə ədədlərin düz iki böləni var (1 və özü), ona görə 11, 2, 29 yerində qalır, 9, 15, 21 isə bölənlərinin sayı ilə — 3, 4, 4 ilə — əvəz olunur. 1-in yalnız bir böləni var: 1 sadə ədəd deyil, d(1) = 1 olduğundan element 1 olaraq qalır.

Python
def rev(n):
    r = 0
    while n > 0:
        r = r * 10 + n % 10
        n = n // 10
    return r

def tens(n):
    return n // 10 % 10

for x in [123, 450, 707, 81]:
    print(x, rev(x), tens(x), x == rev(x))
▸ Gözlənilən nəticə
123 321 2 False
450 54 5 False
707 707 0 True
81 18 8 False
DİM tipli tapşırıq (kodlaşdırılan cavab)

Proqramın çap etdiyi ədədi müəyyən edin.
def t(n): return n // 10 % 10
def e(n): return n % 10
a = [352, 417, 626, 95, 1203]
b = []
for x in a: b.append(t(x) * e(x))
print(sum(b) + len(b))

Həllini göstər
t(n) onluqlar rəqəmini, e(n) təklik rəqəmini qaytarır. Hər element üçün hasil:
352 → 5 · 2 = 10
417 → 1 · 7 = 7
626 → 2 · 6 = 12
95 → 9 · 5 = 45 (ikirəqəmli ədəddə onluqlar rəqəmi birinci rəqəmdir)
1203 → 0 · 3 = 0 (onluqlar rəqəmi 0-dır)
b = [10, 7, 12, 45, 0], cəm 74, len(b) = 5.
Cavab: 74 + 5 = 79.
DİM tipli tapşırıq (qapalı)

Klaviaturadan −20 daxil edilərsə, proqramın nəticəsini müəyyən edin.
def f(n): return n * n + 1
def g(n): return 3 * n - 4
k = abs(int(input()))
i = 0
while f(i) <= g(k): i = i + 2
print(i)
A) 6 B) 7 C) 8 D) 10 E) 4

Həllini göstər
k = |−20| = 20, g(20) = 3 · 20 − 4 = 56 — bu qiymət dövr boyu dəyişmir.
i = 0: f(0) = 1 ≤ 56 → i = 2
i = 2: f(2) = 5 ≤ 56 → i = 4
i = 4: f(4) = 17 ≤ 56 → i = 6
i = 6: f(6) = 37 ≤ 56 → i = 8
i = 8: f(8) = 65 > 56 → dövr bitir
Cavab: C) 8. A şərtin sonuncu dəfə ödəndiyi qiymətdir, amma i ondan sonra da artırılır.
FunksiyaNə qaytarırNümunə
abs(x)ədədin moduluabs(-7) → 7
len(s)sətirdə simvolların, siyahıda elementlərin sayılen('python') → 6
min(...), max(...)bir neçə ədədin və ya siyahının ən kiçiyi / ən böyüyümin(4, 9, 2) → 2, max([3, 8, 5]) → 8
str(n)ədədi sətirə çevirirlen(str(305)) → 3
int(x)sətri ədədə çevirir; kəsr hissəni atırint('42') → 42, int(7.9) → 7
list(s)sətirdən simvollar siyahısı düzəldirlist('abc') → ['a', 'b', 'c']
sum(a)siyahının elementlərinin cəmisum([2, 5, 1]) → 8
Tapşırıq

digit_sum(n) funksiyasını yaz: o, n natural ədədinin rəqəmləri cəmini qaytarsın. Sonra a siyahısından rəqəmləri cəmi 3-ə bölünən ədədləri hərəsini ayrı sətirdə çap et, sonda isə onların sayını çap et.

Tapşırıq · Python
def digit_sum(n):
    s = 0
    # add the digits of n to s
    return s

a = [12, 45, 71, 303, 58, 999]
▸ Gözlənilən nəticə
12
45
303
999
4
Tapşırıq

is_prime(n) funksiyası n-in bölənlərini saysın və bölənlərin sayı 2 olduqda True qaytarsın. a siyahısındakı sadə ədədlərin sayını, sonra ən böyük sadə ədədi çap et.

Tapşırıq · Python
def is_prime(n):
    k = 0
    # count the divisors of n
    return k == 2

a = [15, 7, 22, 13, 1, 9, 31, 4]
▸ Gözlənilən nəticə
3
31

Bununla modulun «alətlər qutusu» tamamlanır: dəyişənlər, şərtlər, dövrlər, sətirlər, siyahılar və funksiyalar. Növbəti dərsdə — «Proqram yazmaq: yazılı tapşırıqların həlli» — onları birləşdirib imtahanın yazılı tapşırıqlarını tam proqram kimi yazacağıq. Nəticəyə görə giriş qiymətini tapmaq tələb olunan while f(i) … tipli tərs tapşırıqlar «Proqramın analizi: nəticədən giriş qiymətinə» dərsindədir, susmaya görə parametrlər kimi əlavə imkanlar isə Python kursunun «Funksiyalar» dərsində.

Əsas fikirlər

  • Funksiya def ilə elan edilir və yalnız çağırılanda işləyir; nəticəni return qaytarır, return olmasa — None.
  • Faktiki parametrlər formal parametrlərə sıra ilə ötürülür, adlara görə yox.
  • Lokal dəyişənlər çağırışdan sonra yox olur; ədəd parametrini dəyişmək çöldəki dəyişənə təsir etmir, siyahının elementini dəyişmək isə təsir edir.
  • İç-içə çağırışlar içəridən çölə hesablanır; hər çağırışın üstünə onun qaytardığı qiyməti yaz.
  • while f(i) < g(k) dövründə sağ tərəfi bir dəfə hesabla, sonra f(i) qiymətlərini cədvəllə izlə.

Özünü yoxla

12 sual. Hər düzgün cavab XP qazandırır.

1 / 12
Funksiyanın nəticəsini çağırıldığı yerə hansı açar söz qaytarır?