koddla

Yazılımcıları bilgi ile güçlendirir.

Python101 – Fonksiyon Tanımlama

Fonksiyon Oluşturma

Bu bölüme başlarken neler yapabileceğinize ancak yapmamanız gerektiğine dair bir örnek vereceğim:

a = 23
b = -23

if a < 0:
    a = -a
if b < 0:
    b = -b
if a == b:
    print("a, " sayısının mutlak değeri ve ", b, " birbirine eşit.")
else:
    print("a, " sayısının mutlak değeri ve ", b, " birbirine eşit değil.")

Ve çıktı:

23 sayısının mutlak değeri ve 23 birbirine eşit.

Program biraz tekrara düşüyor gibi görünüyor. Programcılar bir şeyleri tekrarlamaktan nefret eder . (Ayrıca, mutlak değeri bulmanın değişkenin değerini değiştirdiğini unutmayın, bu yüzden çıktıda -23 değil, 23 yazdırıyor.) Neyse ki Python, tekrarlardan kurtulmak için işlevler oluşturmanıza izin verir. Bu örneği yeniden yazalım:

a = 23
b = -23

def mutlak_deger(n):
    if n < 0:
        n = -n
    return n

if mutlak_deger(a) == mutlak_deger(b):
    print("a, " sayısının mutlak değeri ve ", b, " birbirine eşit.")
else:
    print("a, " sayısının mutlak değeri ve ", b, " birbirine eşit değil.")

Çıktı:

-23 sayısının mutlak değeri ve 23 birbirine eşit.

Bu programın temel özelliği def deyimidir. def (definition yani tanım kelimesinin kısaltması) bir işlev tanımı başlatır. def anahtar sözcüğünden sonra işlevin adı yani mutlak_deger yazdık. Daha sonra bir ‘(‘ ve ardından kullanacağımız n parametresi geldi (işlev çağrıldığında programdan işleve n parametresi geçirilir). Sonrasında ise parantezi kapattık. ‘:’ arkasından gelen ifadeler işlev kullanıldığında yürütülür. Girintili ifadeler sona erene veya bir return anahtar kelimesi ile karşılaşılana kadar ifadeler çalışmaya devam eder. return deyimi, işlevin çağrıldığı yere bir değer döndürür. Aslında ilk programımızda bile bir işlevle karşılaşmıştık, print işlevi. Ama artık yeni işlevler yapabiliriz. 

a ve b değerlerinin nasıl değiştirilmediğine dikkat edin. İşlevler, değer döndürmeyen görevleri yinelemek için kullanılabilir. Aşağıda bazı örneklere bakalım:

def hello():
    print("Hello")

def area(width, height):
    return width * height

def print_welcome(name):
    print("Welcome", name)

hello()
hello()

print_welcome("Fred")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))

Çıktı:

Hello
Hello
Welcome Fred
width = 4  height = 5  area = 20

Bu örnek, işlevlerle yapabileceğiniz birkaç şeyi daha gösteriyor. Hiç bir bağımsız değişken kullanmayabilirsiniz yada iki veya daha fazla kullanabilirsiniz. Ayrıca, bir işlevin bir değeri geri göndermesi gerekmediğine de dikkat edin.

İşlevlerdeki değişkenler

Yinelenen kodu ortadan kaldırırken oluşturduğumuz fonksiyonlarda genellikle değişkenlerimiz olur. Python’da bunlar özel bir şekilde ele alınır. Şimdiye kadar gördüğümüz tüm değişkenler küresel değişkenlerdir. İşlevler, yerel değişkenler adı verilen özel bir değişken türüne sahiptirler. Bu değişkenler yalnızca işlev çalışırken var olurlar. Yerel değişken başka bir değişkenle (genel değişken gibi) aynı ada sahip olduğunda, yerel değişken diğerini gizler. Kafa karıştırıcı mı? Peki, bu sonraki örnekler (biraz karışık) bunu biraz açıklığa kavuşturma da yardımcı olacaktır.

a = 4
 
def print_func():
    a = 17
    print("print_func içindeki a =", a)

print_func()
print("a = ", a)

Çalıştırıldığında alacağımız çıktı:

print_func içindeki a = 17
a = 4

Bir işlev içindeki değişken atamaları genel değişkenleri geçersiz kılmaz, yalnızca işlevin içinde var olurlar. İşlevin içine a’ya yeni bir değer atanmış olsa da, bu yeni atanan değer yalnızca işlev çalışırken var olur. İşlev tamamladığında ve a’nın değerleri yeniden yazdırıldığında, başlangıçta atanan değerleri görürüz. 

Daha karmaşık bir örneğe bakalım:

a_var = 10
b_var = 15
e_var = 25

def a_func(a_var):
    print("a_func içindeki a_var =", a_var)
    b_var = 100 + a_var
    d_var = 2 * a_var
    print("a_func içindeki b_var =", b_var)
    print("a_func içindeki d_var =", d_var)
    print("a_func içindeki e_var =", e_var)
    return b_var + 10

c_var = a_func(b_var)

print("a_var =", a_var)
print("b_var =", b_var)
print("c_var =", c_var)
print("d_var =", d_var)

çıktı:

a_func içindeki a_var =  15
a_func içindeki b_var =  115
a_func içindeki d_var =  30
a_func içindeki e_var =  25
a_var =  10
b_var =  15
c_var =  125
d_var = 

Traceback (most recent call last):
 File "C:\def2.py", line 19, in <module>
   print("d_var = ", d_var)
NameError: name 'd_var' is not defined

Bu örnekte, değişkenler a_var, b_var ve d_var işlevin içinde olduklarında tümü yerel değişkenlerdir. return b_var + 10 ifadesi çalıştırıldıktan sonra ise hepsi yok olur. a_var değişkeni ise bir parametre adı olduğundan otomatik olarak yerel bir değişkendir. b_var ve d_var değişkenleri yerel değişkenlerdir, çünkü işlevde eşittir işaretinin solunda görünürler.

İşlevin içinde a_var değişkenine atanmış bir değer yok. Fonksyion c_var = a_func(b_var) ile çağrıldığında ise, a_var‘a 15 ifadesi atanır, çünkü çağrılma anında b_var 15’e eşittir.

Gördüğünüz gibi, işlev çalışmayı tamamladıktan sonra, genel değişkenlerle aynı adda olan yerel değişkenler artık kayboluyorlar. Böylece print("a_var = ", a_var) deyimi çalıştırıldığında ekrana 15 yerine a_var = 10 deyimi yazdırılıyor. Çünkü lokal değişken artık kayboldu.

Dikkat edeceğimiz diğer bir şey de en sonda ekrana yazdırılan NameError. Bu hatayı d_var değişkeni artık var olmadığı için alıyoruz. İşlev tamamlandığından d_var yok olmuştu. İşlevden çıktığımızda tüm yerel değişkenler silinir. Bir işlevden değişkene ait bir değer almak istiyorsak return deyimini kullanmamız gerekiyor.

Farkedeceğiniz son bir şey ise e_var değişkeninin hiç bir değişikliğe uğramamasıdır. e_var bir parametre olmadığı ve işlevin içinde eşittir işaretinin solunda hiçbir zaman görünmediği için değeri sabit kaldı. Bir işlev içinde genel bir değişkene erişildiğinde, elde edilen değer dışarıdan gelen değerdir.

İşlevler yalnızca işlevin içinde bulunan yerel değişkenlere izin verir ve işlevin dışındaki diğer değişkenleri gizleyebilir.

Örnekler

temperature2.py

#! /usr/bin/python
#-*-coding: utf-8 -*-
# Fahrenheit'ı Celsius'a dönüştürür
 
def secenekleri_bastir():
    print("Seçenekler:")
    print(" 'p' seçenekler menüsünü bastırır")
    print(" 'c' Celsius'dan çevirir")
    print(" 'f' Fahrenheit'tan çevirir")
    print(" 'q' programdan çıkar")
 
def celsius_to_fahrenheit(c_temp):
    return 9.0 / 5.0 * c_temp + 32
 
def fahrenheit_to_celsius(f_temp):
    return (f_temp - 32.0) * 5.0 / 9.0
 
secim = "p"
while secim != "q":
    if secim == "c":
        c_temp = float(input("Celsius derecesi: "))
        print("Fahrenheit:", celsius_to_fahrenheit(c_temp))
        secim = input("Seçenek: ")
    elif secim == "f":
        f_temp = float(input("Fahrenheit derecesi: "))
        print("Celsius:", fahrenheit_to_celsius(f_temp))
        secim = input("Seçenek: ")
    else:
        secim = "p"    
        secenekleri_bastir()
        secim = input("Seçenek: ")

Örnek Çalıştırma:

Seçenekler:
 'p' seçenekler menüsünü bastırır
 'c' Celsius'dan çevirir
 'f' Fahrenheit'tan çevirir
 'q' programdan çıkar
Seçenek: c
Celsius derecesi: 30 
Fahrenheit: 86.0
Seçenek: f
Fahrenheit derecesi: 60
Celsius: 15.5555555556
Seçenek: q

area2.py

#! /usr/bin/python
#-*-coding: utf-8 -*-
# bir dikdörtgenin alanını hesaplar

def selam():
    print('Selam!')
 
def alan(en, yukseklik):
    return en * yukseklik
 
def hosgeldiniz_yazdir(isim):
    print('Hoşgeldin, ', isim)
 
def pozitif_deger(yazi):
    sayi = float(input(yazi))
    while sayi <= 0:
        print('Pozitif bir sayı girmeniz gerekir.')
        sayi = float(input(yazi))
    return sayi
 
isim = input('Adınız: ')
selam()
hosgeldiniz_yazdir(isim)
print()
print('Bir dikdörtgenin alanını bulmak için,')
print('en ve yukseklik bilgisi girin.')
print()
w = pozitif_deger('En: ')
h = pozitif_deger('yukseklik: ')
 
print('En =', w, ' Yükseklik =', h, '  Alan =', alan(w, h))

Örnek Çalıştırma:

Adınız: Josh
Selam!
Hoşgeldin, Josh

Bir dikdörtgenin alanını bulmak için,
en ve yukseklik bilgisi girin.

En: -4
Pozitif bir sayı girmeniz gerekir.
En: 4
Yükseklik: 3
En = 4  Yükseklik = 3  Alan = 12

Alıştırmalar

Bir karenin alanını, dikdörtgenin alanını ve dairenin alanını (3.14 * radius**2) ayrı ayrı hesaplayacak fonksiyonlara sahip bir program yazın. Bunun için yukarıdaki örneklerden area2.py programını yeniden yazın. Bu program bir menü arabirimi içermelidir. 

Çözüm:

def square(L):
    return L * L

def rectangle(width , height):
    return width * height

def circle(radius):
    return 3.14159 * radius ** 2

def options():
    print()
    print("Options:")
    print("s = calculate the area of a square.")
    print("c = calculate the area of a circle.")
    print("r = calculate the area of a rectangle.")
    print("q = quit")
    print()

print("This program will calculate the area of a square, circle or rectangle.")
choice = "x"
options()
while choice != "q":
    choice = input("Please enter your choice: ")
    if choice == "s":
        L = float(input("Length of square side: "))
        print("The area of this square is", square(L))
        options()
    elif choice == "c":
        radius = float(input("Radius of the circle: "))
        print("The area of the circle is", circle(radius))
        options()
    elif choice == "r":
        width = float(input("Width of the rectangle: "))
        height = float(input("Height of the rectangle: "))
        print("The area of the rectangle is", rectangle(width, height))
        options()
    elif choice == "q":
        print(" ",end="")
    else:
        print("Unrecognized option.")
        options()

Bir cevap yazın

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

Back to top