25 Temmuz 2013 Perşembe

Modüller

Python modüler bir programlama dilidir. Peki burada modüler derken ne demek istiyoruz ? Python programlama dili parçalardan bütün elde etmek üzerine kurulmuş bir programlama dilidir. Bu parçalar istenildiği zaman bütüne dahil edilebilir. Böylelikle çalıştığımız ortamı sadece kullandığımız parçalardan oluşturarak gereksiz bellek tüketiminde bulunmamış oluruz.

Modülleri biraz daha açıklayarak beynimizde oturtalım. Bir programda aynı kodları tekrar tekrar yazmamak için Fonksiyonları kullanıyorduk. Tanımladığımız bir fonksiyon sadece o an içinde bulunduğumuz programda çalışır. Peki biz bu fonksiyonu başka bir program içinde çalıştırmak istersek ne yapmalıyız? Tabi ki kopyala yapıştır yapmayacağız. Programı içe aktarmamız (import) fonksiyonu kullanmak için yeterli olacaktır.
Python'da yazılmış her program aynı zamanda birer modüldür. Bu özellik sayesinde Python programlarında bulunan fonksiyon ve özellikler başka Python programlarında da rahatça kullanılabilirler.
Bu bölümde kendi modülümüzü yazmayı-Aslında daha önceden yazdığımız her program bir modül olduğu için bunu biliyoruz.Burada başka Python programında kullanımıyla ilgileneceğiz.-ve en çok kullanılan bazı hazır modüllerin kullanımından bahsedeceğiz.
Bir Modül Yazmak ve İçe Aktarmak
Daha önce söylediğimiz gibi yazdığımız her program aynı zamanda bir modüldür. Bir modül çeşitli değişkenlerin bulunduğu, fonksiyolar barındıran, bir veya daha fazla sınıfın bulunduğu karmaşık bir yapıya sahip olabilir.
Şimdi basit bir program(modül) oluşturalım ve "ilkmodul.py" adı ile kaydedelim.
#!/usr/bin/env python
#-*- coding:utf-8 -*-

program = "Python"
surum = "2.x"
Bu şekilde ilk modülümüzü oluşturmuş olduk. Bir modül çağrılırken sadece dosya adı kullanılır(uzantısı yazılmaz). Çağırma işlemi "import" ifadesi ile yapılır. Bildiğiniz gibi yukarıda ki programda değişkenleri şu şekilde kullanabiliyoruz.
print program
Python
Peki başka bir programda bu değişkeni kullanmak istersek ne yapmalıyız ? Şimdi "modulcagir.py" adında başka bir program oluşturalım. Bu iki programın aynı dizinde olmasına dikkat edelim.
import ilkmodul
print ilkmodul.program
Python
Gördüğünüz gibi ilk modülümüzü oluşturduk ve içindeki değişkeni başka bir programda kullandık. Şimdi bir fonksiyon bulunan modül tanımlayalım. İçinde Faktoriyel hesabı yapan bir fonksiyon bulunan "faktoriyel" adında şu şekilde bir modülümüz olsun.
#!/usr/bin/env python
#-*- coding:utf-8 -*-

def faktoriyel(sayi):
    fak = 1
    for i in range(sayi):
        fak= fak * (i+1)
    return fak
Bildiğiniz gibi biz bu program içinde istediğimiz yerde faktoriyel fonksiyonunu kulanabiliyoruz. Ama artık modüller sayesinde sadece bu program içinde değil istediğimiz herhangi bir program içerisinde kullanabileceğiz. Şimdi "hesapla.py" şeklinde bir program oluşturalım. Bu program içersinde faktoriyel fonksiyonunu kullanalım.
import faktoriyel
hesap = faktoriyel.faktoriyel(5)
print hesap
120
Bu şekilde faktoriyel modülü içerisinde bulunan her şeyi herhangi bir program içerisinde kullanabiliriz.
Modülleri İçe Aktarma Yöntemleri
Modülleri içe aktarmanın bir kaç yolu vardır. Biz sadece import modül_adi yöntemini öğrendik.
import modül_adi
Bu yöntem ile içeri aktarım yaptığımız zaman modül içerisinde bulunan her şeyi programımıza aktarmış oluyoruz. Verdiğimiz örneklerde kullandığımız gibi modül içerisinde bulunan değişken,fonksiyon veya herhangi bir şeyi kullanırken şu yönetimi kullanıyoruz.
modül_adi.fonksiyon_adi
Bu yöntem de doğrudan fonksiyon adını kullanırsak şu şekilde bir hata alırız.
print adi
Traceback (most recent call last):
  File  line 3, in 
    print adi
