• Sonuç bulunamadı

13.6 ˙Istenen Sayıda ˙Isimli Argüman Kullanımı

13.8 global Deyimi

seyin kafanızı karı¸stırmasına izin vermeyin. Yeri ve zamanı geldi˘ginde “modül” ve “içe aktarmak” kavramlarından söz edece˘giz.

13.8 global Deyimi

Bu bölümde global adlı bir deyimden söz edece˘giz. ˙Isterseniz global‘in ne oldu˘gunu anlatmaya çalı¸smak yerine do˘grudan bir örnekle i¸se ba¸slayalım. Diyelim ki ¸söyle bir ¸sey yazdık:

fonk()

Burada her zamanki gibi fonk() adlı bir fonksiyon tanımladık ve daha sonra bu fonksiyonu ça˘gırdık. Sonuç olarak bu fonksiyonu çalı¸stırdı˘gımızda 5 çıktısını aldık.

Gördü˘günüz gibi, fonksiyon içindea adlı bir de˘gi¸skenimiz var. ¸Simdi ¸söyle bir ¸sey yazarak bu a de˘gi¸skenine ula¸smaya çalı¸salım:

#!/usr/bin/env python

print "a’nın de˘geri: ", a

Bu kodları çalı¸stırdı˘gımızda ¸söyle bir hata alırız:

Traceback (most recent call last):

File "deneme.py", line 7, in <module>

print a

NameError: name ’a’ is not defined

Bu hata mesajı bizea diye bir de˘gi¸sken olmadı˘gını söylüyor. Halbuki biz fonk() adlı fonksiyon içinde bua de˘gi¸skenini tanımlamı¸stık, de˘gil mi? O halde neden Pythona de˘gi¸skenini

bulamadı˘gından yakınıyor? Hatırlarsanız bu bölümün en ba¸sında, bir fonksiyonun sınırlarının ne oldu˘gundan söz etmi¸stik. Buna göre yukarıdakifonk() adlı fonksiyon def fonk():

ifadesiyle ba¸slıyor,print a ifadesiyle bitiyor. Bu fonksiyonun etkisi bu alanla sınırlıdır.

Python’da buna isim alanı (namespace) adı verilir. Herhangi bir fonksiyon içinde tanımlanan her ¸sey o fonksiyonun isim alanıyla sınırlıdır. Yani mesela yukarıdaki fonksiyon içinde

tanımladı˘gımıza de˘gi¸skeni yalnızca bu fonksiyon sınırları dâhilinde geçerlidir. Bu alanın dı¸sına çıkıldı˘gındaa de˘gi¸skeninin herhangi bir geçerlili˘gi yoktur. O yüzden Python yukarıdaki gibi bir kod yazdı˘gımızdaa de˘gi¸skenini bulamayacaktır. ˙Isterseniz bu durumu daha iyi anlayabilmek için yukarıdaki örne˘gi ¸söyle de˘gi¸stirelim:

#!/usr/bin/env python

print "a’nın de˘geri: ", a

Bu kodları çalı¸stırdı˘gımızda ise ¸söyle bir çıktı alırız:

5

a’nın de˘geri: 10

Buradaki ilk 5 sayısı fonksiyon içindekia‘nın de˘gerini gösteriyor. Alt satırdaki 10 de˘geri ise a‘nın fonksiyon sınırları dı¸sındaki de˘gerini... Gördü˘günüz gibi,a de˘gi¸skenini fonksiyon dı¸sında da kullanabilmek için bu de˘gi¸skeni dı¸sarıda tekrar tanımlamamız gerekiyor. Peki, biz

fonksiyon içindekia de˘gi¸skenine fonksiyon dı¸sından da eri¸semez miyiz? Elbette eri¸sebiliriz.

Ama bunun için global adlı bir deyimden yararlanmamız gerekir. Dilerseniz yukarıda ilk verdi˘gimiz örnek üzerinden giderek bu global deyimini anlamaya çalı¸salım:

#!/usr/bin/env python

print "a’nın de˘geri: ", a

