Ayberk Seven

Ana Dal: Bilgisayar Mühendisliği

Yan Dal: Mekatronik Mühendisliği

Ayberk Seven

Ana Dal: Bilgisayar Mühendisliği

Yan Dal: Mekatronik Mühendisliği

Blog Yazılarım

Modüller

Modül kavramını bir kod kütüphanesi olarak düşünebilirsiniz. Yazdığınız kod içinde kullanmak isteyeceğiniz fonksiyonların bulunduğu bir dosya olarak da düşünebilirsiniz.

Aynı zamanda sizin yazdığınız ve .py uzantılı olarak kaydettiğiniz dosyalar da birer modül olabilir. Bu dosyaları diğer dosyalarınız içine import anahtar kelimesiyle dahil edip, içindeki fonksiyonları modül_adı.fonksiyon_adı(parametreler) şablonu ile kullanabilirsiniz.

Örnek olması için iki rakam arasında dört işlem gerçekleştiren basit fonksiyonlar yazalım ve dortislem.py ismiyle kaydedelim;

def toplama(sayi1,sayi2):
  return sayi1+sayi2

def cikartma(sayi1,sayi2):
  return sayi1-sayi2

def carpma(sayi1,sayi2):
  return sayi1*sayi2

def bolme(sayi1,sayi2):
  return sayi1/sayi2

Yeni bir Python dosyası açalım ve dört işlem modülümüzü bu dosyaya ekleyerek içindeki fonksiyonları kullanalım;

import dortislem

a=56
b=17

toplam=dortislem.toplama(a,b)
fark=dortislem.cikartma(a,b)
carpim=dortislem.carpma(a,b)
bolum=dortislem.bolme(a,b)

print("İki sayının toplamı: ",toplam)
print("İki sayının farkı: ",fark)
print("İki sayının çarpımı: ",carpim)
print("İki sayının bölümü: ",bolum)

Çıktı:

İki sayının toplamı: 73
İki sayının farkı: 39
İki sayının çarpımı: 952
İki sayının bölümü: 3.2941176470588234

Yazdığınız kodlar içinde modüller içindeki fonksiyonları kullanabileceğiniz gibi değişkenleri de dolayısıyla sözlükler, nesneler gibi veri türlerini de kullanabilirsiniz.

Örnek olması için veriler.py isimli bir python dosyası oluşturup içinde 2 adet personel verisini sözlük veri türünde kaydedelim;

personel1={
  "ad":"Oben",
  "soyad":"Seven",
  "meslek":"Full Stack Developer",
  "deneyim":18
}
personel2={
  "ad":"Mert",
  "soyad":"Demir",
  "meslek":"Backend Developer",
  "deneyim":6
}

Yeni bir personel.py dosyası oluşturup veriler.py dosyamızı içine ekleyerek içindeki verilere ulaşalım ve kodumuzda kullanalım;

import veriler

a1=veriler.personel1["ad"]
s1=veriler.personel1["soyad"]
m1=veriler.personel1["meslek"]
d1=veriler.personel1["deneyim"]
a2=veriler.personel2["ad"]
s2=veriler.personel2["soyad"]
m2=veriler.personel2["meslek"]
d2=veriler.personel2["deneyim"]

print(f"{a1} {s1} isimli personelimiz {d1} yıl deneyimli olup, {m1} olarak çalışmaktadır.")
print()
print(f"{a2} {s2} isimli personelimiz {d2} yıl deneyimli olup, {m2} olarak çalışmaktadır.")

Bu kodu terminal ekranında
$ python3 personel.py
komutu ile çalıştırdığınızda;

Çıktı:

Oben Seven isimli personelimiz 18 yıl deneyimli olup, Full Stack Developer olarak çalışmaktadır.

Mert Demir isimli personelimiz 6 yıl deneyimli olup, Backend Developer olarak çalışmaktadır.

Eğer modül içindeki tüm fonksiyonları ya da ileride göreceğiniz sınıfları kullanmayacaksanız, sadece kullanacağınız fonksiyonları ya da sınıfları kodunuza ekleyebilirsiniz;

from modül_adı import fonksiyon_adı, fonksiyon_adı

Bu şekilde kullandığınızda, modül içindeki sınıf ve fonksiyonlara modül_adı.fonksiyon_adı(parametreler) şeklinde değil, sanki fonksiyonunuz aynı dosyanın içindeymiş gibi direkt fonksiyon_adı(parametreler) şeklinde ulaşabilirsiniz, verileri de sanki aynı dosya içindeki verilere ulaşıyormuş gibi kullanabilirsiniz. Bu kullanışlı gibi görünse de büyük kod dosyaları oluşturduğunuzda hangi sınıf ya da fonksiyonun aynı dosya içinde yer aldığını, hangisinin import anahtar kelimesiyle dahil edilen modülden geldiğini anlamanız güçleşebilir. Buna dikkat etmelisiniz.

Ya da ekleyeceğiniz modüllere takma isim verebilirsiniz;

import modül_adı as takma_ad

Böylece harici modülleri daha anlamlı ya da daha kısa isimlendirmeler ile kodunuz içinde kullanabilirsiniz.

Python ile birlikte kullanabileceğiniz bir çok hazır modül gelmektedir. Ayrıca internet üzerinde de paylaşılan bir çok hazır modülü alıp projelerinizde kullanabilirsiniz.

Örneğin Python kodlarınızın üzerinde çalıştırıldığı bilgisayar hakkındaki bilgileri edinmenizi sağlayan platform modülü ile kullanıcının işletim sistemine özel kod yazabilirsiniz;

import platform

if platform.system() == "Linux":
  print("İyi seçim!")
else:
  print(platform.system(), " ? Ciddi misiniz?") 
print()
print("Sisteminiz ile ilgili bir takım bilgiler: ")
print("İşletim Sisteminiz: ", platform.system())
print("Bilgisayarınızın ismi: ",platform.node())
print("İşlemcinizin mimarisi: ",platform.architecture())

Çıktı:

İyi seçim!

Sisteminiz ile ilgili bir takım bilgiler: 
İşletim Sisteminiz: Linux
Bilgisayarınızın ismi: c5380c8d7e5e
İşlemcinizin mimarisi: ('64bit', 'ELF')

Eğer dosyanıza eklediğiniz modül içinden hangi fonksiyonları kullanabileceğinizi öğrenmek isterseniz dir() fonksiyonundan yararlanabilirsiniz;

print(dir(platform))

Çıktı:

['_WIN32_CLIENT_RELEASES', '_WIN32_SERVER_RELEASES', '__builtins__', '__cached__', '__copyright__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_comparable_version', '_component_re', '_default_architecture', '_follow_symlinks', '_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_uname', '_syscmd_ver', '_uname_cache', '_ver_output', '_ver_stages', 'architecture', 'collections', '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', 'sys', 'system', 'system_alias', 'uname', 'uname_result', 'version', 'win32_edition', 'win32_is_iot', 'win32_ver']

Python’da bir dosyayı modül olarak kullanabilmek için, dosya çalıştırıldığında içindeki fonksiyonların da çalıştırılmasını önlemek gereklidir. Çünkü bu dosyayı import ettiğinizde, sanki terminalde dosya çalıştırılmış gibi fonksiyonları çalışır ve çıktıları işlenir. Örneğin calisanfonksiyon.py isimli bir python dosyası oluşturalım ve içine 2 tane fonksiyon yazalım;

def yazdir():
  print("Bu kod direkt çalıştırılır!")

def toplama(sayi1,sayi2):
  return sayi1+sayi2

yazdir()
print(toplama(45,32))

Gördüğünüz gibi dosya içinde yazdir() isimli fonksiyonu çalıştırıyoruz ve bu fonksiyon bir çıktı üretiyor. Bu dosya terminalde

$ python3 calisanfonksiyon.py

komutu ile çalıştırıldığında;

Çıktı:

Bu kod direkt çalıştırılır!
77

olacaktır.

Şimdi bu dosya içindeki toplama() fonksiyonunu bir başka modultest.py dosyası içinde kullanmak istediğimizi ve bunun için calisanfonksiyon.py dosyamızı modül olarak kullanılmak üzere dosyamıza eklediğimizi düşünelim;

import calisanfonksiyon

print(calisanfonksiyon.toplama(3,5))

Bu dosyamızı terminalde

$ python3 modultest.py

komutu ile çalıştırdığımızda;

Çıktı:

Bu kod direkt çalıştırılır!
77
8

Burada, import anahtar kelimesi ile eklediğimiz dosyamızın tüm çalıştırılabilir fonksiyonlarının çalıştırılarak çıktılarının yazdırıldığını görüyoruz. Bu istediğimiz durum ile örtüşmüyor. Daha önce de söylediğimiz gibi bir python dosyasını modül olarak kullanırken, dosyanın fonksiyonlarının çalıştırılmasının önüne geçmek için koşullu bir ifade ile dosyanın __main__ yani asıl çalıştırılan dosya olup olmadığı kontrolünü ekleyerek fonksiyonlarımızı burada çalıştırılacak şekilde yazıyoruz;

calisanfonksiyon.py:

def yazdir():
  print("Bu kod direkt çalıştırılır!")

def toplama(sayi1,sayi2):
  return sayi1+sayi2

if __name__ == "__main__":
  yazdir()
  print(toplama(45,32))

Bu kontrol eklendikten sonra bu dosyayı modül olarak eklediğimiz dosyayı çalıştıracak olursak;

$ python3 modultest.py

Çıktı:

8

Ayrıca modül olarak kullandığımız dosyayı da terminalde çalıştırma konusunda da herhangi bir sıkıntı olmayacaktır. Kontrolümüz, dosya direkt çalıştırılıyorsa fonksiyonları çağırır, aksi takdirde fonksiyonları çalıştırmaz. Böylece performans kaybının ve istenmeyen çıktılar üretilmesinin önüne geçmiş oluruz.