Veri Bilimi İçin Python Notları-15: Python’da Modüller

V

1. Kişisel Modüller

Python’da kişisel bir modül bir tür kod kütüphanesine benzetilebilir. Belirli sınıflarınızı ve/veya fonksiyonlarınızı “.py” uzantısı ile kaydettiğiniz not defterleridir.

Aşağıdaki, kodları kopyalayıp bir metin dosyasının içine yapıştırınız. Ardından metin dosyasında file, save as yolunu izleyiniz ve dosyanın adını “myModule” (ya da sizin tercih ettiğiniz) ismiyle ve “.py” uzantılı şekilde kaydediniz. IDE’de üzerine çalışmakta olduğunuz dosya dizininin masaüstü olduğu varsayımda, “.py” uzantılı dosyayı masaüstüne kopyalayınız. Diğer bir ifadeyle kodları çalıştıracağınız dosya ile modülün bulunduğu dosya dizini aynı olmalıdır.

def my_mat_function(myParameter):
  for x in myParameter:
    print (5 * x)

#myValues = [2, 3, 4]
#my_mat_function(myValues)

Aşağıda gösterildiği gibi “myModule” import edildikten sonra fonksiyon çağrılabilir.

import myModule

myValues = [2, 3, 4]
myModule.my_mat_function(myValues)

#Sonuç/Fonksiyon Çıktısı:
#10
#15
#20

Bir modül fonksiyonların yanı sıra list, dictionary, nesne gibi her türden değişkenleri içerebilir.

mydict = {"Marka": "Volvo","Model": 2018,"Yakıt": "Dizel"}
myList = ["Volvo", "Renault", "Fiat"]

Daha sonra aşağıda gösterildiği gibi “myModule” import edilir ve sadece belirli bir değişken çağrılabilir.

import myModule

x = myModule.myDict["Marka"]
print(x) #Sonuç: Volvo

x = myModule.myList[1]
print(x) #Sonuç: Renault

Dilerseniz modülü IDE’nize aktarırken (import ederken) aşağıda gösterildiği gibi modüle farklı bir isim verebilirsiniz. Bu işlem modülün kendi dosyasının ismini değil, modülü çalıştırdığınız dosyada (IDE’de) yer alan ismini değiştirecektir.

import myModule as TestModul

x = TestModul.myDict["Marka"]
print(x) #Sonuç: Volvo

x = TestModul.myList[1]
print(x) #Sonuç: Renault

Yukarıda “myDict” ve “myList” isimli iki değişkeni içeren “myModule.py” isimli bir Python dosyası oluşturulmuştu. Eğer modülden sadece belirli bir değişkeni import etmek, diğer değişkenleri ve metotları import etmek istemiyorsanız, aşağıdaki şekilde farklı bir import yöntemi kullanabilirsiniz.

#import myModule
from myModule import myDict #myModule değil, MyModule içindeki myDict isimli sadece bir değişken import edildi.

x = myDict["Marka"] #myModule import edilmediği için kodun, myModule ile değil import edilen myDict ile başladığına dikkat edin.
print(x) #Sonuç: Volvo

#x = myModule.myList[1] #myModule import edilmediği için myList değişkenine ulaşamazsınız.
#print(x) #Sonuç: NameError: name 'myModule' is not defined

Şimdiye kadarki makalelerden yola çıkarak Python’da genel olarak kullanılabilir bir modül tasarlayabilir ve bir tür geometrik seri hesaplayıcı yapabiliriz. Geometrik seriler hakkında herhangi bir fikriniz yoksa google’da aratmanız ve geometrik serilere hızlıca (birkaç dakika) bir göz atmanız yararlı olacaktır.

