Arcade Türü Oyun Programlamayı
ve Bilgisayar Bilimleri ÖğreninChapter 9: Fonksiyonlar
9.1 Fonksiyonlara Giriş
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)
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ı
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:
- Blok 1
for i in range(5): print (i+1)
- Blok 2
for i in range(5): print (i) i=i+1
- Blok 3
x=0 for i in range(5): x+=1 print (x)
- Blok 4
x=0 for i in range(5): for j in range(5): x+=1 print (x)
- Blok 5
for i in range(5): for j in range(5): print (i,j)
- Blok 6
for i in range(5): for j in range(5): print ("*",end="") print ()
- Blok 7
for i in range(5): for j in range(5): print ("*",end="") print ()
- Blok 8
for i in range(5): for j in range(5): print ("*",end="") print ()
- Blok 9
# Buradaki hata nedir? array=[5,8,10,4,5] i=0 for i in array: i = i + array[i] print(i)
- Blok 10
for i in range(5): x=0 for j in range(5): x+=1 print (x)
- 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!")
- Blok 12
def f1(x): print (x) y=3 f1(y)
- Blok 13
def f2(x): x=x+1 print (x) y=3 f2(y) print (y)
- Blok 14
def f3(x): x=x+1 print (x) x=3 f3(x) print (x)
- Blok 15
def f4(x): z=x+1 print (z) x=3 f4(x) print (z)
- Blok 16
def foo(x): x=x+1 print ("x=",x) x=10 print ("x=",x) foo(x) print ("x=",x)
- 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()
- Blok 18
def foo(): x=3 print ("foo çağırıldı") x=10 print ("x=",x) foo() print ("x=",x)
- 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
- Alttaki kodu düzeltin:
def sum(a,b,c): print (a+b+c) print (sum(10,11,12))
- 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)
- Alttaki kodu düzeltin:
def print_hello: print ("Merhaba") print_hello()
- Alttaki kodu düzeltin:
def count_to_ten(): for i in range[10]: print (i) count_to_ten()
- 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))
- 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))
- 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
- Ekrana "Merhaba Dünya." yazdıran bir fonksiyon yazın.
- 1. problemdeki fonksiyonu çağıran kod yazın.
- "Hello Bob" yazan bir fonksiyon yazın ve ismi fonksiyonu çağıranın belirteceği bir parametre alsın.
- 3. problemdeki fonksiyonu çağıran bir kod yazın.
- 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.
- Önceki fonksiyonu çağıran bir kod yazın.
- İ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.)
- Önceki fonksiyonu çağıran bir kod yazın.
- 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.
- Üstteki fonksiyonu çağıran bir kod yazın.
- 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. - Üstteki fonksiyonu çağıran bir kod yazın.
- 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.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin