Arcade Türü Oyun Programlamayı ve Bilgisayar Bilimleri Öğrenin

Arcade Türü Oyun Programlamayı
ve Bilgisayar Bilimleri Öğrenin

Chapter 9: Fonksiyonlar

9.1 Fonksiyonlara Giriş

Video: Neden Fonksiyonlar Kullanılır?

Fonksiyonlar bilgisayar dillerinde iki ana amaç için kullanılır. İlki, kodun okunmasını ve anlaşılmasını kolaylaştırırlar. İkincisi, kodun bir defadan daha fazla kez kullanılmasına izin verirler.

Oyuncak arabayı kontrol edecek bir takım kodun olduğunu düşünün. Gerçekte, tam olarak bu tip bir oyuncak eser sahibinin 1979'da programlamaya giriş eserindeydi:
http://en.wikipedia.org/wiki/Big_Trak

Programcının arabayı ileri hareket ettirmeyi dilediğini varsayalım. Bunu yapabilmek için, programcı alttaki komutları çalıştırabilir:

turnOnMotor()
pauseOneSecond()
turnOffMotor()

Bu kodun anlaşılması o kadar da kolay değildir. Bir fonksiyon tanımlayarak, programın okunabilirliği artırılabilir ve kod birçok kez yeniden kullanılabilir.

def moveForward():
	turnOnMotor()
	pauseOneSecond()
	turnOffMotor()

Bu kod kendi başına hiçbir şey yapmıyor. Bunu çalıştırmak arabanın ilerlemesine sebep olmayacak. Kodun yaptığı, bilgisayara bunu nasıl yapacağını söylemek. Yani hareket fonksiyonunu tanımladıktan sonra, programın tek ihtiyaç duyduğu şey alttakini yaparak arabanın gitmesini sağlamak:

moveForward()

Arabanın ne yapacağını belirleyen fonksiyonlardan komple bir kütüphane yapıldığında, son program şuna benzer bir şey olacaktır:

moveForward()
turnLeft()
moveForward()
moveForward()
turnRight()
moveForward()

Fonksiyonlar ayrıca parametreler alabilirlre. Bunlar bir fonksiyonun ona esnekliğini artırmak için fonksiyonun yaptığı işi ona aktarılan parametrelere bağlı olarak değiştirerek kullanılabilir. Örneğin, jump() isimli bir fonksiyon robotun atlamasıne sebep olabilir. Fakat fonksiyona robotun ne kadar yükseliğe sıçraması gerektiği bir parametreyle aktarılırsa fonksiyon değiştirilebilir. Mesela jump(3) 3 inç atlamayı ve jump(6) altı inç atlamayı sağlayabilir.

Fonksiyonu robot için ayarlamak şuna benzer:

def moveForward(time):
	turnOnMotor()
	for i in range(time):
		pauseOneSecond()
	turnOffMotor()

Robot araba olmadan çalışabilen bir fonksiyon örneği şu şekilde olabilir:

def volumeSphere(radius):
    pi=3.141592653589
    volume=4*pi*radius**2
    print("Kürenin hacmi",volume)

Video: Fonksiyon Oluşturmak

Yukarıdaki fonksiyonda, programcı volumeSphere (Kürenin hacmi) adlı fonksiyonu çağırıyor. Fonksiyona giden veri radius (yarıçap) adı verilen yeni bir değişkende saklanıyor. Hacmin sonucu ekrana yazdırılıyor. Bu fonksiyonu çağırmak için, şununla takip edin:

volumeSphere(22)

Çoklu parametreler de aktarılabilir, virgülle ayrılırlar:

def volumeCylinder(radius,height):
    pi=3.141592653589
    volume=2*pi*radius*(radius+height)
    print("The volume is",volume)

Bu fonksiyon şu şekilde çağırılabilir:

volumeCylinder(12,3)

Ne olursa olsun, bu fonksiyonlar kısıtlı kullanıma sahiptir. Bir kişi altılı-paket içerisinde kullanmak isterse, çalışmayacaktır. Bu program sadece hacmi ekrana yazdırır. Sonucu bir eşitlikte kullanmak ve altıyla çarpmak mümkün değildir.

