Modüller ve Paketler
Bölüm 5: Modüller ve Paketler - Python’un Hazineleri
Modüller, Python’da kodun tekrar kullanılabilirliğini ve organizasyonunu artırmak için kullanılan güçlü araçlardır. Bir modül, fonksiyonlar, sınıflar ve değişkenler gibi Python kodlarını içeren bir dosyadır. Paketler ise, birden fazla modülü bir araya getiren dizinlerdir. Bu bölümde, modülleri ve paketleri nasıl kullanacağımızı, Python’un bazı popüler modüllerini ve paket yönetimini öğreneceğiz.
5.1 Modül Nedir? Neden Kullanılır?
Modüller, Python kodunuzu düzenlemenize ve tekrar kullanılabilir hale getirmenize yardımcı olur. Aynı kodu farklı projelerde tekrar tekrar yazmak yerine, bir modülde bir kez tanımlayabilir ve istediğiniz kadar projede kullanabilirsiniz.
Modül kullanmanın bazı avantajları:
- Kodun organize edilmesi: Modüller, kodunuzu mantıklı parçalara ayırmanıza olanak tanır, böylece daha okunaklı ve anlaşılır hale gelir.
- Kod tekrarı: Bir modüldeki fonksiyonları ve sınıfları farklı programlarda tekrar tekrar kullanabilirsiniz, bu da zamandan ve emekten tasarruf sağlar.
- Ad çakışmalarını önleme: Farklı modüllerde aynı ada sahip fonksiyonlar veya sınıflar tanımlayabilirsiniz, çünkü modüller kendi ad alanlarını oluşturur.
5.2 Modülleri İçe Aktarma (Import)
Bir modülü kullanmak için öncelikle onu import
anahtar kelimesiyle içe aktarmanız gerekir. İçe aktarma işlemi için üç farklı yöntem kullanabilirsiniz.
5.2.1 Temel İçe Aktarma
import math
print(math.pi) # Çıktı: 3.141592653589793
Bu yöntemle, modüldeki tüm fonksiyonlar, sınıflar ve değişkenler kullanılabilir hale gelir. Ancak, bunlara erişmek için modul_adi.nitelik
şeklinde modül adını kullanmanız gerekir.
5.2.2 Belirli Bir Fonksiyonu veya Değişkeni İçe Aktarma
from math import pi
print(pi) # Çıktı: 3.141592653589793
from math import sqrt
print(sqrt(25)) # Çıktı: 5.0
Bu yöntemle, sadece istediğiniz fonksiyon veya değişkenleri içe aktarırsınız. Bu, gereksiz yere tüm modülü belleğe yüklemekten kaçınmanızı sağlar.
5.2.3 Bir Modülü Takma Adla İçe Aktarma
import math as m
print(m.pi) # Çıktı: 3.141592653589793
Bu yöntemle, modüle bir takma ad verirsiniz ve bu takma ad ile modüldeki niteliklere erişebilirsiniz. Bu, özellikle uzun modül adlarıyla çalışırken kodun okunabilirliğini artırır.
5.3 Popüler Python Modülleri
Python’da birçok yerleşik modül bulunur. Bu modüller, çeşitli görevler için hazır fonksiyonlar ve sınıflar sağlar.
5.3.1 math
Modülü: Matematiksel İşlemler
math
modülü, matematiksel fonksiyonlar ve sabitler içerir.
import math
print(math.sin(math.pi / 2)) # Çıktı: 1.0 -> sin(90)
print(math.sqrt(25)) # Çıktı: 5.0 -> 25'in karekökü
print(math.log10(100)) # Çıktı: 2.0 -> 100'ün 10 tabanında logaritması
print(math.pow(2, 3)) # Çıktı: 8.0 -> 2 üzeri 3
5.3.2 random
Modülü: Rastgele Sayı Üretimi
random
modülü, rastgele sayılar üretmek için kullanılır.
import random
print(random.random()) # Çıktı: 0.725238067631986 (0 ile 1 arasında rastgele bir ondalık sayı)
print(random.randint(1, 10)) # Çıktı: 5 (1 ile 10 arasında (1 ve 10 dahil) rastgele bir tam sayı)
random.choice(dizi)
: Verilen diziden (liste, demet, string vb.) rastgele bir eleman seçer.
import random
= ["elma", "armut", "muz"]
liste print(random.choice(liste)) # Çıktı: armut (Rastgele bir meyve)
= "Merhaba"
metin print(random.choice(metin)) # Çıktı: a (rastgele harf)
random.shuffle(dizi)
: Verilen diziyi (liste) yerinde rastgele karıştırır.
import random
= [1, 2, 3, 4, 5]
liste
random.shuffle(liste)print(liste) # Çıktı: [3, 2, 5, 1, 4] (Rastgele karıştırılmış liste)
random.seed(değer)
: Rastgele sayı üretecini başlatmak için kullanılır. Aynı seed değeri ile başlatılan rastgele sayı üreteci, her zaman aynı sayı dizisini üretir. Eğerseed()
fonksiyonuna bir değer verilmezse, rastgele sayı üreteci işletim sisteminden aldığı rastgele bir değerle başlatılır.
import random
42) # seed değerini 42 olarak ayarlar
random.seed(print(random.random()) # Çıktı: 0.639426...
42) # seed değerini tekrar 42 olarak ayarlar
random.seed(print(random.random()) # Çıktı: 0.639426... (aynı çıktı)
10)
random.seed(print(random.choice(liste)) # Çıktı: elma
10)
random.seed(print(random.choice(liste)) # Çıktı: elma (aynı çıktı)
5.3.3 datetime
Modülü: Tarih ve Saat İşlemleri
- Tarih ve saatlerle çalışmak için kullanılır.
import datetime
= datetime.date.today()
bugun print(bugun) # Çıktı: 2024-04-03 (Bugünün tarihi)
= datetime.datetime.now()
su_an print(su_an) # Çıktı: 2024-04-03 18:15:30.123456 (Şu anki tarih ve saat)
= datetime.date(1990, 1, 1)
dogum_gunu print(dogum_gunu) # Çıktı: 1990-01-01
# Tarih formatlama
= bugun.strftime("%d/%m/%Y") # 03/04/2024
tarih_str print(tarih_str)
= su_an.strftime("%H:%M:%S") # 18:15:30
zaman_str print(zaman_str)
5.3.4 os
Modülü: Dosya ve Dizin İşlemleri
- İşletim sistemiyle etkileşim kurmamızı sağlayan fonksiyonlar içerir.
import os
print(os.getcwd()) # Çıktı: /home/kullanici/proje (Geçerli çalışma dizini)
"/home/kullanici/Belgeler") # Geçerli dizini değiştirir.
os.chdir(print(os.getcwd()) # Çıktı: /home/kullanici/Belgeler
print(os.listdir(".")) # Çıktı: ['dosya1.txt', 'dosya2.txt', 'dizin1'] (Geçerli dizindeki dosya ve dizinler)
"yeni_dizin") # yeni_dizin adında bir dizin oluşturur
os.mkdir("eski.txt", "yeni.txt") # Dosya adını değiştirir
os.rename(
print(os.path.exists("dosya.txt")) # Çıktı: True (Dosya varsa) / False
print(os.path.isfile("dosya.txt")) # Çıktı: True (Dosya ise) / False
print(os.path.isdir("dizin")) # Çıktı: True (Dizin ise) / False
print(os.path.getsize("dosya.txt")) # Çıktı: 1024 (Dosya boyutu, bayt cinsinden)
"yeni.txt") # yeni.txt adlı dosyayı siler.
os.remove(# os.rmdir("klasör_adi") # Belirtilen klasörü siler
# os.makedirs("dizin1/dizin2") # Birden fazla iç içe klasör oluşturur.
5.3.5 Ortam Değişkenlerine Erişme
os
modülü, ortam değişkenlerine erişmek için de kullanılabilir.os.environ
: Ortam değişkenlerini içeren bir sözlük.os.getenv(isim, varsayılan_değer)
: Belirtilen isimdeki ortam değişkeninin değerini döndürür. Değişken yoksa,varsayılan_değer
’i döndürür.
import os
# Tüm ortam değişkenlerini yazdır
print(os.environ)
# USER ortam değişkeninin değerini al
= os.getenv("USER") # Linux/macOS için
kullanici_adi #kullanici_adi = os.getenv("USERNAME") # Windows için
print(f"Kullanıcı adı: {kullanici_adi}")
# TEMP ortam değişkeninin değerini al, yoksa varsayılan değeri kullan
= os.getenv("TEMP", "/tmp")
temp_dizin print(f"Geçici dizin: {temp_dizin}")
5.4 Her Python Dosyası Bir Modüldür!
- Kendi Python dosyalarınızı oluşturarak modül olarak kullanabilirsiniz.
- Modül dosyanızın adı,
modul_adi.py
gibi olmalıdır. - Modülünüzü
import modul_adi
şeklinde içe aktarabilirsiniz.
Örnek:
modul_ornegi.py
dosyasına aşağıdaki kodları yazın:
def selamla(isim):
print(f"Merhaba, {isim}!")
def topla(a, b):
return a + b
Başka bir Python dosyasında (örneğin, ana_program.py
) bu modülü içe aktarın ve fonksiyonları kullanın:
import modul_ornegi
"Ali") # Çıktı: Merhaba, Ali!
modul_ornegi.selamla(= modul_ornegi.topla(5, 3)
sonuc print(sonuc) # Çıktı: 8
5.5 __name__
Değişkeni ve Önemi
- Her Python dosyasının özel bir
__name__
değişkeni vardır. - Dosya doğrudan çalıştırılırsa,
__name__
değişkeninin değeri"__main__"
olur. - Dosya bir modül olarak içe aktarılırsa,
__name__
değişkeninin değeri modülün adı olur.
Bu özellik, test kodlarını sadece modül doğrudan çalıştırıldığında çalıştırmak, modül içe aktarıldığında ise çalıştırılmamasını sağlamak için kullanılabilir.
Örnek:
# dosya_adi.py
def fonksiyon():
print("Fonksiyon çalıştı.")
if __name__ == "__main__":
print("Dosya doğrudan çalıştırıldı.")
fonksiyon()
Çıktı (Doğrudan çalıştırıldığında):
Dosya doğrudan çalıştırıldı.
Fonksiyon çalıştı.
Başka bir dosyadan içe aktarıldığında:
import dosya_adi
print(dosya_adi.__name__) # Çıktı: dosya_adi
5.6 Modülleri Keşfetmek: dir()
Fonksiyonu
- Bir nesnenin (modül, sınıf vb.) sahip olduğu tüm nitelikleri (attributes) ve metotları listeler.
import math
print(dir(math)) # math modülündeki tüm nitelikleri ve metotları listeler. Örnek çıktı: ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
= [1, 2, 3]
liste print(dir(liste)) # liste nesnesinin tüm niteliklerini ve metotlarını listeler. Örnek çıktı: ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
5.7 Paketler (Packages)
Paketler, birlikte kullanılan birden fazla modülü bir arada tutan dizinlerdir. Paketler, kodun daha da organize edilmesini sağlar. Bir paketin içinde, başka paketler ve modüller de bulunabilir.
Örnek Senaryo
Bir oyun geliştirdiğinizi düşünün. Oyununuzun grafikleri, sesleri, oynanışı ve yapay zekası için farklı modüller kullanabilirsiniz. Bu modülleri bir oyun
paketi altında toplayabilirsiniz. oyun
paketi içinde, grafik
, ses
, oynanis
ve yapay_zeka
gibi alt paketler olabilir.
5.7.1 Paket Oluşturma
- Bir dizin oluşturun ve içine
__init__.py
adında (boş da olabilir) bir dosya koyun. - Bu dizin artık bir paket olarak kabul edilir.
- Pakete modüller eklemek için,
.py
uzantılı dosyaları bu dizine ekleyin.
Örnek Paket Yapısı:
geometri/
├── __init__.py
├── daire.py
└── dikdortgen.py
# geometri/daire.py
def alan(yaricap):
# ... Dairenin alanını hesaplayan kodlar ...
# geometri/dikdortgen.py
def alan(kisa_kenar, uzun_kenar):
# ... Dikdörtgenin alanını hesaplayan kodlar ...
# ana_program.py
from geometri import daire
= daire.alan(5)
daire_alani
# veya
from geometri.dikdortgen import alan as dikdortgen_alanı
= dikdortgen_alanı(4, 6)
dikdortgen
# veya
import geometri.daire
= geometri.daire.alan(5) daire_alani
5.8 Paket Yönetimi: pip
pip
, Python paketlerini yüklemek, yönetmek ve kaldırmak için kullanılan bir araçtır.
pip install requests
pip uninstall requests
pip list # Kurulu paketleri listeler
pip show requests # request paketinin bilgilerini gösterir.
pip freeze > requirements.txt # Projenin bağımlılıklarını dosyaya kaydeder
5.8.1 Requirements.txt kullanımı
- Bir projede kullanılması gerekli paketlerin listesini
requirements.txt
dosyasına kaydedin. - Bu dosyayı kullanarak, proje bağımlılıklarınızı kolayca yönetebilir ve farklı ortamlarda aynı paketleri kurabilirsiniz.
pip install -r requirements.txt
requirements.txt örneği:
Django==3.2.9
requests==2.26.0
numpy>=1.21.0
Flask>=2.0,<3.0
pandas==1.3.3
gunicorn==20.1.0
5.9 Sanal Ortamlar (Virtual Environments)
- Farklı projeler için izole Python ortamları oluşturmamızı sağlar.
- Paket çakışmalarını önler.
Senaryo:
Diyelim ki iki farklı web projesi üzerinde çalışıyorsunuz: Proje A ve Proje B. Proje A, Django 2.2 sürümünü kullanırken, Proje B, Django 3.1 sürümünü kullanıyor. Her iki projeyi aynı anda geliştirmek istiyorsanız ve sisteminizde tek bir Python sürümü varsa, iki farklı sanal ortam oluşturmanız gerekir. Böylece her proje, kendi bağımlılıklarına (kütüphane sürümleri) sahip olur ve birbirini etkilemez.
Oluşturma:
python3 -m venv .venv # .venv adında bir sanal ortam oluşturur
Aktifleştirme:
- Linux/macOS:
source .venv/bin/activate
- Windows:
.venv\Scripts\activate
Devre Dışı Bırakma:
deactivate
5.10 requests
Kütüphanesi
- HTTP istekleri göndermek için kullanılan popüler bir kütüphanedir. Web sitelerinden veri almak veya web servisleriyle etkileşim kurmak için kullanılır.
Kurulum:
pip install requests
Örnek:
import requests
= requests.get("https://www.example.com")
response print(response.status_code) # Çıktı: 200 (Başarılı istek)
print(response.text) # Çıktının uzunluğuna göre değişir. Web sitesinin kaynak kodunu döndürür.
= requests.get("https://jsonplaceholder.typicode.com/todos/1")
response print(response.json()) # {'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False}