defilə funksiya yazmaq, onu çağırmaq vəreturniləprintarası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
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.
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
defsətri iki nöqtə ilə bitir, gövdə eyni sayda boşluqla sağa çəkilir.- Python
defbloklarını oxuyub yadda saxlayır, amma icra etmir; proqram funksiyalardan sonrakı ilk sağa çəkilməmiş sətirdən başlayır. returnfunksiyanı dərhal bitirir: ondan sonrakı sətirlər icra olunmur.returnolmayan funksiyaNoneqaytarır.- Çağırış ifadənin içində də dura bilər:
square(3) + square(4),square(square(2)).
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
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.
Ç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.
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.
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.
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
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ərHəllini gizlət
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ığı
- 1Başlanğıcı tap
defbloklarını ötür və əsas proqramın birinci sətrindən başla. - 2Parametrlə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İçə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əlg(x)hesablanır. - 4Geri qayıt
return-dən sonra çağırışın olduğu yerə qayıt və çağırışı qaytarılan qiymətlə əvəz et. - 5Say
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.
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ır | f-in içində |
|---|---|---|
g(47) = 7 + 4 | 11 | p = 11 · 3 = 33 |
g(33) = 3 + 3 | 6 | g(n + 5) hələ gözləyir |
g(52) = 2 + 5 | 7 | q = 6 + 7 = 13 |
f(47) | 46 | return 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.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
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ərHəllini gizlət
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».
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.
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
Proqramın çap etdiyi ədədi müəyyən edin.def t(n): return n // 10 % 10def e(n): return n % 10a = [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ərHəllini gizlət
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.
Klaviaturadan −20 daxil edilərsə, proqramın nəticəsini müəyyən edin.def f(n): return n * n + 1def g(n): return 3 * n - 4k = abs(int(input()))i = 0while f(i) <= g(k): i = i + 2print(i)
A) 6 B) 7 C) 8 D) 10 E) 4
Həllini göstərHəllini gizlət
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.| Funksiya | Nə qaytarır | Nümunə |
|---|---|---|
abs(x) | ədədin modulu | abs(-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ə çevirir | len(str(305)) → 3 |
int(x) | sətri ədədə çevirir; kəsr hissəni atır | int('42') → 42, int(7.9) → 7 |
list(s) | sətirdən simvollar siyahısı düzəldir | list('abc') → ['a', 'b', 'c'] |
sum(a) | siyahının elementlərinin cəmi | sum([2, 5, 1]) → 8 |
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.
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
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.
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
defilə elan edilir və yalnız çağırılanda işləyir; nəticənireturnqaytarır,returnolmasa —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, sonraf(i)qiymətlərini cədvəllə izlə.
Özünü yoxla
12 sual. Hər düzgün cavab XP qazandırır.