Python - Modüller ve Paketler
🎯 Ders Hedefleri
Bu derste şunları öğreneceksiniz:
- Modül nedir ve nasıl kullanılır
- Import yöntemleri (import, from...import, as)
- Kendi modüllerinizi oluşturma
- Paket (package) yapısı
- Python standart kütüphanesi
- Modül arama yolu (sys.path)
- name ve main kullanımı
- En çok kullanılan standart modüller
📦 Modül Nedir?
Modül, Python kodlarını organize etmek için kullanılan bir dosyadır. Bir .py dosyası aslında bir modüldür. Modüller kod tekrarını önler ve kodunuzu daha düzenli hale getirir.
Modül Avantajları
python
# Modüller şu avantajları sağlar:
# 1. Kod tekrarını önler
# 2. Kodun organizasyonunu sağlar
# 3. Namespace (isim alanı) yönetimi
# 4. Kodun yeniden kullanılabilirliği
# 5. Bakım ve güncelleme kolaylığı
📥 Import Yöntemleri
Temel Import Yöntemleri
python
# 1. Modülün tamamını import etme
import math
print(math.pi) # 3.141592653589793
print(math.sqrt(16)) # 4.0
# 2. Belirli fonksiyonları import etme
from math import pi, sqrt, sin
print(pi) # 3.141592653589793
print(sqrt(25)) # 5.0
print(sin(pi/2)) # 1.0
# 3. Modüle takma ad verme
import math as matematik
print(matematik.pi) # 3.141592653589793
# 4. Fonksiyona takma ad verme
from math import sqrt as karekök
print(karekök(9)) # 3.0
# 5. Tüm içeriği import etme (dikkatli kullanın!)
from math import *
print(pi) # 3.141592653589793
print(cos(0)) # 1.0
# 6. Çoklu import
import os, sys, datetime
from collections import defaultdict, Counter
Import Best Practices
python
# ✅ İyi pratikler
import os
import sys
from collections import Counter
from datetime import datetime
# ❌ Kötü pratikler
from math import * # Namespace kirliliği
import os, sys, datetime # Okunabilirlik sorunu
# ✅ Önerilen import sırası:
# 1. Standart kütüphane modülleri
import os
import sys
import datetime
# 2. Üçüncü parti modüller
# import requests
# import numpy
# 3. Kendi modülleriniz
# import my_module
🛠️ Kendi Modülünüzü Oluşturma
Basit Modül Örneği
python
# matematik_islemleri.py dosyası oluşturun
"""
Matematik işlemleri modülü
Bu modül temel matematik işlemlerini içerir.
"""
# Sabitler
PI = 3.14159
E = 2.71828
# Fonksiyonlar
def toplama(a, b):
"""İki sayıyı toplar"""
return a + b
def cikarma(a, b):
"""İki sayıyı çıkarır"""
return a - b
def carpma(a, b):
"""İki sayıyı çarpar"""
return a * b
def bolme(a, b):
"""İki sayıyı böler"""
if b == 0:
raise ValueError("Sıfıra bölme hatası!")
return a / b
def kare_alma(sayi):
"""Sayının karesini alır"""
return sayi ** 2
def kup_alma(sayi):
"""Sayının küpünü alır"""
return sayi ** 3
def faktoriyel(n):
"""Faktöriyel hesaplama"""
if n < 0:
raise ValueError("Negatif sayıların faktöriyeli hesaplanamaz!")
if n == 0 or n == 1:
return 1
sonuc = 1
for i in range(2, n + 1):
sonuc *= i
return sonuc
def asalmi(sayi):
"""Sayının asal olup olmadığını kontrol eder"""
if sayi < 2:
return False
for i in range(2, int(sayi ** 0.5) + 1):
if sayi % i == 0:
return False
return True
# Test fonksiyonu
def test_fonksiyonlari():
"""Modüldeki fonksiyonları test eder"""
print("=== Matematik İşlemleri Testi ===")
print(f"5 + 3 = {toplama(5, 3)}")
print(f"10 - 4 = {cikarma(10, 4)}")
print(f"6 * 7 = {carpma(6, 7)}")
print(f"15 / 3 = {bolme(15, 3)}")
print(f"4^2 = {kare_alma(4)}")
print(f"3^3 = {kup_alma(3)}")
print(f"5! = {faktoriyel(5)}")
print(f"17 asal mı? {asalmi(17)}")
# Modül bilgileri
__version__ = "1.0.0"
__author__ = "Python Öğrencisi"
if __name__ == "__main__":
# Bu kod sadece modül doğrudan çalıştırıldığında çalışır
test_fonksiyonlari()
Modülü Kullanma
python
# ana_program.py dosyası
import matematik_islemleri
# Modül fonksiyonlarını kullanma
print("=== Matematik İşlemleri ===")
print(f"Toplama: {matematik_islemleri.toplama(10, 5)}")
print(f"Çarpma: {matematik_islemleri.carpma(4, 6)}")
print(f"Faktöriyel: {matematik_islemleri.faktoriyel(6)}")
# Modül sabitlerini kullanma
print(f"PI değeri: {matematik_islemleri.PI}")
# Modül bilgileri
print(f"Modül versiyonu: {matematik_islemleri.__version__}")
print(f"Yazar: {matematik_islemleri.__author__}")
# Belirli fonksiyonları import etme
from matematik_islemleri import asalmi, kare_alma
print(f"25 asal mı? {asalmi(25)}")
print(f"8'in karesi: {kare_alma(8)}")
# Takma ad ile kullanma
import matematik_islemleri as mat
hesap_makinesi = {
'toplam': mat.toplama(100, 50),
'çarpım': mat.carpma(12, 8),
'kare': mat.kare_alma(15)
}
print("Hesap Makinesi Sonuçları:")
for islem, sonuc in hesap_makinesi.items():
print(f"{islem}: {sonuc}")
🔧 name ve main Kullanımı
name Değişkeni
python
# test_modulu.py
print(f"Bu modülün adı: {__name__}")
def selamla():
print("Merhaba!")
def test_et():
print("Test fonksiyonu çalışıyor...")
selamla()
# Bu blok sadece modül doğrudan çalıştırıldığında çalışır
if __name__ == "__main__":
print("Bu modül doğrudan çalıştırılıyor!")
test_et()
else:
print("Bu modül import edildi!")
# Kullanım:
# 1. Doğrudan çalıştırma: python test_modulu.py
# Çıktı: Bu modülün adı: __main__
# Bu modül doğrudan çalıştırılıyor!
# Test fonksiyonu çalışıyor...
# Merhaba!
# 2. Import etme: import test_modulu
# Çıktı: Bu modülün adı: test_modulu
# Bu modül import edildi!
Gelişmiş main Kullanımı
python
# gelismis_modül.py
import sys
import argparse
def ana_fonksiyon():
"""Ana program fonksiyonu"""
print("Ana program çalışıyor...")
def komut_satiri_arayuzu():
"""Komut satırı argümanlarını işler"""
parser = argparse.ArgumentParser(description='Gelişmiş modül örneği')
parser.add_argument('--verbose', '-v', action='store_true',
help='Detaylı çıktı')
parser.add_argument('--dosya', '-f', type=str,
help='İşlenecek dosya adı')
args = parser.parse_args()
if args.verbose:
print("Detaylı mod aktif")
if args.dosya:
print(f"İşlenecek dosya: {args.dosya}")
return args
if __name__ == "__main__":
print("Program başlatılıyor...")
try:
args = komut_satiri_arayuzu()
ana_fonksiyon()
print("Program başarıyla tamamlandı!")
except KeyboardInterrupt:
print("\nProgram kullanıcı tarafından durduruldu.")
sys.exit(1)
except Exception as e:
print(f"Hata oluştu: {e}")
sys.exit(1)
📚 Python Standart Kütüphanesi
Sık Kullanılan Standart Modüller
python
# 1. os - İşletim sistemi arayüzü
import os
print(f"Mevcut dizin: {os.getcwd()}")
print(f"İşletim sistemi: {os.name}")
print(f"Çevre değişkenleri: {os.environ.get('PATH', 'Bulunamadı')}")
# Dizin işlemleri
if not os.path.exists("test_klasor"):
os.mkdir("test_klasor")
print("Test klasörü oluşturuldu")
# 2. sys - Sistem parametreleri ve fonksiyonları
import sys
print(f"Python versiyonu: {sys.version}")
print(f"Platform: {sys.platform}")
print(f"Modül arama yolları: {sys.path[:3]}...") # İlk 3 yol
# 3. datetime - Tarih ve zaman işlemleri
import datetime
simdi = datetime.datetime.now()
print(f"Şu anki zaman: {simdi}")
print(f"Formatlanmış: {simdi.strftime('%d/%m/%Y %H:%M:%S')}")
# Tarih hesaplamaları
yarın = simdi + datetime.timedelta(days=1)
print(f"Yarın: {yarın.strftime('%d/%m/%Y')}")
# 4. random - Rastgele sayı üretimi
import random
print(f"Rastgele sayı (0-1): {random.random()}")
print(f"Rastgele tamsayı (1-100): {random.randint(1, 100)}")
liste = ['elma', 'armut', 'muz', 'çilek']
print(f"Rastgele seçim: {random.choice(liste)}")
# Listeyi karıştır
random.shuffle(liste)
print(f"Karıştırılmış liste: {liste}")
# 5. collections - Özel veri yapıları
from collections import Counter, defaultdict, namedtuple
# Counter - Sayma işlemleri
metin = "merhaba dünya"
harf_sayaci = Counter(metin)
print(f"Harf frekansları: {harf_sayaci}")
# defaultdict - Varsayılan değerli sözlük
sayılar = defaultdict(list)
sayılar['çift'].extend([2, 4, 6, 8])
sayılar['tek'].extend([1, 3, 5, 7])
print(f"Sayılar: {dict(sayılar)}")
# namedtuple - İsimli tuple
Kişi = namedtuple('Kişi', ['ad', 'yaş', 'şehir'])
kişi1 = Kişi('Ali', 25, 'İstanbul')
print(f"Kişi bilgileri: {kişi1.ad}, {kişi1.yaş}, {kişi1.şehir}")
JSON Modülü Detaylı
python
import json
# JSON işlemleri
veri = {
'ad': 'Python Kursu',
'süre': 40,
'konular': ['değişkenler', 'fonksiyonlar', 'modüller'],
'aktif': True,
'fiyat': None
}
# JSON string'e çevirme
json_string = json.dumps(veri, ensure_ascii=False, indent=2)
print("JSON formatı:")
print(json_string)
# JSON string'den Python objesine çevirme
geri_çevrilen = json.loads(json_string)
print(f"\nGeri çevrilen tip: {type(geri_çevrilen)}")
print(f"Kurs adı: {geri_çevrilen['ad']}")
# Dosyaya JSON yazma
with open('kurs_bilgileri.json', 'w', encoding='utf-8') as dosya:
json.dump(veri, dosya, ensure_ascii=False, indent=2)
# Dosyadan JSON okuma
with open('kurs_bilgileri.json', 'r', encoding='utf-8') as dosya:
okunan_veri = json.load(dosya)
print(f"Dosyadan okunan: {okunan_veri}")
Re Modülü (Regular Expressions)
python
import re
# Temel regex işlemleri
metin = "Telefon: 0532-123-4567, Email: test@example.com"
# Telefon numarası bulma
telefon_pattern = r'\d{4}-\d{3}-\d{4}'
telefon = re.search(telefon_pattern, metin)
if telefon:
print(f"Bulunan telefon: {telefon.group()}")
# Email bulma
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
email = re.search(email_pattern, metin)
if email:
print(f"Bulunan email: {email.group()}")
# Tüm sayıları bulma
sayılar = re.findall(r'\d+', metin)
print(f"Bulunan sayılar: {sayılar}")
# Metin değiştirme
yeni_metin = re.sub(r'\d{4}-\d{3}-\d{4}', '***-***-****', metin)
print(f"Gizlenmiş telefon: {yeni_metin}")
🔍 Modül Arama Yolu
sys.path Yönetimi
python
import sys
import os
def modul_arama_yollarini_goster():
"""Modül arama yollarını gösterir"""
print("Python modül arama yolları:")
for i, yol in enumerate(sys.path, 1):
print(f"{i}. {yol}")
def yeni_yol_ekle(yol):
"""Yeni modül arama yolu ekler"""
if yol not in sys.path:
sys.path.append(yol)
print(f"Yeni yol eklendi: {yol}")
else:
print("Bu yol zaten mevcut!")
def yol_kaldir(yol):
"""Modül arama yolundan bir yolu kaldırır"""
if yol in sys.path:
sys.path.remove(yol)
print(f"Yol kaldırıldı: {yol}")
else:
print("Bu yol mevcut değil!")
# Kullanım
print("=== Modül Arama Yolu Yönetimi ===")
modul_arama_yollarini_goster()
# Yeni yol ekleme (örnek)
yeni_klasor = os.path.join(os.getcwd(), "my_modules")
if os.path.exists(yeni_klasor):
yeni_yol_ekle(yeni_klasor)
Modül Yeniden Yükleme
python
import importlib
# Modül yeniden yükleme (geliştirme sırasında kullanışlı)
def modul_yeniden_yukle(modul_adi):
"""Bir modülü yeniden yükler"""
try:
if modul_adi in sys.modules:
importlib.reload(sys.modules[modul_adi])
print(f"{modul_adi} modülü yeniden yüklendi")
else:
print(f"{modul_adi} modülü henüz yüklenmemiş")
except Exception as e:
print(f"Yeniden yükleme hatası: {e}")
# Örnek kullanım
import matematik_islemleri
modul_yeniden_yukle('matematik_islemleri')
✅ Özet ve Kontrol Listesi
Öğrendikleriniz
- [x] Modül kavramı ve kullanımı
- [x] Import yöntemleri (import, from...import, as)
- [x] Kendi modüllerinizi oluşturma
- [x] Paket (package) yapısı ve init.py
- [x] name ve main kullanımı
- [x] Python standart kütüphanesi
- [x] Modül arama yolu (sys.path)
- [x] Best practices ve optimizasyon
- [x] Pratik örnek: Araç yönetim sistemi
Sırada Ne Var?
- Web scraping ve HTTP istekleri
- API geliştirme ve tüketme
- Veritabanı işlemleri
- GUI programlama
- Test yazma ve debugging
Pratik Yapın!
Modülleri pekiştirmek için:
- Kendi matematik modülünüzü oluşturun
- Bir paket yapısı kurun
- Standart kütüphane modüllerini keşfedin
- Import performansını test edin
- Gerçek bir proje için modül yapısı tasarlayın
Key Takeaways
- Modüller kodunuzu organize eder ve yeniden kullanılabilir kılar
- Import yöntemlerini doğru kullanmak namespace kirliliğini önler
- name == "main" ile test kodlarınızı ayrıştırın
- Paket yapısı büyük projelerde çok önemlidir
- Standart kütüphane çok güçlüdür, önce onu keşfedin
🎯 Sonraki ders: Web Scraping ve HTTP İstekleri