Aşağıdaki, bir sınıftan ve metotlardan oluşan geometrik seri oluşturucu kodlarını kopyalayıp bir metin dosyasının içine yapıştırınız. Ardından metin dosyasında file, save as yolunu izleyiniz ve dosyanın adını “myGeometricSerial” (ya da sizin tercih ettiğiniz) ismiyle ve “.py” uzantılı şekilde kaydediniz. IDE’de üzerine çalışmakta olduğunuz dosya dizininin masaüstü olduğu varsayımda, “.py” uzantılı dosyayı masaüstüne kopyalayınız.

class MyGeoSerial: # s = 1**0 + r**1 + r**2 + r**3 + ... + r**n = 1/(1-r) sonucuna sahip bir geometrik seridir. r = 3 olduğu kabul edilmiştir.
    def __iter__(self): #__iter__ metodunun daha önce açıklanan __init__ metodu ile aynı göreve sahip olduğunu düşünebilirsiniz. Özetle sınıfın başlangıç parametrelerini belirtmektedir.
        self.r = 3
        self.us = -1
        return self
    
    def __next__(self):
        if self.us <= 4: #üs 4'ten küçük veya eşitse devam et
            self.us = self.us + 1
            x = (self.r)**(self.us)
            return x
        else: #üs 4'küçük veya eşit değilse yinelemeyi durdur.
            raise StopIteration

mySerial = MyGeoSerial() #mySerial ifadesi MyGeoSerial sınıfına tanıtılarak nesne yapılır.
myIterator = iter(mySerial) #mySerial nesnesi bir yineleyiciye dönüştürülür.

#Aşağıdaki her adımda geometrik serinin 1., 2., 3. vb. değeri yazdırılır.
for x in myIterator:
    print(x)
  
#Sonuç: 
#1
#3
#9
#27
#81
#243

Yukarıdaki adımda oluşturulan ve masaüstüne kaydedilen “myGeometricSerial.py” isimli modülü ve içindeki sınıfı aşağıda gösterildiği gibi çağırabiliriz.

import myGeometricSerial #Spyder IDE'sinde (şu anda) üzerinde çalışılan dosyanın dizini masaüstü olduğu için "myGeometricSerial.py" uzantılı dosya da masaüstüne kopyalanmıştır.
#Özetle modülü ismi ile yukarıda import etmiş (içe aktarmış) olduk.

myGeometricSerial.MyGeoSerial #Modülün önce import edilen kısımda kullanılan dosya ismini, sonrasında ise nokta ile (modülde yer alan) sınıfın ismini çağırıyoruz. 
#Sonuç: 
#1
#3
#9
#27
#81
#243 

#Not: modüldeki tüm sınıfların ve fonksiyonların çalışmasını istiyorsanız, modül adından sonra herhangi bir sınıf ya da fonksiyon belirtmeyebilirsiniz.

“myGeometricSerial.py” dosyasını kopyalayıp adını da “myGeoSer.py” gibi farklı bir isim yapınız. “myGeoSer.py” içindeki kodları tamamen siliniz. Aşağıda gösterildiği gibi revize edilen “myGeometricSerial.py” dosyasının içindeki kodların yeni halini “myGeoSer.py” içine yapıştırınız.

