Python’da İlk Adımlar – 3

Geldik serinin son yazısına. Bu dersin konusu fonksiyonlar olacak.

Fonksiyon denilen yapı belli bir görevi üstlenir ve bu görev ile bizi aynı kodu tekrar tekrar yazmaktan kurtarır. Mesela, Python’daki print() built-in denilen gömülü bir fonksiyondur. Yani, daha önce yazılan bir fonksiyondur.

type(print)

builtin_function_or_method

Biz bunların dışında user-defined denilen kendi tanımladığımız fonksiyonlar da yazabiliriz. Bu tanımlamayı def anahtar sözcüğü ile yapacağız. Örneğin, rendele adında bir fonksiyon oluşturalım.

def rendele():
    print("Meyve rendelendi.")

type(rendele)

function

def anahtar sözcüğünden sonra fonksiyonun ismini yazdık ve () içini boş bıraktık. Parantez içi opsiyoneldir. Yani, parametre veya parametreler alabilir de almayabilir de.

def rendele(meyvesebze):
    print("{} rendelendi.".format(meyvesebze))

rendele(meyvesebze = "Havuç")

Havuç rendelendi.

Gördüğünüz gibi fonksiyona meyvesebze adında bir parametre ekledik. Bu parametrenin ne olacağını yazdık ve fonksiyon ona göre bir çıktı üretti.

Şimdi fonksiyona eklemediğimiz ve değer döndürmemizi sağlayan return ifadesine bakalım. Bunu bir örnek ile anlamaya çalışalım.

def topla(sayi1,sayi2,sayi3):
    print("Toplam:",sayi1+sayi2+sayi3)

topla(3,4,5)

Toplam: 12
def karesi(sayi):
    print("Karesi:",sayi**2)

karesi(12)

Karesi: 144

Şimdi topla fonksiyonunun sonucunu bir değişkene atayalım. Ardından bu değişkeni karesi fonksiyonunun içine koyarak sayının karesini almasını sağlayalım.

toplam = topla(3,4,5)
karesi(toplam)

Toplam: 12
TypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'int'

Gördüğünüz gibi toplamı yazdırdı ama karesini almadı. Çünkü biz herhangi bir değer döndürmedik ya da depolamadık. Kontrol edebiliriz.

type(toplam)

NoneType

Bunu yapmak için return’den yardım alacağız.

def topla(sayi1,sayi2,sayi3):
    return sayi1+sayi2+sayi3
    
def karesi(sayi):
    return sayi**2
    
toplam = topla(3,4,5)
karesi(toplam)

144

İşte, return bu şekilde fayda sağlamaktadır. rendele fonksiyonundaki örnek üzerinden gidersek, makinenin rendelenmiş havucu vermediğini düşünün (return yok). Bunu alıp salatada kullanamıyoruz.

Bu arada, toplam gibi bir değişken yaratmak yerine fonksiyonları iç içe de yazabiliriz.

karesi(topla(3,4,5))

144

rendele fonksiyonunu boş bir şekilde çalıştırabilir miyiz?

rendele()

TypeError: rendele() missing 1 required positional argument: 'meyvesebze'

rendele fonksiyonu 1 tane zorunlu parametre istediği için boş bir şekilde çalıştırılamıyor. Bunu aşmanın ya da boş çalıştırabilmenin bir yolu parametreye default bir değer girmektir.

def rendele(meyvesebze = "Boş"):
    print("{} rendelendi.".format(meyvesebze))

rendele()

Boş rendelendi.

Eğer başka bir parametre değeri girilecekse fonksiyon onu dikkate alacaktır.

rendele("Elma")

Elma rendelendi.

Peki, topla fonksiyonuna istediğimiz kadar değer girebilir miyiz?

topla(10,11,12,13)

TypeError: topla() takes 3 positional arguments but 4 were given

Görüldüğü üzere fonksiyon 3 tane değer alırken biz 4 girmeye çalıştık ve hata aldık. Bundan kurtulmanın bir yolu başına * koymaktır.

def topla(*sayi):
    print(sayi)

topla(10,11,12,13)

(10, 11, 12, 13)

