Python Modüller ve import

Python modüllerinin ne olduğunu ve import anahtar kelimesi ile nasıl kullanıldığını öğrenin.

Harika bir soru! Python modülleri, kodunuzu organize etmenin, yeniden kullanmanın ve yönetmenin temel yollarından biridir. Hadi adım adım inceleyelim. --- ### Python Modülleri Nedir? Basitçe söylemek gerekirse, bir **Python modülü**, Python kodu içeren bir dosyadır. Bu dosya, fonksiyonlar, sınıflar, değişkenler ve çalıştırılabilir kod parçacıkları içerebilir. Bir modülün dosya adı her zaman `.py` uzantısıyla biter. **Neden Modüller Kullanırız?** 1. **Kod Düzenleme (Organization):** Büyük projelerde tüm kodu tek bir dosyaya yazmak karmaşık ve yönetilemez hale gelir. Modüller, kodunuzu mantıksal olarak bölmenizi sağlar (örneğin, bir modül veritabanı işlemleri için, diğeri kullanıcı arayüzü için olabilir). 2. **Yeniden Kullanım (Reusability):** Bir modülde yazdığınız fonksiyonları veya sınıfları, başka bir Python dosyasında kolayca tekrar kullanabilirsiniz. Bu, aynı kodu tekrar tekrar yazma ihtiyacını ortadan kaldırır. 3. **İsim Alanı Yönetimi (Namespace Management):** Modüller, farklı modüller arasında isim çakışmalarını önlemeye yardımcı olur. Her modül kendi isim alanına sahiptir. 4. **Bakım Kolaylığı (Maintainability):** Kod parçalara ayrıldığı için hataları bulmak ve düzeltmek daha kolaydır. --- ### Python Modülleri Nasıl Kullanılır? Bir modülü kullanmanın temel yolu `import` ifadesidir. #### 1. Modülü İçeri Aktarma (`import module_name`) Bu en yaygın ve önerilen yöntemdir. Belirli bir modüldeki öğelere erişmek için modül adını önek olarak kullanırsınız. **Örnek:** `math` modülü, matematiksel işlemler ve sabitler içerir. ```python # math_kullanimi.py import math # math modülündeki pi sabitine erişim print(f"Pi değeri: {math.pi}") # math modülündeki sqrt (kare kök) fonksiyonuna erişim sayi = 16 print(f"{sayi} sayısının karekökü: {math.sqrt(sayi)}") # math modülündeki floor (aşağı yuvarlama) fonksiyonuna erişim ondalikli_sayi = 4.7 print(f"{ondalikli_sayi} sayısının aşağı yuvarlanmış hali: {math.floor(ondalikli_sayi)}") ``` **Çalıştırma Şekli:** `python math_kullanimi.py` **Çıktı:** ``` Pi değeri: 3.141592653589793 16 sayısının karekökü: 4.0 4.7 sayısının aşağı yuvarlanmış hali: 4 ``` #### 2. Modülü Farklı Bir İsimle İçeri Aktarma (`import module_name as alias`) Modül adları uzun veya başka bir modülün adıyla çakışma riski varsa, ona bir takma ad (alias) verebilirsiniz. Bu, özellikle veri bilimi kütüphanelerinde (örneğin `import numpy as np`) sıkça kullanılır. **Örnek:** ```python # math_alias_kullanimi.py import math as m print(f"Pi değeri (alias ile): {m.pi}") print(f"25 sayısının karekökü (alias ile): {m.sqrt(25)}") ``` #### 3. Modülden Belirli Öğeleri İçeri Aktarma (`from module_name import item1, item2`) Sadece bir modülün belirli fonksiyonlarına, sınıflarına veya değişkenlerine ihtiyacınız varsa, bunları doğrudan içeri aktarabilirsiniz. Bu durumda, bu öğelere erişirken modül adını önek olarak kullanmanıza gerek kalmaz. **Örnek:** ```python # belirli_ogeler_kullanimi.py from math import pi, sqrt, floor print(f"Pi değeri (doğrudan): {pi}") print(f"49 sayısının karekökü (doğrudan): {sqrt(49)}") print(f"8.9 sayısının aşağı yuvarlanmış hali (doğrudan): {floor(8.9)}") ``` **Dikkat:** Bu yöntem, kullandığınız öğe adının kendi kodunuzdaki başka bir adla çakışma olasılığını artırabilir. Genellikle `import module_name` kullanmak daha güvenli kabul edilir. #### 4. Modüldeki Tüm Öğeleri İçeri Aktarma (`from module_name import *`) Bu yöntem, bir modüldeki *tüm* fonksiyonları, sınıfları ve değişkenleri doğrudan içeri aktarır. **Örnek:** ```python # tum_ogeler_kullanimi.py from math import * # DİKKAT: Genellikle önerilmez! print(f"Pi değeri (hepsi): {pi}") print(f"100 sayısının karekökü (hepsi): {sqrt(100)}") ``` **UYARI:** `from module_name import *` kullanmaktan **genellikle kaçınılmalıdır**. Neden mi? * **İsim Çakışmaları:** Hangi öğelerin içeri aktarıldığını anlamak zorlaşır ve kendi kodunuzdaki veya başka modüllerden gelen isimlerle çakışmalara yol açabilir. Bu da beklenmedik davranışlara ve hata ayıklamanın zorlaşmasına neden olur. * **Kod Okunabilirliği:** Bir fonksiyonun nereden geldiğini anlamak için kodu incelemeniz gerekir, çünkü bir önek yoktur. * **Performans:** Teorik olarak performansı etkileyebilir, ancak asıl sorun okunabilirlik ve çakışmalardır. --- ### Kendi Modülünüzü Oluşturma ve Kullanma Şimdi kendi modülümüzü oluşturalım. **Adım 1: Bir Modül Dosyası Oluşturun (`my_calculator.py`)** Bu dosyayı `my_calculator.py` olarak kaydedin: ```python # my_calculator.py PI_VALUE = 3.14159 def add(a, b): """İki sayıyı toplar.""" return a + b def subtract(a, b): """İki sayıyı çıkarır.""" return a - b def multiply(a, b): """İki sayıyı çarpar.""" return a * b def divide(a, b): """İki sayıyı böler. Sıfıra bölme hatasını ele alır.""" if b == 0: raise ValueError("Sıfıra bölme hatası!") return a / b # Bu blok, modül doğrudan çalıştırıldığında (import edildiğinde değil) çalışır. if __name__ == "__main__": print("Hesap makinesi modülü doğrudan çalıştırıldı.") print(f"PI_VALUE: {PI_VALUE}") print(f"2 + 3 = {add(2, 3)}") print(f"10 - 4 = {subtract(10, 4)}") print(f"5 * 6 = {multiply(5, 6)}") print(f"10 / 2 = {divide(10, 2)}") try: divide(5, 0) except ValueError as e: print(f"Hata yakalandı: {e}") ``` **Adım 2: Modülü Kullanacak Başka Bir Dosya Oluşturun (`main.py`)** Bu dosyayı `my_calculator.py` ile aynı dizine `main.py` olarak kaydedin: ```python # main.py # Kendi modülümüzü import ediyoruz import my_calculator print("--- my_calculator modülünü kullanarak ---") print(f"Pi değerimiz: {my_calculator.PI_VALUE}") print(f"15 + 7 = {my_calculator.add(15, 7)}") print(f"20 - 8 = {my_calculator.subtract(20, 8)}") print(f"4 * 9 = {my_calculator.multiply(4, 9)}") print(f"100 / 5 = {my_calculator.divide(100, 5)}") print("\n--- my_calculator modülünden belirli öğeleri kullanarak ---") from my_calculator import add, subtract, PI_VALUE print(f"Pi değeri (doğrudan): {PI_VALUE}") print(f"50 + 25 = {add(50, 25)}") print(f"30 - 12 = {subtract(30, 12)}") # Hata durumu denemesi try: my_calculator.divide(7, 0) except ValueError as e: print(f"\nHata yakalandı: {e}") ``` **Çalıştırma Şekli:** `my_calculator.py` dosyasını doğrudan çalıştırırsanız (`python my_calculator.py`), içindeki `if __name__ == "__main__":` bloğu çalışır. `main.py` dosyasını çalıştırırsanız (`python main.py`), `my_calculator` modülü içeri aktarılır ve `if __name__ == "__main__":` bloğu *çalışmaz*. **Çıktı (`main.py` için):** ``` --- my_calculator modülünü kullanarak --- Pi değerimiz: 3.14159 15 + 7 = 22 20 - 8 = 12 4 * 9 = 36 100 / 5 = 20.0 --- my_calculator modülünden belirli öğeleri kullanarak --- Pi değeri (doğrudan): 3.14159 50 + 25 = 75 30 - 12 = 18 Hata yakalandı: Sıfıra bölme hatası! ``` --- ### Modüller Nasıl Bulunur? (sys.path) Python, bir modülü `import` etmeye çalıştığınızda belirli bir sıraya göre dizinlerde arama yapar: 1. **Geçerli Dizin:** İlk olarak, `import` edilen dosyanın kendisinin bulunduğu dizine bakar. 2. **PYTHONPATH:** Bir ortam değişkeni olarak belirlenmiş `PYTHONPATH` dizinlerine bakar. 3. **Standart Kütüphane Dizinleri:** Python'ın kurulu olduğu dizinlerdeki standart kütüphane modüllerini arar. 4. **Site-Packages:** Üçüncü taraf kütüphanelerinin (pip ile yüklenenler gibi) bulunduğu `site-packages` dizinlerine bakar. Bu arama yolunu `sys` modülünü kullanarak görebilirsiniz: ```python import sys print(sys.path) ``` Bu, modüllerin nasıl çalıştığını ve kodunuzu daha iyi organize etmek için nasıl kullanabileceğinizi anlamanıza yardımcı olacaktır.
Son Paylaşımlar
Kategoriler