k = 1 # (İLAVE-1) k gibi bir global değişken tanımlandı ve varsayılan değeri 1'e eşitlendi. k bir geometrik seride sayı tabanını temsil etmektedir. k**0+k**1+k**2+k**3+...+k**n
n = 1 # (İLAVE-1) n gibi bir global değişken tanımlandı ve varsayılan değeri 1'e eşitlendi. n bir geometrik seride sayı üssünü temsil etmektedir. Seri uzunluğu ise n+1'dir. k**0+k**1+k**2+k**3+...+k**n
class MyGeoSerial: # s = 1**0 + r**1 + r**2 + r**3 + ... + r**n = 1/(1-r) sonucuna sahip bir geometrik seridir. r = 3 olduğu kabul edilmiştir.

    def __init__(self, k = 1, n = 1): # (İLAVE-2) init metodu ilave edildi. init metoduna k ve n parametreleri eklendi. k'nın ve n'nin varsayılan değeri yine 1'e eşitlendi.
        self.k = k
        self.n = n
        
    def __iter__(self): #__iter__ metodunun daha önce açıklanan __init__ metodu ile aynı göreve sahip olduğunu düşünebilirsiniz. Özetle sınıfın başlangıç parametrelerini belirtmektedir.
        self.us = -1
        return self

    def __next__(self):
        self.r = self.k #(İLAVE-3) bir önceki kodda 3 yerine self.k parametresi kullanıldı.
        if self.us <= (n - 1): ##(İLAVE-3) iterasyonun stop kriteri n-1'e eşitlendi. Bir önceki 4 idi.
            self.us = self.us + 1
            x = (self.r)**(self.us)
            return x
        else: #üs n-1'den küçük veya eşit değilse yinelemeyi durdur.
            raise StopIteration

mySerial = MyGeoSerial(k, n) #m (İLAVE-4) MyGeoSerial sınıfının init metodundaki k ve n parametreleri ilave edildi.
myIterator = iter(mySerial) #mySerial nesnesi bir yineleyiciye dönüştürülür.

#Aşağıdaki her adımda geometrik serinin 1., 2., 3. vb. değeri yazdırılır.
for x in myIterator:
    print(x)

Yukarıdaki modülde kullanıcının modülde herhangi bir değişiklik yapmadan k ve n parametrelerine göre dilediği bir geometrik seriyi oluşturmasını istiyoruz. Bu yüzden yukarıdaki modülü yönetecek aşağıdaki gibi bir algoritmaya ihtiyacımız vardır. Aşağıdaki kodları çalıştırdığınızda k=3 ve n=4 için yeni bir geometrik seri üretecektir. Dilerseniz myPar_k = 3 yerine myPar_k = 5, myPar_n = 4 yerine myPar_n = 10 yapabilirsiniz. Böylece aşağıdaki kodu çalıştırdıktan sonra sayı tabanı 5 ve üssü ise 0’dan 10’a kadar devam eden bir geometrik seriniz olur (5^0+5^1+5^2+..+5^10).

with open ('myGeoSer.py') as aFile: #Çalıştırışacak modülün parametrelerinde güncelleme yapılacağı için modül import yönteminden farklı bir şekilde çağrıldı.
 
    myPar_k = 3 # k parametresini istediğiniz gibi değiştirebilirsiniz(k=sayı tabanı).
    myPar_n = 4 # n parametresini istediğiniz gibi değiştirebilirsiniz (n=maksimum sayı üssü).
    
    #k parametresinin güncellenmesi. Aşağıdaki metot string değişkenlerle ilgili makalede detaylı açıklanmıştı.
    myDef_k = "k = 1"
    myParChanger = "k = {}"  
    myParChanger = myParChanger.format(myPar_k)
    
    #n parametresinin güncellenmesi. Aşağıdaki metot string değişkenlerle ilgili makalede detaylı açıklanmıştı.
    myDef_n = "n = 1"
    myRep_n = "n = {}"  
    myRep_n = myRep_n.format(myPar_n)
    
    #Güncellenen k ve n parametrelerine göre myGeoSer.py modülünü çalıştır. Modüldeki k = 1 ile n = 1 parametrelerini k = 3 ile n = 4 gibi yukarıda değiştirilen değerlerie göre güncelliyor ve sonra modülü run ediyor/çalıştırıyor.
    exec (aFile.read () .replace (myDef_k, myParChanger) .replace (myDef_n, myRep_n)) 

