# # Python Fonksiyonlar

Fonksiyonlar, sadece çağrıldıklarında çalışan kod bloklarıdır. Bir fonksiyon ile tanımladığınız belirli komutlarınız, yeri geldiğinde çağrılarak, parametreler gönderilerek kullanılır ve istenilirse size bir değer döndürür.

## 1. Fonksiyon Oluşturmak ve Çağırmak

Python programlama dilinde bir program oluşturabilmek için **def** terimini kullanırız ve ardından fonksiyon ismini yazarız.

```python
def ornekFonksiyon(): 
    print("Merhaba Dünya!")
```

Oluşturduğumuz bir fonksiyonu programımızın istediğimiz yerinde çağırabiliriz. Bunun için sadece fonksiyon ismini belirtmemiz yeterlidir.

```python
ornekFonksiyon()
```

## 2. Fonksiyon Parametreleri

Oluşturduğumuz fonksiyona parametre göndererek işleme sokmak istiyorsak, fonksiyonumuzu oluştururken parantezlerin arasında bu parametreleri belirtmeli ve fonksiyonu çağırırken ilgili parametre değerleri ile çağırmalıyız.

```python
def selamVer(isim,yas): 
    print("Merhaba, {} {} yaşındadır".format(isim,yas))

selamVer("Yunus",24)

# Merhaba, Yunus 24 yaşındadır
```

Örnekte gördüğünüz gibi fonksiyona iki adet parametre alacağını söyledik ve fonksiyonu çağırırken bu iki parametrenin de değerini gönderdik. Fonksiyon da gelen bu parametreleri ilgili yerlere otomatik olarak yerleştirdi. Bir örnek daha yapalım.

```python
def usAlma(x): 
    print(x**2)

usAlma(7) # 49
```

{% hint style="info" %}
Fonksiyonlarınız da istediğiniz kadar parametre kullanabilirsiniz fakat ilgili fonksiyonu çağırırken tüm parametrelere değer atadığınızdan emin olmalısınız.
{% endhint %}

```python
def toplama(x,y): 
    print(x+y)
    
toplama(25) # !! HATA VERİR (eksik parametre değeri) !!
```

## 3. Öntanımlı Parametre İle Fonksiyon Oluşturmak

Fonksiyonlarımızı oluştururken alacağı parametrelerin değerlerini öntanımlı olarak belirleyebiliriz. Bu sayede kullanıcı eğer parametrenin değerini göndermezse biz bu parametreye bir öntanımlı değer atayabiliriz.

```python
def dogumYeri(sehir="Bilinmiyor"):
    print("Doğum yeri: " + sehir)

dogumYeri("Ankara")      # Doğum yeri: Ankara
dogumYeri("İstanbul")    # Doğum yeri: İstanbul
dogumYeri()              # Doğum yeri: Bilinmiyor
```

## 4. Belirsiz Sayıda Fonksiyon Parametresi

Yukarıdaki örneklerde gönderilecek parametre adedini belirledik ve fonksiyon çağırırken belirlenen parametre adedince değer gönderdik. Peki yazdığımız fonksiyon onlarca,yüzlerce parametreye ihtiyaç duyduğunda tüm parametreleri tek tek fonksiyon oluştururken belirtecek miyiz? Tabiki de hayır Python programlama dilinde eğer belirsiz sayıda değişken ile fonksiyon oluşturacaksanız **\*** işaretiyle parametre adı belirlemelisiniz. Bu sayede tanımladığınız parametre bir demete dönüşecek ve gönderdiğiniz tüm değerler bu demete eleman olarak eklenecektir.

```python
def meyveler(*meyve):
    print(meyve[0])
    print(meyve[1])

meyveler("elma","muz","çilek","kavun")

# elma
# muz
```

## 5. Fonksiyon Dönüş Değeri Belirleme

Fonksiyonlarımızın çağrıldıkları zaman çalıştıklarını artık öğrendik. Ayrıca bu fonksiyonlar ile ekrana çıktı verebildiğimizi de yukarıdaki örneklerde gördünüz. Şimdi ise oluşturduğumuz fonksiyonlara **return** ile dönüş değeri döndürmesini söyleyeceğiz ve fonksiyonlarımızı çalışması için çağırdığımızda bize bir değer döndürecek.

```python
def carpma(x,y): 
    return x*y
    
sonuc = carpma(7,5)

print(sonuc) # 35
```

Bu basit örneğimizde fonksiyonumuzun çarpma işlemini yaparak bize **return** ile sonucu döndürmesini istedik. Böylece fonksiyon sonucunu bir değere atayarak veya direkt print ile ekrana yazdırarak işlem sonucumuzu öğrenmiş olduk.

```python
def selamVer(): 
    return "Merhaba!"
    
print(selamVer()) # Merhaba!
```

## 6. Boş Fonksiyon Oluşturmak

Herhangi bir sebep yüzünden boş fonksiyon oluşturmak istediğinizde hata almamak için **pass** terimini kullanabilirsiniz.

```python
def dahaSonra(): 
    pass
```

## 7. Yinelemeli Fonksiyonlar

Yinelemeli (recursive) fonksiyonlar kendi kendini çağıran fonksiyonlardır. Bir fonksiyonu yinelemeli hale getirmek için herhangi bir terim kullanmamıza gerek yoktur. Fonksiyonu oluştururken içeride yine aynı fonksiyonu çağırarak yinelemeli hale getirebilirsiniz. Yinelemeli fonksiyonlar birçok alanda kullanılır ve işlem kolaylığı sağlar. Daha çok matematiksel hesaplamalarda tercih edilmesine rağmen kendi işlevlerinizi de yinelemeli olarak yerine getirebilirsiniz.

```python
def faktoriyel(x):

    if x == 1:
        return 1
    else:
        return x * faktoriyel(x-1)

sonuc = faktoriyel(5)

print(sonuc)    # 120
```

Örneğimizde basit bir faktoriyel hesaplama fonksiyonunu yinelemeli bir fonksiyon ile yazdık. Burada 5 sayısının faktoriyelini hesaplarken (5\*4\*3\*2\*1) sonucunu alabilmek için fonksiyonumuzun içinde her seferinde sayının bir küçüğünü tekrardan fonksiyon ile çağırarak çarptık ve en son 1 sayısına geldiğimizde fonksiyonumuzu sonlandırdık. Sizde kendinize yinelemeli fonksiyonlarla yazacağınız örnekler bularak programlama da pratiklik kazanabilirsiniz.
