Fonksiyon içinden modül düzeyindeki değişkene atama artık 'kuresel ad' bildirimi istiyor (KabaLang KARAR D10). Eski 'aynı adları kullanma' notu yerine okuma/yazma kuralı, kuresel örneği ve parametre + don seçeneği.
226 lines
4.6 KiB
Markdown
226 lines
4.6 KiB
Markdown
---
|
|
baslik: Fonksiyon tanımlama
|
|
bolum: Fonksiyonlar
|
|
ozet: Bir işi adlandırıp istediğin kadar çağırmak
|
|
---
|
|
|
|
Aynı kodu programın üç yerinde yazıyorsan, bir yerde hata yaptığında üç yerde düzeltmen gerekir. Fonksiyon, bir işi yapan ve bir adı olan kod bloğudur: bir kez yazarsın, istediğin kadar çağırırsın.
|
|
|
|
## İlk fonksiyonun
|
|
|
|
Tanım `fonksiyon ad():` ile başlar; gövdesi girintilidir. Fonksiyon tanımlandığında çalışmaz, **çağrıldığında** çalışır.
|
|
|
|
```kbl
|
|
fonksiyon ayrac():
|
|
yazdir("─".tekrarla(20))
|
|
|
|
ayrac()
|
|
yazdir("Günün menüsü")
|
|
ayrac()
|
|
```
|
|
```cikti
|
|
────────────────────
|
|
Günün menüsü
|
|
────────────────────
|
|
```
|
|
|
|
## Parametre almak
|
|
|
|
Parantez içine yazdığın ad bir **parametredir**. Çağırırken verdiğin değer onun yerine geçer.
|
|
|
|
```kbl
|
|
fonksiyon selamla(ad):
|
|
yazdir(f"Merhaba {ad}, hoş geldin.")
|
|
|
|
selamla("Zeynep")
|
|
selamla("Mehmet")
|
|
```
|
|
```cikti
|
|
Merhaba Zeynep, hoş geldin.
|
|
Merhaba Mehmet, hoş geldin.
|
|
```
|
|
|
|
Birden çok parametre virgülle ayrılır; değerler aynı sırayla verilir.
|
|
|
|
```kbl
|
|
fonksiyon fis_satiri(urun, adet, fiyat):
|
|
yazdir(f"{urun:<10}{adet:>3} x {fiyat:>6.2f}")
|
|
|
|
fis_satiri("Ekmek", 2, 12.5)
|
|
fis_satiri("Peynir", 1, 149.0)
|
|
```
|
|
```cikti
|
|
Ekmek 2 x 12.50
|
|
Peynir 1 x 149.00
|
|
```
|
|
|
|
## Değer döndürmek: don
|
|
|
|
`don` sonucu çağıran yere geri verir. Dönen değeri bir değişkene atayabilir ya da doğrudan kullanabilirsin.
|
|
|
|
```kbl
|
|
fonksiyon kare(x):
|
|
don x * x
|
|
|
|
alan = kare(7)
|
|
yazdir(alan)
|
|
yazdir(kare(3) + kare(4))
|
|
```
|
|
```cikti
|
|
49
|
|
25
|
|
```
|
|
|
|
`don` fonksiyonu orada bitirir; altındaki satırlar çalışmaz. Cevap belli olduğu anda çıkmak kodu sadeleştirir.
|
|
|
|
```kbl
|
|
fonksiyon not_harfi(puan):
|
|
eger puan >= 85:
|
|
don "AA"
|
|
eger puan >= 70:
|
|
don "BA"
|
|
eger puan >= 50:
|
|
don "CC"
|
|
don "FF"
|
|
|
|
yazdir(not_harfi(92))
|
|
yazdir(not_harfi(74))
|
|
yazdir(not_harfi(31))
|
|
```
|
|
```cikti
|
|
AA
|
|
BA
|
|
FF
|
|
```
|
|
|
|
## Fonksiyon fonksiyonu çağırabilir
|
|
|
|
```kbl
|
|
fonksiyon cift_mi(n):
|
|
don n % 2 == 0
|
|
|
|
fonksiyon ciftleri_yaz(son):
|
|
dongu i icinde 1..son:
|
|
eger cift_mi(i):
|
|
konsol.yaz(f"{i} ")
|
|
yazdir()
|
|
|
|
ciftleri_yaz(12)
|
|
```
|
|
```cikti
|
|
2 4 6 8 10 12
|
|
```
|
|
|
|
## Dışarıdaki değişkenler: okumak serbest, değiştirmek bildirim ister
|
|
|
|
Fonksiyon, kendisinden önce dosyada tanımlanmış bir değişkeni **okuyabilir**:
|
|
|
|
```kbl
|
|
kdv_orani = 20
|
|
|
|
fonksiyon kdv(fiyat):
|
|
don fiyat * kdv_orani // 100
|
|
|
|
yazdir(kdv(450))
|
|
```
|
|
```cikti
|
|
90
|
|
```
|
|
|
|
Ama fonksiyonun içinde ona yeni bir değer **atamak** derleme hatasıdır:
|
|
|
|
```kbl goster
|
|
sayac = 0
|
|
|
|
fonksiyon arttir():
|
|
sayac = sayac + 1 # hata: 'sayac' fonksiyonun dışında tanımlı
|
|
```
|
|
|
|
Neden? Bir fonksiyonun dışarıdaki bir değeri sessizce değiştirmesi, programın bambaşka bir yerinde "bu değer neden değişti?" sorusunu doğurur. Gerçekten değiştirmek istiyorsan fonksiyonun **ilk satırına** `kuresel` yazarak bunu açıkça söylersin:
|
|
|
|
```kbl
|
|
sayac = 0
|
|
|
|
fonksiyon arttir():
|
|
kuresel sayac
|
|
sayac = sayac + 1
|
|
|
|
arttir()
|
|
arttir()
|
|
yazdir(sayac)
|
|
```
|
|
```cikti
|
|
2
|
|
```
|
|
|
|
Birden çok değişken için adları virgülle ayır: `kuresel toplam, adet`. Çoğu zaman daha temiz yol ise değeri parametre olarak alıp `don` ile geri vermektir; böylece neyin değiştiği çağrının olduğu satırda görünür:
|
|
|
|
```kbl
|
|
fonksiyon arttir(n):
|
|
don n + 1
|
|
|
|
sayac = 0
|
|
sayac = arttir(sayac)
|
|
sayac = arttir(sayac)
|
|
yazdir(sayac)
|
|
```
|
|
```cikti
|
|
2
|
|
```
|
|
|
|
> **İpucu:** Fonksiyonlarını dosyanın başına yaz, programın asıl işini altlarına koy; fonksiyonun içinde de kendine özgü adlar seç.
|
|
|
|
## Gerçek bir örnek
|
|
|
|
```kbl
|
|
fonksiyon kdvli(fiyat):
|
|
don fiyat * 1.20
|
|
|
|
fonksiyon fiyat_yaz(urun, fiyat):
|
|
yazdir(f"{urun}: {fiyat:.2f} TL (KDV dahil {kdvli(fiyat):.2f} TL)")
|
|
|
|
fiyat_yaz("Kulaklık", 850.0)
|
|
fiyat_yaz("Kılıf", 120.0)
|
|
```
|
|
```cikti
|
|
Kulaklık: 850.00 TL (KDV dahil 1020.00 TL)
|
|
Kılıf: 120.00 TL (KDV dahil 144.00 TL)
|
|
```
|
|
|
|
## Alıştırma
|
|
|
|
```alistirma
|
|
`cevre(en, boy)` adında, bir dikdörtgenin çevresini döndüren bir fonksiyon yaz. Sonra `cevre(5, 3)` ve `cevre(10, 10)` sonuçlarını ayrı satırlarda yazdır.
|
|
%%%
|
|
# buraya yaz
|
|
|
|
yazdir(cevre(5, 3))
|
|
yazdir(cevre(10, 10))
|
|
%%%
|
|
fonksiyon cevre(en, boy):
|
|
don 2 * (en + boy)
|
|
|
|
yazdir(cevre(5, 3))
|
|
yazdir(cevre(10, 10))
|
|
%%%
|
|
16
|
|
40
|
|
```
|
|
|
|
```alistirma
|
|
`buyuk_olan(a, b)` adında, iki sayıdan büyük olanı döndüren bir fonksiyon yaz. Sonra onu kullanarak üç sayının en büyüğünü bulup yazdır.
|
|
%%%
|
|
# buraya yaz
|
|
|
|
yazdir(buyuk_olan(buyuk_olan(14, 27), 9))
|
|
%%%
|
|
fonksiyon buyuk_olan(a, b):
|
|
eger a > b:
|
|
don a
|
|
don b
|
|
|
|
yazdir(buyuk_olan(buyuk_olan(14, 27), 9))
|
|
%%%
|
|
27
|
|
```
|