Kodları bu ¸sekilde yazdı˘gımızda Python’un bize bir hata mesajı gösterece˘gini biliyoruz. ¸Simdi bu kodlara ¸söyle bir ekleme yapalım:

#!/usr/bin/env python

print "a’nın de˘geri: ", a

Burada yaptı˘gımız ¸sey, fonksiyonu tanımladıktan sonra fonksiyon gövdesinin ilk satırına global a diye bir ¸sey eklemekten ibaret. Bu ifade fonksiyon içindekia adlı de˘gi¸skenin

“global” oldu˘gunu, yani fonksiyonun kendi sınırları dı¸sında da geçerli bir de˘ger oldu˘gunu söylüyor. Bu kodları çalı¸stırdı˘gımızda ¸söyle bir çıktı alıyoruz:

5

a’nın de˘geri: 5

Gördü˘günüz gibi, global deyimi bir fonksiyon içindeki de˘gerlere fonksiyon dı¸sından da eri¸smemize yardımcı oluyor...

print "a’nın fonksiyon içindeki de˘geri", fonk() print "a’nın fonksiyon dı¸sındaki de˘geri: ", a

Buradaki return deyimine takılmayın biraz sonra bunun tam olarak ne i¸se yaradı˘gını görece˘giz. Biz yalnızca yukarıdaki kodların çıktısına odaklanalım.

Burada öncelikle bira de˘gi¸skeni tanımladık. Bu de˘gi¸skenin de˘geri 10. Ardından fonk() adlı bir fonksiyon olu¸sturduk. Bu fonksiyon içinde de˘geri 5 olan bir a de˘gi¸skeni daha tanımladık.

Fonksiyon dı¸sında ise, iki adet çıktı veriyoruz. Bunlardan ilki fonksiyon içindekia de˘gi¸skeninin

de˘gerini gösteriyor. ˙Ikincisi ise fonksiyon dı¸sındakia de˘gi¸skeninin de˘gerini... Yani bu kodları çalı¸stırdı˘gımızda ¸söyle bir çıktı elde ediyoruz:

a’nın fonksiyon içindeki de˘geri 5 a’nın fonksiyon dı¸sındaki de˘geri: 10

Burada fonksiyon içinde ve dı¸sında aynı adda iki de˘gi¸sken tanımlamamıza ra˘gmen,

Python’daki “isim alanı” kavramı sayesinde bu iki de˘gi¸skenin de˘geri birbirine karı¸smıyor. Ama bir de ¸su kodlara bakın:

#!/usr/bin/env python

print "a’nın fonksiyon içindeki de˘geri", fonk() print "a’nın fonksiyon dı¸sındaki de˘geri: ", a

Burada bir önceki kodlara ilave olarakglobal a satırını yazdık. Bu defa çıktımız ¸söyle oldu:

a’nın fonksiyon içindeki de˘geri 5 a’nın fonksiyon dı¸sındaki de˘geri: 5

Gördü˘günüz gibi, global deyimi fonksiyon dı¸sındakia de˘gi¸skenini sildi. ¸Simdi bu noktada kendimize ¸su soruyu sormamız lazım: Acaba bizim istedi˘gimiz ¸sey bu mu? Özellikle üzerinde birkaç farklı ki¸sinin çalı¸stı˘gı büyük projelerde böyle bir özellik ne tür sorunlara yol açabilir?

Üzerinde pek çok farklı ki¸sinin çalı¸stı˘gı büyük projelerde global deyiminin büyük sıkıntılar do˘gurabilece˘gi apaçık ortada. Siz programın bir yerine bir de˘gi¸sken tanımlamaya çalı¸sırken, ba¸ska bir geli¸stirici bir fonksiyon içinde global deyimini kullanarak fonksiyon dı¸sındaki aynı adlı de˘gi¸skenlerin de˘gerini birbirine katmı¸s olabilir... ˙I¸ste bu tür sıkıntılardan ötürü, her ne kadar faydalı bir araçmı¸s gibi görünse de, global deyiminin sakıncaları faydalarından çoktur.

O yüzden yazdı˘gınız programlarda global deyiminden mümkün oldu˘gunca uzak durmanızda fayda var.