“myGeoSer.py” dosyasını kopyalayıp adını da “myGeoSerSum.py” gibi farklı bir isim yapınız. “myGeoSerSum.py” içindeki kodları tamamen siliniz. Aşağıda gösterildiği gibi revize edilen “myGeoSer.py” dosyasının içindeki kodların yeni halini “myGeoSerSum.py” içine yapıştırınız. Böylece bir önceki modülde küçük değişiklikler yaparak herhangi bir geometrik serinin sonucunu/toplamını (yukarıda bahsedildiği gibi modülde herhangi bir değişiklik yapmadan sadece k ve n parametrelerini değiştirerek) kolaylıkla elde edebileceğiz.

k = 1 # k gibi bir global değişken tanımlandı ve varsayılan değeri 1'e eşitlendi. k bir geometrik seride sayı tabanını temsil etmektedir. k**0+k**1+k**2+k**3+...+k**n
n = 1 # n gibi bir global değişken tanımlandı ve varsayılan değeri 1'e eşitlendi. n bir geometrik seride sayı üssünü temsil etmektedir. Seri uzunluğu ise n+1'dir. k**0+k**1+k**2+k**3+...+k**n
class MyGeoSerial: # s = 1**0 + r**1 + r**2 + r**3 + ... + r**n = 1/(1-r) sonucuna sahip bir geometrik seridir. r = 3 olduğu kabul edilmiştir.

    def __init__(self, k = 1, n = 1): # init metodu ilave edildi. init metoduna k ve n parametreleri eklendi. k'nın ve n'nin varsayılan değeri yine 1'e eşitlendi.
        self.k = k
        self.n = n
        
    def __iter__(self): #__iter__ metodunun daha önce açıklanan __init__ metodu ile aynı göreve sahip olduğunu düşünebilirsiniz. Özetle sınıfın başlangıç parametrelerini belirtmektedir.
        self.us = -1
        return self

    def __next__(self):
        self.r = self.k # bir önceki kodda 3 yerine self.k parametresi kullanıldı.
        if self.us <= (n - 1): # iterasyonun stop kriteri n-1'e eşitlendi. Bir önceki 4 idi.
            self.us = self.us + 1
            x = (self.r)**(self.us)
            return x
        else: #üs n-1'den küçük veya eşit değilse yinelemeyi durdur.
            raise StopIteration

mySerial = MyGeoSerial(k, n) # MyGeoSerial sınıfının init metodundaki k ve n parametreleri ilave edildi.
myIterator = iter(mySerial) #mySerial nesnesi bir yineleyiciye dönüştürülür.

#Aşağıdaki her adımda geometrik serinin 1., 2., 3. vb. değeri yazdırılır. 
# (İLAVE-1) Ayrıca myList'e eleman olarak eklenir. Toplam için mySum kullanılmıştır.
myList = []
mySum = 0.0
for x in myIterator:
    print(x)
    myList.append(x) 
    mySum = mySum + x

print(myList)
print(mySum)

Böylece aşağıdaki kodu çalıştırdıktan sonra sayı tabanı 2 ve üssü ise 0’dan 5’e kadar devam eden bir geometrik serinin toplamını elde etmiş oluruz. Aşağıdaki kodlarda bir önceki koddan farklı olarak sadece ilk satırda yer aln “myGeoSer.py” ifadesi “myGeoSerSum.py” ifadesi ile değiştirilmiştir. Yukarıda da bahsedildiği üzere dilerseniz konsoldan çalıştıracağınız aşağıdaki kodlarda, “myGeoSerSum.py” isimli modülde herhangi bir değişiklik yapmadan, sadece myPar_k = 2 ve myPar_n = 5 parametrelerini değiştirerek farklı bir geometrik serinin toplamını elde edebilirsiniz.

