İçeriğe geç
Educora
Orta9. sınıf25 dk36 / 59

Fonksiyon: def, parametreler ve return

Fonksiyon tanımlama ve çağırma, biçimsel ve gerçek parametreler, yerel değişkenler, bir fonksiyonun diğerini çağırması ve listeler üzerinde çalışan yardımcı fonksiyonlar; DİM tarzı izleme ile.

Kendini test et
Bu derste öğreneceklerin
  • def ile fonksiyon yazmak, onu çağırmak ve return ile print arası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 while koş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

Tanım
Fonksiyon

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.

Python
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
  • def satırı iki nokta ile biter; gövde aynı sayıda boşlukla girintili yazılır.
  • Python def bloklarını okur ve hatırlar ama çalıştırmaz; program, fonksiyonlardan sonraki ilk girintisiz satırdan başlar.
  • return fonksiyonu hemen bitirir; ondan sonraki satırlar çalışmaz.
  • return içermeyen bir fonksiyon None döndürür.
  • Çağrı bir ifadenin içinde de olabilir: 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)
▸ Beklenen çıktı
10
None 10

Biçimsel ve gerçek parametreler, yerel değişkenler

Tanım
Biçimsel parametre

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.

Tanım
Gerçek parametre (argüman)

Ç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.

Tanım
Yerel değişken

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.

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)
▸ 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.

Python
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
DİM tarzı soru (kapalı)

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
Çağrı 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ı

  1. 1
    Başlangıcı bul

    def bloklarını atla ve ana programın ilk satırından başla.

  2. 2
    Parametreleri 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. 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 önce g(x) hesaplanır.

  4. 4
    Geri 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.

  5. 5
    Say

    Her fonksiyonun kaç kez çağrıldığını not et; atlanmış bir çağrı en sık yapılan hatadır.

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))
▸ Beklenen çıktı
46
ÇağrıDöndürürf'nin içinde
g(47) = 7 + 411p = 11 · 3 = 33
g(33) = 3 + 36g(n + 5) hâlâ bekliyor
g(52) = 2 + 57q = 6 + 7 = 13
f(47)46return 33 + 13
g üç kez, f bir kez çağrılır; n + 5 = 52, fonksiyona gönderilmeden önce hesaplanı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)
▸ Beklenen çıktı
40
DİM tarzı soru (kapalı)

Yukarıdaki programın sonucunu belirleyin.
A) 36 B) 40 C) 22 D) 34 E) 52

Çözümü göster
Ana program: a = 4, 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”.

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)
▸ 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.

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))
▸ Beklenen çıktı
123 321 2 False
450 54 5 False
707 707 0 True
81 18 8 False
DİM tarzı soru (kodlanan cevap)

Programın yazdırdığı sayıyı belirleyin.
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))

Çözümü göster
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.
DİM tarzı soru (kapalı)

Klavyeden −20 girilirse programın sonucunu belirleyin.
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

Çözümü göster
k = |−20| = 20, g(20) = 3 · 20 − 4 = 56; bu değer döngü boyunca değişmez.
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.
FonksiyonNe döndürürÖrnek
abs(x)mutlak değerabs(-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 çevirirlen(str(305)) → 3
int(x)diziyi sayıya çevirir; ondalık kısmı atarint('42') → 42, int(7.9) → 7
list(s)diziden karakterler listesi yaparlist('abc') → ['a', 'b', 'c']
sum(a)listenin elemanlarının toplamısum([2, 5, 1]) → 8
Alıştırma

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.

Alıştırma · Python
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
Alıştırma

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.

Alıştırma · Python
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 def ile tanımlanır ve yalnızca çağrıldığında çalışır; sonucu return döndürür, yoksa None gelir.
  • 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, sonra f(i) değerlerini bir tabloyla izle.

Kendini test et

12 soru. Her doğru cevap XP kazandırır.

1 / 12
Hangi anahtar sözcük fonksiyonun sonucunu çağrıldığı yere geri gönderir?