defile fonksiyon yazmak, onu çağırmak vereturnileprintarasındaki farkı açıklamak.- Biçimsel ve gerçek parametreleri ayırt etmek, yerel bir değişkenin ana programdaki değişkenleri neden değiştirmediğini bilmek.
- Bir fonksiyonun diğerini çağırdığı programda çağrıların sırasını izlemek ve sonucu bulmak.
- Bir rakam, asallık testi ya da ters çevrilmiş sayı döndüren fonksiyonları listelerde ve
whilekoşulunda kullanmak.
Aynı hesaplamayı programın beş yerine yazmak yerine onu bir kez fonksiyon olarak yazıp beş kez çağırabilirsin. DİM sorularında fonksiyonlar iki rolde görünür: ya asıl kahramandır (bir fonksiyon diğerini çağırır, while koşulunda f(i) durur) ya da bir rakamı, asallığı veya ters sayıyı hesaplayıp listenin her elemanına uygulanan bir yardımcıdır. İki durumda da temel beceri aynıdır: hangi çağrının ne zaman yapıldığını ve hangi değerin geri döndüğünü izlemek.
Fonksiyonun yazılışı: def ve return
Adı olan ve yalnızca çağrıldığında çalışan komutlar grubu. def ad(parametreler): satırıyla tanımlanır, gövdesi girintili yazılır; return ifadesi ise sonucu fonksiyonun çağrıldığı yere geri gönderir.
def square(n):
return n * n
print(square(4))
print(square(3) + square(4))
x = square(square(2))
print(x)▸ Beklenen çıktı
16 25 16
defsatırı iki nokta ile biter; gövde aynı sayıda boşlukla girintili yazılır.- Python
defbloklarını okur ve hatırlar ama çalıştırmaz; program, fonksiyonlardan sonraki ilk girintisiz satırdan başlar. returnfonksiyonu hemen bitirir; ondan sonraki satırlar çalışmaz.returniçermeyen bir fonksiyonNonedöndürür.- Çağrı bir ifadenin içinde de olabilir:
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)▸ Beklenen çıktı
10 None 10
Biçimsel ve gerçek parametreler, yerel değişkenler
def satırındaki parantez içindeki ad: def f(m): yazılışında m. Çağrı sırasında ona gerçek parametrenin değeri atanır.
Çağrıda parantez içine yazılan değer ya da ifade: f(a + 1) çağrısında a + 1. Parametreler sırayla aktarılır: ilk gerçek parametre, adları ne olursa olsun, ilk biçimsel parametreye gider.
Fonksiyonun içinde oluşan değişken (biçimsel parametreler de yereldir). Yalnızca çağrı süresince yaşar; ana programdaki aynı adlı değişken başka bir değişkendir ve fonksiyon onu değiştirmez.
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)▸ Beklenen çıktı
11 5 100 [0, 8, 9]
Fonksiyonun içindeki m ve k yereldir: m 10, k 11 olur ama ana programdaki m = 5 ve k = 100 hiç değişmez. Listede durum farklıdır: fonksiyona listenin kopyası değil kendisi gönderilir; bu yüzden a[0] = 0 ana programdaki b'yi de değiştirir. Kısacası sayı parametresi fonksiyonun içinde değişirse dışarıda hiçbir şey değişmez; listenin bir elemanı değişirse değişiklik dışarıda da 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)▸ Beklenen çıktı
43 3 7
Yukarıdaki programın sonucunu belirleyin.
A) 43 3 7
B) -33 3 7
C) 43 4 3
D) 43 7 3
E) -33 -4 7
Çözümü gösterÇözümü gizle
f(b, a) = f(7, 3): sıraya göre biçimsel a = 7, biçimsel b = 3 olur; adların aynı olması bir şey değiştirmez.Fonksiyonun içinde: a = 7 − 3 = 4,
return 4 · 10 + 3 → 43.Ana programdaki
a ve b yerel değişkenlere bağlı değildir: 3 ve 7 olarak kalır.Cevap: A. B, parametreleri adlarına göre aktaranların; C ise yerel değişkenlerin dışarı “sızdığını” düşünenlerin hatasıdır.
Bir fonksiyon diğerini çağırır: çağrıların sırası
- 1Başlangıcı bul
defbloklarını atla ve ana programın ilk satırından başla. - 2Parametreleri yaz
Her çağrıda gerçek değerleri sırayla biçimsel parametrelere aktar; tabloda bir satır: fonksiyon, parametreler, yerel değişkenler.
- 3İçeriden dışarıya
Fonksiyonun içinde başka bir çağrı varsa mevcut fonksiyonu durdur, içteki çağrıyı sonuna kadar hesapla ve döndürdüğü değerle devam et.
f(g(x))yazılışında önceg(x)hesaplanır. - 4Geri dön
return'den sonra çağrının yapıldığı yere dön ve çağrıyı dönen değerle değiştir. - 5Say
Her fonksiyonun kaç kez çağrıldığını not et; atlanmış bir çağrı en sık yapılan hatadır.
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))▸ Beklenen çıktı
46
| Çağrı | Döndürür | f'nin içinde |
|---|---|---|
g(47) = 7 + 4 | 11 | p = 11 · 3 = 33 |
g(33) = 3 + 3 | 6 | g(n + 5) hâlâ bekliyor |
g(52) = 2 + 5 | 7 | q = 6 + 7 = 13 |
f(47) | 46 | return 33 + 13 |
g üç kez, f bir kez çağrılır; n + 5 = 52, fonksiyona gönderilmeden önce hesaplanı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)▸ Beklenen çıktı
40
Yukarıdaki programın sonucunu belirleyin.
A) 36 B) 40 C) 22 D) 34 E) 52
Çözümü gösterÇözümü gizle
f(4) çağrılır.g(4): k = 7, 14 döndürür → m = 14 − 4 = 10 (yerel m değişti).g(10): k = 13, 26 döndürür → n = 26 + 10 = 36.f(4) = 36; ekrana 36 + 4 = 40 yazılır (B).Yanlış yollar: A, sondaki
+ a'yı unutmak; C, m'nin yeni değerini hesaba katmamak: 14 + 4 + 4 = 22; D, ikinci satırda eski m = 4'ü almak: 26 + 4 + 4 = 34; E, ilk satırdaki - m'yi unutmak.Yardımcı fonksiyonlar: listelerde ve döngü koşulunda
DİM programlarında en sık görülen yardımcı fonksiyonlar küçük algoritmalardır: bir rakam döndürmek (n // 10 % 10 onlar basamağıdır), bölen sayarak asallık testi, sayıyı ters çevirmek, rakamlar toplamı. Üç yerde çalışırlar: a[i] = k(a[i]) gibi listenin her elemanında, if f(x) != 0: b.append(x) gibi bir süzgeçte ve while f(i) < g(k): gibi bir döngü koşulunda. Rakam algoritmalarının kendisi “Sayılar üzerinde işlemler: rakamlar, bölenler ve asal sayılar” dersinde anlatıldı; burada onları fonksiyonlara “paketliyoruz”.
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)▸ Beklenen çıktı
[3, 11, 4, 2, 4, 29, 1]
d(n) bölen sayısını döndürür. Asal sayıların tam iki böleni vardır (1 ve kendisi); bu yüzden 11, 2, 29 yerinde kalır, 9, 15, 21 ise bölen sayılarıyla, yani 3, 4, 4 ile değiştirilir. 1'in yalnızca bir böleni vardır: 1 asal değildir ve d(1) = 1 olduğundan eleman 1 olarak kalı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))▸ Beklenen çıktı
123 321 2 False 450 54 5 False 707 707 0 True 81 18 8 False
Programın yazdırdığı sayıyı belirleyin.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))
Çözümü gösterÇözümü gizle
t(n) onlar basamağını, e(n) birler basamağını döndürür. Her eleman için çarpım:352 → 5 · 2 = 10
417 → 1 · 7 = 7
626 → 2 · 6 = 12
95 → 9 · 5 = 45 (iki basamaklı sayıda onlar basamağı ilk rakamdır)
1203 → 0 · 3 = 0 (onlar basamağı 0'dır)
b = [10, 7, 12, 45, 0], toplam 74,
len(b) = 5.Cevap: 74 + 5 = 79.
Klavyeden −20 girilirse programın sonucunu belirleyin.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
Çözümü gösterÇözümü gizle
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öngü biter
Cevap: C) 8. A, koşulun son kez sağlandığı değerdir ama
i ondan sonra da artırılır.| Fonksiyon | Ne döndürür | Örnek |
|---|---|---|
abs(x) | mutlak değer | abs(-7) → 7 |
len(s) | dizideki karakter ya da listedeki eleman sayısı | len('python') → 6 |
min(...), max(...) | birkaç sayının ya da bir listenin en küçüğü / en büyüğü | min(4, 9, 2) → 2, max([3, 8, 5]) → 8 |
str(n) | sayıyı karakter dizisine çevirir | len(str(305)) → 3 |
int(x) | diziyi sayıya çevirir; ondalık kısmı atar | int('42') → 42, int(7.9) → 7 |
list(s) | diziden karakterler listesi yapar | list('abc') → ['a', 'b', 'c'] |
sum(a) | listenin elemanlarının toplamı | sum([2, 5, 1]) → 8 |
Bir n doğal sayısının rakamları toplamını döndüren digit_sum(n) fonksiyonunu yaz. Ardından a listesindeki rakamları toplamı 3'e bölünen sayıları her biri ayrı satırda yazdır, en sonda da bunların sayısını yazdır.
def digit_sum(n):
s = 0
# add the digits of n to s
return s
a = [12, 45, 71, 303, 58, 999]▸ Beklenen çıktı
12 45 303 999 4
is_prime(n) fonksiyonu n'nin bölenlerini saysın ve bölen sayısı 2 olduğunda True döndürsün. a listesindeki asal sayıların sayısını, ardından en büyük asal sayıyı yazdır.
def is_prime(n):
k = 0
# count the divisors of n
return k == 2
a = [15, 7, 22, 13, 1, 9, 31, 4]▸ Beklenen çıktı
3 31
Böylece modülün “alet çantası” tamamlandı: değişkenler, koşullar, döngüler, karakter dizileri, listeler ve fonksiyonlar. Sonraki derste, “Program yazmak: yazılı görevlerin çözümü”, bunları birleştirip sınavın yazılı görevlerini tam program olarak yazacağız. Sonuçtan giriş değerini bulmayı isteyen while f(i) … türündeki ters sorular “Program analizi: çıktıdan girdiye” dersinde, varsayılan parametreler gibi ek olanaklar ise Python kursunun “Fonksiyonlar” dersindedir.
Önemli noktalar
- Fonksiyon
defile tanımlanır ve yalnızca çağrıldığında çalışır; sonucureturndöndürür, yoksaNonegelir. - Gerçek parametreler biçimsel parametrelere adlarına göre değil, sırayla aktarılır.
- Yerel değişkenler çağrıdan sonra yok olur; sayı parametresini değiştirmek dışarıyı etkilemez, liste elemanını değiştirmek ise etkiler.
- İç içe çağrılar içeriden dışarıya hesaplanır; her çağrının üstüne döndürdüğü değeri yaz.
while f(i) < g(k)döngüsünde sağ tarafı bir kez hesapla, sonraf(i)değerlerini bir tabloyla izle.
Kendini test et
12 soru. Her doğru cevap XP kazandırır.