with open ('myGeoSerSum.py') as aFile: #Çalıştırışacak modülün parametrelerinde güncelleme yapılacağı için modül import yönteminden farklı bir şekilde çağrıldı.
 
    myPar_k = 2 # k parametresini istediğiniz gibi değiştirebilirsiniz(k=sayı tabanı).
    myPar_n = 5 # n parametresini istediğiniz gibi değiştirebilirsiniz (n=maksimum sayı üssü).
    
    #k parametresinin güncellenmesi. Aşağıdaki metot string değişkenlerle ilgili makalede detaylı açıklanmıştı.
    myDef_k = "k = 1"
    myParChanger = "k = {}"  
    myParChanger = myParChanger.format(myPar_k)
    
    #n parametresinin güncellenmesi. Aşağıdaki metot string değişkenlerle ilgili makalede detaylı açıklanmıştı.
    myDef_n = "n = 1"
    myRep_n = "n = {}"  
    myRep_n = myRep_n.format(myPar_n)
    
    #Güncellenen k ve n parametrelerine göre myGeoSerSum.py modülünü çalıştır. Modüldeki k = 1 ile n = 1 parametrelerini k = 3 ile n = 4 gibi yukarıda değiştirilen değerlerie göre güncelliyor ve sonra modülü run ediyor/çalıştırıyor.
    exec (aFile.read () .replace (myDef_k, myParChanger) .replace (myDef_n, myRep_n))

2. Yerleşik Modüller

Python’a entegre, istenildiğinde import edilebilecek çok sayıda hazır modül vardır. Örneğin aşağıdaki modül işletim sistemine ilişkin verilerin elde edilmesinde kullanılabilir.

import platform

x = platform.system()
print(x) # Windows (İşletim sistemim Windows olduğu için sonuç da Windows oldu.)

“platform” modülüne (aslında herhangi bir modüle) ait tüm metotlar ve diğer modüller aşağıda gösterildiği gibi “dir” metodu kullanılarak listelenebilir.

import platform

x = dir(platform)
for a in x:
    print(a)

#Sonuç:
'''
_Processor
_WIN32_CLIENT_RELEASES
_WIN32_SERVER_RELEASES
__builtins__
__cached__
__copyright__
__doc__
__file__
__loader__
__name__
__package__
__spec__
__version__
_comparable_version
_component_re
_default_architecture
_follow_symlinks
_get_machine_win32
_ironPython26_sys_version_parser
_ironPython_sys_version_parser
_java_getprop
_libc_search
_mac_ver_xml
_node
_norm_version
_platform
_platform_cache
_pypy_sys_version_parser
_sys_version
_sys_version_cache
_sys_version_parser
_syscmd_file
_syscmd_ver
_uname_cache
_unknown_as_blank
_ver_output
_ver_stages
architecture
collections
functools
itertools
java_ver
libc_ver
mac_ver
machine
node
os
platform
processor
Python_branch
Python_build
Python_compiler
Python_implementation
Python_revision
Python_version
Python_version_tuple
re
release
subprocess
sys
system
system_alias
uname
uname_result
version
win32_edition
win32_is_iot
win32_ver
'''

Bu metotlar şimdilik tek tek açıklanmayacak olmakla birlikte, ilerleyen makalelerde yeri geldikçe kullanılacak ve açıklanacaktır. Ancak kesinlikle bir şekilde karşılaşacağınız ve içlerinden bazılarını sıklıkla kullanacağınız metotlar olduğunu söyleyebilirim. Örneğin yukarıdaki “os” modülü ve “__file__” metodu aşağıda gösterildiği gibi birlikte kullanılarak üzerinde çalıştığınız Python dosyasının dizinini verir.

import os
auto_path = os.path.dirname(__file__)
print(auto_path) #Sonuç: IDE'de üzerinde çalıştığınız dosyanın bulunduğu dizini verir.

 

 

İshak Kutlu, Veri Bilimi İçin Python Notları

2 Yorum

İshak Kutlu

Veri & Otomasyon Uzmanı

Kurumsal iş akışlarını düzenleyen veri odaklı otomasyon sistemleri ve makine öğrenmesi tabanlı çözümler geliştirir. Gerçek operasyonel süreçler için ölçeklenebilir ve izlenebilir yapılar tasarlar.

YouTube   YouTube   YouTube   YouTube