Girdiğimiz değerleri bize demet şeklinde verdi. Artık bunları for döngüsünü fonksiyonun içine yazarak toplayabiliriz.

def topla(*sayi):
    toplam = 0
    for i in sayi:
        toplam += i
    print("Toplam:",toplam)

topla(10,11,12,13)

Toplam: 46

Eğer değişkenleri fonksiyonun içinde tanımlarsak bunları lokal; fonksiyonun dışında tanımlarsak da bunları global değişken olarak tanımlayacağız.

def yazdir():
    x = "lokal"
    print(x)

yazdir()
print(x)

lokal
NameError: name 'x' is not defined

Fonksiyon çalıştı ve içine yazdığımız x değişkenini yazdırdı. Fakat sonrasında x’in tanımlı olmadığına dair hata aldık. Çünkü x burada lokalde tanımlanmış bir değişkendir. Eğer x’i yazdırmak istiyorsak onu globalde tanımlamalıyız.

x = "global"
def yazdir():
    print(x)

yazdir()
print(x)

global
global

x’i globalde tanımladığımız için istediğimiz gibi yazdırabildik.

Eğer hem globalde hem de lokalde aynı değişken ismi ile tanımlama yapsaydık bu durumda program fonksiyon çalışırken lokaldeki değişkeni; değişkeni yazdırdığımızda globaldeki değişkeni tanıyacaktı.

y = "global"
def yazdir():
    y = "lokal"
    print(y)

yazdir()
print(y)

lokal
global

Python’da fonksiyon tanımlamanın diğer bir yolu lambda ifadeleridir. Faydası tek bir satırda fonksiyonu tanımlayabilmemizdir. Örnek olarak daha önce yazdığımız karesi fonksiyonunu ele alalım. Önce nasıl yazdığımızı hatırlayalım.

def karesi(sayi):
    return sayi**2

karesi(9)

81

Lambda ifadeleri ile aşağıdaki gibi tek bir satırda yazabiliriz.

karesi = lambda sayi : sayi**2

karesi(9)

81

lambda ifadesini yazıyoruz, parametre/leri giriyoruz, iki nokta üst üste koyduktan sonra komutu giriyoruz. Tüm bunları eşitlediğimiz soldaki isim de fonksiyonumuz oluyor.

Dersi bir uygulama ile bitirelim. Palindromu duydunuz mu hiç? Tersten okuduğumuzda da aynı olan sayılar, sözcükler, cümleler palindromdur. Gelin, girilen sayı, sözcük ya da cümlenin palindrom olup olmadığının bilgisini veren bir fonksiyon yazalım.

def palindrom(x):
    duz = x.lower()
    duz = duz.replace(" ","")
    ters = duz[::-1]
    if duz == ters:
        print("{}, palindromdur.".format(duz))
    else:
        print("{}, palindrom değildir.".format(duz))

x adında bir parametre girdik. Bu, kullanıcıdan alınacak olan bilgidir. Aldığımız bilgiyi (x) duz adında bir değişkene, eğer sözcük ya da cümle içeriyorsa tüm harflerini küçük yapması için lower() fonksiyonunu kullanarak atadık. Ardından eğer duz değişkeninde herhangi bir boşluk varsa bunu replace() fonksiyonu ile kaldırdık. Sonrasında ters değişkenine duz değişkenindeki değeri ters çevirip atadık. Önceki derslerde gördüğümüz [::] yapısını kullandık. Eğer [::-1] yaparsak bu tam tersini verecektir. Son olarak koşul durumlarına geçtik. Eğer duz değişkeni ters değişkenine eşit (==) ise polindromdur; değil (!=) ise polindrom değildir.

palindrom("1010")
palindrom("101")
palindrom("Neden")
palindrom("Aç raporunu koy okunur o parça")
palindrom("No lemon no melon")

1010, palindrom değildir.
101, palindromdur.
neden, palindromdur.
açraporunukoyokunuroparça, palindromdur.
nolemonnomelon, palindromdur.

Serinin üçüncü ve son yazısı ile beraberdik. Umuyorum Python’a başlayanlar için faydalı bir seri olmuştur.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir