Python İle Programlamanın Temelleri-8
Fonksiyonlar-2
1. Global Değişkenler
Fonksiyonların içerisinde tanımlanan değişkenler yerel değişkenlerdir. Bu değişkenlerin bazı özellikleri vardır:
Bu değişkenler, hafızada aktif kullanıldıkları sürece yani sadece fonksiyon çalışırken korunur. Fonksiyondan çıkıldığında bu değişkenler de program tarafından unutulur ve hafızada ayrılan yerde başka değişkenler tarafından kullanılır.
Aynı değişken adı çakışma olmaksızın farklı fonksiyonlarda kullanılabilir. Bir fonksiyon sonlanmadan diğeri çalışmaya başlayamayacağı için aynı değişken kullanılması sorun yaratmaz.
Yerel değişkenler geçicidir; fonksiyonlar çağırıldığında kaybolur. Bazen bu çalışma sürecinden bağımsız bir değişkene ihtiyaç duyulur.
Global değişken: Ne zaman hangi fonksiyon çağırılırsa çağırılsın, program tarafından tanınan ve hafızada sürekli yeri olan bir değişken.
Bir değişken, bir nesneye atandığı zaman tanımlanır. Bir fonksiyona atanan değişken o fonksiyon için yereldir. Ancak global olarak tanımlanır ise programın tümü tarafından tanınır ve kullanılır.
2. Örnekler
2.1. Hesap Makinesi Örneği
# Kullanıcı seçimine göre Toplama ve Çıkarma işlemi yapan program kodları
def Yardim():
print(“Topla : Girilen iki sayıyı toplar”) print(“Fark Al : Girilen iki sayının farkını alır”) print(“Yazdır : İşlem yapılan en son değeri ekrana yazdırır”) print(“Yardım : Bu ekranı görüntüler”)
print(“Çıkış : Programdan çıkışı sağlar”)
def Menu():
return input(“=== (T)opla (F)ark Al (Y)azdır Y(A)rdım (Ç)ıkış ===”)
# Programda kullanılmak üzere global değişken tanımlanması
sonuc = 0.0 sayi1 = 0.0 sayi2 = 0.0 def SayiGir():
global sayi1, sayi2 # sayi1 ve sayi2 nin global değişken olarak bildirilmesi
sayi1 = float(input(“Sayı Giriniz #1: “))
sayi2 = float(input(“Sayı Giriniz #2: “))
def Yazdir():
print(sonuc)
def Topla():
global sonuc
sonuc = sayi1 + sayi2 def FarkAl():
global sonuc
sonuc = sayi1 sayi2 def main():
durum = False while not durum:
secim = Menu() # İşlem yapılacak Menü Tasarımı
if secim == “T” or secim == “t”: # Toplama
SayiGir() Topla() Yazdir()
elif secim == “F” or secim == “f”: # Çıkarma
SayiGir() FarkAl() Yazdir()
elif secim == “Y” or secim == “y”: # Yazdırma
Yazdir()
elif secim == “A” or secim == “a”: # Yardım
Yardim()
elif secim == “Ç” or secim == “ç”: # Çıkış
durum = True
main()
Ekran Çıktısı
=== (T)opla (F)ark Al (Y)azdır Y(A)rdım (Ç)ıkış ===T Sayı Giriniz #1: 12
Sayı Giriniz #2: 43
55.0
=== (T)opla (F)ark Al (Y)azdır Y(A)rdım (Ç)ıkış ===F Sayı Giriniz #1: 44
Sayı Giriniz #2: 32
12.0
=== (T)opla (F)ark Al (Y)azdır Y(A)rdım (Ç)ıkış ===Ç
2.2. Varsayılan (Default) Parametreler
Parametreli fonksiyonlar çağırılırken bir değer gönderilmesi gerekir. Bazı durumlarda bu değer gönderilmeden de fonksiyon çalıştırılmak istenirse, fonksiyonun tanımlama aşamasında gönderilmesi istenen parametreye varsayılan olarak bir değer verilmesi gerekir. Örneğin a=input() ya da a=input(“Adınızı giriniz”)
def gerisayim(n=5):
for sayac in range(n, -1, -1):
print(sayac)
gerisayim() print() gerisayim(8)
Ekran Çıktısı
5
4
3
2
1
0
8
7
6
5
4
3
2
1
0
Yukarıdaki programda gerisayim() fonksiyonu iki kere çağırılmıştır. İlk çağırımında parametre verilmediği için fonksiyonun tanımında verilen default değer ile işlem yapılmış ve 5’ten geriye doğru sayma işlemi gerçekleşmiş ve ekrana yazılmıştır. İkinci çağırılmasında ise 8 değeri parametre olarak gönderilmiş ve bu değer ile işlem yapılmıştır.
2.3. Varsayılan ve Diğer Parametreler
def AralikTopla(n, m=100): # Tek değer varsayılan atama
toplam = 0
for deger in range(n, m + 1):
toplam += deger
Yukarıdaki AralikTopla() fonksiyonunun ikinci (m) parametresine değer girilmez ise varsayılan olarak 100 değeri alınır.
def AralikTopla(n=0, m=100): # İki değer varsayılan atama
toplam = 0
for deger in range(n, m + 1):
toplam += deger
Yukarıdaki AralikTopla() fonksiyonunun birinci (n), ikinci (m) parametrelerine değer girilmez ise varsayılan olarak sırasıyla 0 ve 100 değerleri alınır.
def AralikTopla(n=0, m): # Tek değer varsayılan atama
toplam = 0
for deger in range(n, m + 1):
toplam += deger
Yukarıdaki AralikTopla() fonksiyonunun birinci (n) parametresine değer girilmez ise varsayılan olarak 0 değeri alınır.
2.4. Gelişmiş Poligon Çizimi
import turtle import random
# Program fonksiyona gönderilen parametreler ile çokgen çizer.
# Uzunluk paremetresi girilerek herbir kenarın uzunluğu belirlenir.
# Çizim x ve y parametrelerine girilen koordinat noktalarından başlar.
# Bir sonraki parametre çizimin kenar rengini belirler. (Varsayılan değer olarak siyah).
# Çizilen çokgenin içine dolgu olup olmayacağı belirlenir(Varsayılan False).
def Cokgen(kenarSayisi, uzunluk, x, y, renk=”black”, dolgu=False):
turtle.penup() turtle.setposition(x, y) turtle.pendown() turtle.color(renk)
if dolgu:
turtle.begin _ fill()
for i in range(kenarSayisi): turtle.forward(uzunluk) turtle.left(360//kenarSayisi)
if dolgu:
turtle.end _ fill()
# Adım adım çizim işlemi iptal edilerek çizim hızlandırılıyor
turtle.hideturtle()
turtle.tracer(0)
# Fonksiyonlar örnek çizimler için kullanılıyor
Cokgen(3, 30, 10, 10) # Üçgen çizimi
Cokgen(4, 30, 50, 50, “blue”) # Kenar rengi mavi olan Kare çizimi
Cokgen(5, 30, 100, 100, “red”, True) # Dolgusu kırmızı olan beşgen çizimi
turtle.update()
turtle.exitonclick() # Fare tuşuna tıklandığında çıkış işlemi yapılacaktır.
2.5. Öz Yineleme
Bir fonksiyonun kendisini çağırarak çözüme gitmesine özyineleme, böyle çalışan fonksiyonlara da özyinelemeli fonksiyonlar denilir. Özyinelemeli algoritmalarda, tekrarlar fonksiyonun kendi kendisini kopyalayarak çağırması ile elde edilir. Bu kopyalar işlerini bitirdikçe kaybolur. Bu yönteme en uygun örnek faktöriyel problemidir.
#Özyineleme ile faktöriyel hesaplama
def faktoriyel(n):
#Gelen n değerinin faktöriyeli alır.
if n == 0:
return 1 else:
return n * faktoriyel(n-1)
def main():
# Fonksiyonumuza çeşitli değerler ile test edelim
print(” 0! = “, faktoriyel(0)) print(” 1! = “, faktoriyel(1)) print(” 6! = “, faktoriyel(6)) print(“10! = “, faktoriyel(10))
main()
Sonuç Ekranı
0! = 1
1! = 1
6! = 720
10! = 3628800
Öz yinelemeli fonksiyonlar kendilerini çağırarak işlem yapan fonksiyonlardır. Yukarıdaki örnekte parametre olarak gelen değerden başlayarak birer azaltıp kendini çağırma işlemi yapar. Bu çağırma işlemi, döngü parametre değeri, 0 olasıya kadar devam eder. 0 olduğunda kendini çağırma işlemi durur ve geriye doğru değerler çarpılarak sonuç bulunur.
2.6. Öz Yineleme Olmadan Faktöriyel Hesaplama
def faktoriyel(n):
sonuc = 1 while n:
sonuc *= n n -= 1
return sonuc def main():
print(” 0! = “, faktoriyel(0)) print(” 1! = “, faktoriyel(1)) print(” 6! = “, faktoriyel(6)) print(“10! = “, faktoriyel(10))
main()
Sonuç Ekranı
0! = 1
1! = 1
6! = 720
10! = 3628800
2.7. Fibonacci Sayıları
def fibonacci(n):
if n <= 0:
return 0 elif n == 1: return 1
else:
return fibonacci(n 2) + fibonacci(n 1)
sira=int(input(“Görmek istediğiniz fibonacci sıra numarasını
giriniz.:”))
print(fibonacci(sira))
Sonuç Ekranı
Görmek istediğiniz fibonacci sıra numarasını giriniz.:22
17711
Fibonacci Sayıları: Her sayının kendisinden önce gelen iki sayının toplamı şeklinde yazılıp devam ettiği sayı dizisine Fibonacci Sayı Dizisi denir. 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,…
3. Fonksiyonları Tekrar Kullanılabilir Yapma
Fonksiyonlar programlar içerisinde defalarca kullanılabilir. Aynı amaçlı fonksiyonların birden fazla program tarafından da kullanılması istenebilir. Bu durumda tanımlanan fonksiyon, amacına uygun çağrışım yapacak bir isim verildikten sonra kullanılmak istenen programlarda “from” komutu ile dosya adı yazılarak çağırılabilir.
Kullanımı
from <dosya adı> import <fonksiyon adı>
Örnek
# Asal sayının kontrol edildiği fonksiyon tanımlama
from math import sqrt
def AsalKontrol(n):
# Fonksiyona gelen değer asal ise geriye True, değilse False döner.
bolen= 2
kok = sqrt(n)
while bolen <= kok:
if n % bolen == 0: # Kalan kontrolü yapılıyor
return False # Tam bölünme işlemi gerçekleşti. Asal Değil
bolen += 1 # Bir sonraki bölen değerine geçiliyor.
return True # Tüm değer kontrollerinden sonra kalanlı bölme gerçekleşmediğinde, True değeri dönüyor.
Yukarıda yazılan kodlar, gönderilen sayının asal olup olmadığını kontrol eder. Gelen sayı asal ise geriye True, değilse False gönder. Kodlar yazıldıktan sonra dosya Kontrol.py adı ile kaydedilmelidir.
Aşağıdaki kod, kendisi ile aynı dizinde bulunan Kontrol.py dosyasında bulunan AsalKontrol fonksiyonunu kullanıyor.
from Kontrol import AsalKontrol
# Kontrol dosyasındaki AsalKontrol fonksiyonu programa ekleniyor
sayi = int(input(“Bir sayı giriniz.: “))
if AsalKontrol(sayi):
print(sayi, “ASAL”)
else:
print(sayi, “ASAL değil”)
Diğer bir yol ise şu şekildedir:
import Kontrol
sayi = int(input(“Bir sayı giriniz.: “))
if Kontrol.AsalKontrol(sayi):
print(num, “sayısı ASAL sayıdır.”)
else:
print(num, “sayı ASAL değildir.”)
Fonksiyonlar-2 konusu ile ilgili sunum dosyasına ve konu testine (yakında) aşağıdan ulaşabilirsiniz.