Bu return ifadesi kullanılarak çözülebilir. Mesela:

def volumeCylinder(radius,height):
    pi=3.141592653589
    volume=2*pi*radius*(radius+height)
    return volume

Bu daha sonraki bir kodun içerisinde şu şekilde kullanılabilir:

sixPackVolume = volumeCylinder(2.5,5) * 6

Ekrana yazdıran(prints) ve döndüren(returns) fonksiyonlar arasında büyük bir farklılık vardır. Alttaki koda bakın ve onu deneyin.

# Sonucu ekrana yazdıran fonksiyon
def sum1(a,b):
    result = a+b
    print (result)

# Sonucu döndüren fonksiyon
def sum2(a,b):
    result = a+b
    return (result)

# Bu, 4+4 toplamını ekrana yazdırır
sum1(4,4)

# Bu yazdırmaz
sum2(4,4)

# Bu x1'i toplama eşitlemez
x1 = sum1(4,4)

# Bu eşitler
x2 = sum2(4,4)

9.2 Değişken Kapsamı

Video: Değişken Kapsamı

Fonksiyonların kullanılması bizi kapsam fikriyle tanıştırıyor. Kapsam, değişkenin bir kodta "canlı" ve erişilebilir olduğu yerler denir. Mesela, alttaki koda bakın:

# x'e 22'yi atamaya yarayan basit
# bir fonksiyon tanımla
def f():
    x=22

# Fonksiyonu çağır
f()
# Bu çalışmaz, x sadece f()'in içinde mevcuttur
print (x)

x sadece f() fonksiyonunun içerisinde var olduğu için son satır bir hata üretecektir. f() çağırıldığında değişken oluşturulur ve f() biter bitmez onu kullanan hafıza boşaltılır.

Daha fazla kafa karıştıran bir kural ise f() fonksiyonunun dışında oluşturulan değişkenlere erişimdir. Alttaki kodta, x değişkeni f() fonksiyonundan önce oluşturulmuştur ve bu sebeple f() fonksiyonunun içerisinden okunabilir.

# x değişkenini oluştur ve 44 değerini ata
x=44

# x'i ekrana yazdıran basit bir fonksiyon tanımla
def f():
    print(x)

# Fonksiyonu çağır
f()

Fonksiyondan sonra oluşturulan değişkenler fonksiyonun içerisinden sadece fonksiyon değişkenin değerini değiştirmiyorsa okunabilir. Bu kod, üstteki koda çok benzerdir, çalışmayacaktır. Bilgisayar x'in ne olduğunu bilmediğini iddia edecektir.

# x değişkenini oluştur ve 44 değerini ata
x=44

# x'i ekrana yazdıran basit bir fonksiyon tanımla
def f():
    x += 1
    print(x)

# Fonksiyonu çağır
f()

Diğer diller değişkenlerin oluşturulması konusunda daha karışık kurallara ve kapsama sahiptir. Python dolambaçsız olduğu için iyi bir başlangıç dilidir.

9.3 Kopyasını-aktar

Fonksiyonlar değerlerini orijinal değerin kopyasını oluşturarak aktarırlar. Mesela:

# x'i yazdıran basit bir fonksiyon tanımla
def f(x):
    x += 1
    print(x)

# y'yi ata
y=10
# Fonksiyonu çağır
f(y)
# y'yi ekrana yazdır ve değişip değişmediğini gör
print(y)

y'nin değeri f() fonksiyonu ona aktarılan değeri artırsa da değişmez. Fonksiyonda parametre olaran listelenen değişkenlerin her biri yepyeni birer değişkendir. Değişkenin değeri çağırıldığı yerden kopyalanır.

Bu önceki örnekte apaçık mantıklıydı. Eğer kod fonksiyon çağırıyorsa ve çağırdığı fonksiyon aynı isimde değişken kullanıyorsa bu, bu olayın kafa karıştırmaya başladığı yerdir. Alttaki kod önceki kodla eşdeğerdir, fakat y yerine x kullanılmıştır.

# x'i yazdıran basit bir fonksiyon tanımla
def f(x):
    x += 1
    print(x)

# x'e değerini ata
x=10
# Foksiyonu çağır
f()
# x'i ekrana bastırıp değişip değişmediğine bak
print(x)

Çıktı y'yi kullanan programla aynıdır. Fonksiyon ve onu çevreleyen kodun her ikisi de x değişken ismini kullanıyor olsa bile, burada aslında iki farklı değişken mevcuttur. x adlı bir değişken foksiyonun iç kısmında, ve başka bir x de fonksiyonun dışında vardır.

9.4 Fonksiyon Çağıran Fonksiyonlar

It is entirely possible for a function to call another function. For example, say the functions like the following were defined: Bir fonksiyon için başka bir foksiyonu çağırmak tamamen mümkündür. Örneğin, alttaki gibi fonksiyonların tanımlı olduğunu söylersek:

def armOut(whichArm, palmUpOrDown):
	# kod buraya gelecek
def handGrab(what):
	# kod buraya gelir

Ve ardından başka bir fonksiyon diğer fonksiyonları çağıracak şekilde oluşturulabilir:

def macarena():
	armOut("right","down")
	armOut("left","down")
	armOut("right","up")
	armOut("left","up")
	handGrab("right","left arm")
	handGrab("left","right arm")
	# vs.

9.5 Tekrar

Click here for a multiple-choice review quiz.

Bu tekrar soruları aynı zamanda MS Word 2010 DOCX dökümanı şeklinde indirilebilir.

9.5.1 Çıktıyı Tahmin Etmek

Her kod bloğunun ekrana ne yazdıracağını tahmin edin:

  1. Blok 1
    for i in range(5):
        print (i+1)
    
  2. Blok 2
    for i in range(5):
        print (i)
        i=i+1
    
  3. Blok 3
    x=0
    for i in range(5):
        x+=1
    print (x)
    
  4. Blok 4
    x=0
    for i in range(5):
        for j in range(5):
            x+=1
    print (x)        
    
  5. Blok 5
    for i in range(5):
        for j in range(5):
            print (i,j)
    
  6. Blok 6
    for i in range(5):
        for j in range(5):
            print ("*",end="")
            print ()
    
  7. Blok 7
    for i in range(5):
        for j in range(5):
            print ("*",end="")
        print ()
    
  8. Blok 8
    for i in range(5):
        for j in range(5):
            print ("*",end="")
    print ()
    
  9. Blok 9
    # Buradaki hata nedir?
    array=[5,8,10,4,5]
    i=0
    for i in array:
        i = i + array[i]
    print(i)
    
  10. Blok 10
    for i in range(5):
        x=0
        for j in range(5):
            x+=1
    print (x)
    
  11. Blok 11
    import random
    play_again="y"
    while play_again=="y":
        for i in range(5):
            print (random.randrange(2),end="")
        print ()
        play_again=input("Play again? ")
    print ("Bye!")
    
  12. Blok 12
    def f1(x):
        print (x)
    y=3
    f1(y)
    
  13. Blok 13
    def f2(x):
        x=x+1
        print (x)
    y=3
    f2(y)
    print (y)
    
  14. Blok 14
    def f3(x):
        x=x+1
        print (x)
    x=3
    f3(x)
    print (x)
    
  15. Blok 15
    def f4(x):
        z=x+1
        print (z)
    x=3
    f4(x)
    print (z)
    
  16. Blok 16
    def foo(x):
        x=x+1
        print ("x=",x)
    
    x=10
    print ("x=",x)
    foo(x)
    print ("x=",x)
    
  17. Blok 17
    def f():
        print ("f start")
        g()
        h()
        print ("f end")
    
    def g():
        print ("g start")
        h()
        print ("g end")
        
    def h():
        print ("h")
        
    f()
    
  18. Blok 18
    def foo():
        x=3
        print ("foo çağırıldı")
        
    x=10
    print ("x=",x)
    foo()
    print ("x=",x)
    
  19. Blok 19 (Bu, 13. bölüme kadar açıklanmayacak bir konuyu örnekliyor.)
    def a(x):
        print ("a",x)
        x=x+1
        print ("a",x)
        
    x=1
    print ("main",x)
    a(x)
    print ("main",x)
    
    def b(y):
        print ("b",y[1])
        y[1]=y[1]+1
        print ("b",y[1])
        
    y=[123,5]
    print ("main",y[1])
    b(y)
    print ("main",y[1])
    
    def c(y):
        print ("c",y[1])
        y=[101,102]
        print ("c",y[1])
        
    y=[123,5]
    print ("main",y[1])
    c(y)
    print ("main",y[1])
    

9.5.2 Kod Düzeltme

  1. Alttaki kodu düzeltin:
    def sum(a,b,c):
        print (a+b+c)
    
    print (sum(10,11,12))
    
  2. Alttaki kodu düzeltin:
    
    def increase(x):
        return x+1
    
    x=10
    print ("X is",x," Şimdi x'i artıracağım." )
    increase(x)
    print ("X 'in şimdiki değeri",x)
    
  3. Alttaki kodu düzeltin:
    def print_hello:
        print ("Merhaba")
    
    print_hello()
    
  4. Alttaki kodu düzeltin:
    def count_to_ten():
        for i in range[10]:
            print (i)
    
    count_to_ten()
    
  5. Alttaki kodu düzeltin:
    def sum_list(list):
        for i in list:
            sum=i
            return sum
    
    list=[45,2,10,-5,100]
    print (sum_list(list))
    
  6. Alttaki kodu düzeltin:
    def reverse(text):
        result=""
        text_length=len(text)
        for i in range(text_length):
            result=result+text[i*-1]
        return result
    
    text="Programming is the coolest thing ever."
    print (reverse(text))
    
  7. Alttaki kodu düzeltin:
    def get_user_choice():
        while True:
            command=input("Command: ")
            if command=f or command=m or command=s or command=d or command=q:
                return command
            
            print ("Hey, that's not a command. Here are your options:" )
            print ("f - Full speed ahead")
            print ("m - Moderate speed")
            print ("s - Status")
            print ("d - Drink")
            print ("q - Quit")
    
    user_command=get_user_choice()
    print ("You entered:",user_command)
    

9.6 Kod Yazma

  1. Ekrana "Merhaba Dünya." yazdıran bir fonksiyon yazın.
  2. 1. problemdeki fonksiyonu çağıran kod yazın.
  3. "Hello Bob" yazan bir fonksiyon yazın ve ismi fonksiyonu çağıranın belirteceği bir parametre alsın.
  4. 3. problemdeki fonksiyonu çağıran bir kod yazın.
  5. Parametre olarak iki sayı alacak (kullanıcıdan input olarak değil) ve onların sonucunu (mesela çarpımını) ekrana yazdıracak bir fonksiyon yazın.
  6. Önceki fonksiyonu çağıran bir kod yazın.
  7. İki parametre alan bir fonksiyon yazın. İlk parametre phrase adlı bir string olacak. İkinci parametre count isimli bir sayı olacak. phrase'i ekrana count kez yazdırın. (Mesela, fonksiyon "Merhaba" ve 5'i aldığında, 5 kere "Merhaba" yazacak.)
  8. Önceki fonksiyonu çağıran bir kod yazın.
  9. Bir sayı alan ve bu sayının karesini döndüren bir fonksiyon yazın. Dikkat edin, bu fonksiyon sonucu döndürmelidir, ekrana yazdırmamalıdır.
  10. Üstteki fonksiyonu çağıran bir kod yazın.
  11. Parametre olarak üç sayı alan ve merkezkaç kuvvetini döndüren bir fonksiyon yazın. Merkezkaç kuvvetinin formülü:
    $F=mr\omega^2$
    Burada $F$ kuvvet, $r$ yarıçap ve $\omega$ ise açısal hızdır.
  12. Üstteki fonksiyonu çağıran bir kod yazın.
  13. Sayıların listesini bir parametre olarak alan ve her sayıyı ekrana yazdıran bir fonksiyon yazın.

You are not logged in. Log in here and track your progress.