NameError: name 'adi' is not defined
from modül_adi import *
Daha öncede kullandığımız ilkmodul'u bu yöntem ile içe aktaralım.
from ilkmodul import *
print program
Gördüğünüz gibi sadece değişken adını yazarak kullanabildik. Burada kullandığımız * ifadesi içe aktardığımız modül içerisindeki tüm değerleri temsil etmektedir. Eğer biz sadece istediğimiz bir değişken veya fonksiyonu içe aktarmak istiyorsak, şu şekilde kullanabiliriz.
from ilkmodul import surum
print surum
Bu kullanım ile sadece surum değişkenini içe aktarmış olduk.
import modul_ismi as yeni_isim
Eğer içe aktaracağımız modülü kendi ismi ile değilde bizim belirlediğimiz isim ile çağırmak istersek bu şekilde takma bir isim verebiliriz.
import faktoriyel as fak
hesap = fak.faktoriyel(5)
print hesap
Gördüğünüz gibi artık faktoriyel modülünü fak ismi ile kullanıyoruz. Bu aktarım da eğer modülün kendi adını yazarak kullanmaya çalışırsanız hata alırsınız.
from modul_adi import nesne_adi as yeni_nesne_adi
import modul_ismi as yeni_isim kullanımında modüle takma isim veriyorduk. Bu kullanımda ise içe aktardığımız modül içersindeki bir nesneye takma isim veriyoruz. faktoriyel modülü içerisindeki faktoriyel fonksiyonunu şu şekilde içe aktaralım.
from faktoriyel import faktoriyel as fak
hesap = fak(5)
print hesap
Gördüğünüz gibi artık faktoriyel fonksiyonunu önünde modül adı olmadan ve yeni ismi ile kullandık.
Peki bu yöntemlerden hangisini kullanmalıyız? En güvenilir yöntem ilk(import modül_adi) bahsettiğimiz yöntemdir. Bu yöntem ile kullandığımız nesnelerin(örnek: modul.topla(10,5)) hangi modül içerisinde olduğunu rahat bir şekilde anlayabiliriz. İkinci(from modül_adi import *) kullanımında ise nesnenin(örnek: topla(10,5)) programın kendi içerisinde mi yoksa başka bir modülden mi içe aktarıldığını anlayamayız. Bu kullanımda eğer içe aktarılan modülde ve programda aynı isimde nesneler bulunuyorsa istemediğimiz sonuçlar ile karşılaşırız. Bu yüzden en güvenilir olan import modül_adi yöntemini kullanmak daha sağlıklıdır.
Modüllerin İçeriğini Öğrenme
Başkaları tarafından yazılmış olan bir modülü içe aktardığımız zaman modül içerisinde var olan nesneleri bilmeliyiz ki kullanabilelim. Bir modül içerisinde nelerin var olduğunu dir() fonksiyonu ile öğrenebiliriz.
import faktoriyel
print dir(faktoriyel)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'adi', 'faktoriyel']
Gördüğünüz gibi faktoriyel modülü içerisinde bulunan faktoriyel fonksiyonunu görebiliyoruz. Diğerleri tüm modüller için standart nesnelerdir. Bu şekilde içe aktaracağımız bir modül içeriğini öğrenebiliriz.

0 yorum :

Yorum Gönder