Nesne Tabanlı Programlama

9 - Modüller ve Paketler

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2024

Modül

  • Python’da modüller, tekrar kullanılabilir kodlar içeren dosyalardır.
  • Bir modül, fonksiyonlar, sınıflar, değişkenler ve hatta çalıştırılabilir kodlar içerebilir.
  • Modüller, kodun organize edilmesini, tekrar kullanılabilirliğini artırılmasını ve programların daha yönetilebilir hale getirilmesini sağlar.

Modülleri İçe Aktarma (Import)

  • Python’da bir modülü kullanmak için, önce o modülü içe aktarmamız gerekir.

Temel İçe Aktarma

  • Modüldeki tüm fonksiyonlar, sınıflar ve değişkenler kullanılabilir hale gelir.
import math

print(math.pi)  # Çıktı: 3.141592653589793

Belirli Bir Fonksiyonu veya Değişkeni İçe Aktarma

  • Sadece belirtilen fonksiyon veya değişken kullanılabilir hale gelir.
from math import pi

print(pi)  # Çıktı: 3.141592653589793

from math import sqrt

print(sqrt(25))  # Çıktı: 5.0

Soru

Sizce bu kullanım şeklinin nasıl bir avantajı olabilir?

Bir Modülü Takma Adla İçe Aktarma

  • Modüle verilen takma ad ile erişebiliriz.
import math as m

print(m.pi)  # Çıktı: 3.141592653589793

Popüler Python Modülleri

math Modülü: Matematiksel İşlemler

  • 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

random Modülü: Rastgele Sayı Üretimi

  • 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

liste = ["elma", "armut", "muz"]
print(random.choice(liste))  # Çıktı: armut (Rastgele bir meyve)

metin = "Merhaba"
print(random.choice(metin)) # Çıktı: a (rastgele harf)
  • random.shuffle(dizi): Verilen diziyi (liste) yerinde rastgele karıştırır.
import random

liste = [1, 2, 3, 4, 5]
random.shuffle(liste)
print(liste)  # Çıktı: [3, 2, 5, 1, 4] (Rastgele karıştırılmış liste)

random modülündeki seed() fonksiyonu

  • seed() fonksiyonu, 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ğer seed() fonksiyonuna bir değer verilmezse, rastgele sayı üreteci işletim sisteminden aldığı rastgele bir değerle başlatılır.
import random

random.seed(42) # seed değerini 42 olarak ayarlar
print(random.random()) # Çıktı: 0.639426...

random.seed(42) # seed değerini tekrar 42 olarak ayarlar
print(random.random()) # Çıktı: 0.639426... (aynı çıktı)
import random
liste = ["Ali", "Veli", 49, "Ahmet", 57, 9, True]

random.seed(10) # seed değerini 10 olarak ayarlar.
print(random.choice(liste)) # Ali
random.seed(10) # seed değerini tekrar 10 olarak ayarlar.
print(random.choice(liste)) # Ali

random.seed(20)
print(random.choice(liste)) # 9
random.seed(25)
print(random.choice(liste)) # Ahmet

datetime Modülü: Tarih ve Saat İşlemleri

  • Tarih ve saatlerle çalışmak için kullanılır.
import datetime

bugun = datetime.date.today()
print(bugun)                    # Çıktı: 2024-04-03 (Bugünün tarihi)

su_an = datetime.datetime.now()
print(su_an)                  # Çıktı: 2024-04-03 18:15:30.123456 (Şu anki tarih ve saat)

dogum_gunu = datetime.date(1990, 1, 1)
print(dogum_gunu)                  # Çıktı: 1990-01-01

# Tarih formatlama
tarih_str = bugun.strftime("%d/%m/%Y") # 03/04/2024
print(tarih_str)

zaman_str = su_an.strftime("%H:%M:%S") # 18:15:30
print(zaman_str)

os Modülü: İşletim Sistemi İş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)

os.chdir("/home/kullanici/Belgeler") # Geçerli dizini değiştirir.
print(os.getcwd())      # Çıktı: /home/kullanici/Belgeler

print(os.listdir("."))  # Çıktı: ['dosya1.txt', 'dosya2.txt', 'dizin1'] (Geçerli dizindeki dosya ve dizinler)
os.mkdir("yeni_dizin")  # yeni_dizin adında bir dizin oluşturur
os.rename("eski.txt", "yeni.txt")  # Dosya adını değiştirir

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)
os.remove("yeni.txt") # yeni.txt adlı dosyayı siler.
# os.rmdir("klasör_adi") # Belirtilen klasörü siler
# os.makedirs("dizin1/dizin2") # Birden fazla iç içe klasör oluşturur.

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.

Örnek

import os

# Tüm ortam değişkenlerini yazdır
print(os.environ)

# USER ortam değişkeninin değerini al
kullanici_adi = os.getenv("USER") # Linux/macOS için
#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
temp_dizin = os.getenv("TEMP", "/tmp")
print(f"Geçici dizin: {temp_dizin}")

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.

Modül Örneği

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

Modülü Kullanma

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

modul_ornegi.selamla("Ali") # Çıktı: Merhaba, Ali!
sonuc = modul_ornegi.topla(5, 3)
print(sonuc) # Çıktı: 8

__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 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()
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__)
dosya_adi

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']
liste = [1, 2, 3]
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']

Paketler (Packages)

  • Birlikte kullanılan birden fazla modülü bir arada tutan dizinler.
  • 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.

Paket oluşturma

  • Bir dizin oluşturun ve içine __init__.py adında boş 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

Örnek paket yapısı

# geometri/daire.py
def alan(yaricap):
  # ...
# geometri/dikdortgen.py
def alan(kisa_kenar, uzun_kenar):
  # ...
# ana program (main.py)
from geometri import daire

daire_alani = daire.alan(5)
# veya
import geometri.daire

daire_alani = daire.alan(5)

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

Requirements.txt kullanımı

  • Bir projede kullanılması gerekli paketlerin bir listesini requirements.txt dosyasına yazıp, bu dosyayı kullanarak paketleri topluca 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

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.

Sanal Ortam Oluşturma ve Aktifleştirme

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

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

requests Kütüphanesi Kullanımı

import requests

response = requests.get("https://www.example.com")
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.

response = requests.get("https://jsonplaceholder.typicode.com/todos/1")
print(response.json()) # {'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False}

Özet

  • Bu derste, Python’da modülleri ve paketleri nasıl kullanacağımızı öğrendik.
  • Modülleri içe aktarmayı, Python’un bazı popüler modüllerini (math, random, datetime, os), paketleri, her Python dosyasının bir modül olarak kullanılabileceğini, __name__ değişkenini, paket yönetimini (pip), sanal ortamları, requests kütüphanesini ve dir() fonksiyonunu inceledik.

Gelecek Hafta

Dosya işlemleri