![]() |
Python Dersleri: 0’dan İleri Seviyeye Kadar Python Eğitimi |
1. Giriş: Python Nedir ve Neden Öğrenmelisiniz?
Python, Guido van Rossum tarafından 1991 yılında geliştirilen, açık kaynaklı, yüksek seviyeli ve çok amaçlı bir programlama dilidir. Basit sözdizimi ve geniş kütüphane desteği sayesinde, hem yeni başlayanlar hem de profesyonel geliştiriciler tarafından tercih edilmektedir.
1.1 Python’un Avantajları
-
Kolay Okunabilirlik: Python’un sözdizimi, İngilizce’ye yakın olduğu için kodlar daha okunabilir ve anlaşılırdır.
-
Geniş Kütüphane Desteği: Veri analizi, yapay zeka, web geliştirme gibi birçok alanda kullanılabilecek zengin kütüphanelere sahiptir.
-
Topluluk Desteği: Geniş ve aktif bir kullanıcı topluluğu sayesinde, karşılaşılan sorunlara hızlı çözümler bulunabilir.
1.2 Python Nerelerde Kullanılır?
-
Web Geliştirme: Django, Flask gibi framework’ler ile dinamik web uygulamaları geliştirilebilir.
-
Veri Analizi: Pandas, NumPy gibi kütüphaneler ile büyük veri setleri analiz edilebilir.
-
Makine Öğrenmesi: Scikit-learn, TensorFlow gibi araçlarla yapay zeka uygulamaları geliştirilebilir.
-
Otomasyon: Günlük görevlerin otomatikleştirilmesi için script’ler yazılabilir.
2. Python Kurulumu ve Geliştirme Ortamı
Python ile çalışmaya başlamadan önce, uygun bir geliştirme ortamı kurulmalıdır.
2.1 Python Kurulumu
Python’un en son sürümünü resmi web sitesinden indirerek kurabilirsiniz. Kurulum sırasında “Add Python to PATH” seçeneğini işaretlemeyi unutmayın.
2.2 Geliştirme Ortamları
-
IDLE: Python ile birlikte gelen basit bir geliştirme ortamıdır.
-
PyCharm: JetBrains tarafından geliştirilen, profesyonel bir IDE’dir.
-
Visual Studio Code: Microsoft’un geliştirdiği, hafif ve eklenti desteği güçlü bir editördür.
3. Temel Python Sözdizimi
Python’un temel sözdizimini öğrenmek, programlamaya sağlam bir başlangıç yapmanızı sağlar.
3.1 Değişkenler ve Veri Tipleri
Python’da değişkenler, değerleri saklamak için kullanılır. Veri tipleri ise bu değerlerin türünü belirtir.
pythonsayi = 10 # Integer ondalik = 3.14 # Float metin = "Merhaba" # String dogru_mu = True # Boolean
3.2 Operatörler
Python’da matematiksel ve mantıksal operatörler kullanılarak işlemler yapılabilir.
-
Aritmetik Operatörler:
+
,-
,*
,/
,%
,**
,//
-
Karşılaştırma Operatörleri:
==
,!=
,>
,<
,>=
,<=
-
Mantıksal Operatörler:
and
,or
,not
3.3 Yorum Satırları
Kodunuzu daha anlaşılır kılmak için yorum satırları ekleyebilirsiniz.
python# Bu bir yorum satırıdır
4. Kontrol Yapıları
Programın akışını kontrol etmek için koşullu ifadeler ve döngüler kullanılır.
4.1 Koşullu İfadeler
pythonsayi = 10 if sayi > 0: print("Pozitif sayı") elif sayi == 0: print("Sıfır") else: print("Negatif sayı")
4.2 Döngüler
-
for Döngüsü:
pythonfor i in range(5): print(i)
-
while Döngüsü:
pythoni = 0 while i < 5: print(i) i += 1
5. Fonksiyonlar
Fonksiyonlar, belirli bir görevi yerine getiren kod bloklarıdır.
pythondef selamla(isim): print(f"Merhaba, {isim}!") selamla("Ahmet")
Fonksiyonlar, kodunuzu daha modüler ve tekrar kullanılabilir hale getirir.
📦 6. Python Veri Yapıları: Listeler, Demetler, Sözlükler ve Kümeler
Python’da verileri düzenlemek ve yönetmek için çeşitli veri yapıları bulunmaktadır. Bu yapılar, verilerinizi etkili bir şekilde depolamanıza ve işlemenize olanak tanır.
6.1 Listeler (Lists)
Listeler, sıralı ve değiştirilebilir veri koleksiyonlarıdır. Farklı veri tiplerini bir arada tutabilirler.
pythonmeyveler = ["elma", "muz", "kiraz"] print(meyveler[0]) # Çıktı: elma
Görsel: Liste Yapısı
6.2 Demetler (Tuples)
Demetler, sıralı ancak değiştirilemez veri koleksiyonlarıdır. Veri bütünlüğünün korunması gereken durumlarda kullanılır.
pythonkoordinatlar = (10.0, 20.0) print(koordinatlar[1]) # Çıktı: 20.0
Görsel: Demet Yapısı
6.3 Sözlükler (Dictionaries)
Sözlükler, anahtar-değer çiftlerinden oluşan, sırasız ve değiştirilebilir veri koleksiyonlarıdır.
pythonogrenci = {"ad": "Ali", "yas": 21} print(ogrenci["ad"]) # Çıktı: Ali
Görsel: Sözlük Yapısı
6.4 Kümeler (Sets)
Kümeler, benzersiz öğelerden oluşan sırasız koleksiyonlardır. Yinelenen değerleri otomatik olarak elerler.
pythonrenkler = {"kırmızı", "mavi", "yeşil"} renkler.add("sarı") print(renkler)
Görsel: Küme Yapısı
🔁 7. Döngüler ve Koşullu İfadeler
Programların akışını kontrol etmek için döngüler ve koşullu ifadeler kullanılır.
7.1 for
Döngüsü
for
döngüsü, belirli bir sayıda tekrarlanacak işlemler için kullanılır.
pythonfor i in range(5): print(i)
Görsel: for
Döngüsü Akış Diyagramı
7.2 while
Döngüsü
while
döngüsü, belirli bir koşul sağlandığı sürece işlemleri tekrarlar.
pythoni = 0 while i < 5: print(i) i += 1
Görsel: while
Döngüsü Akış Diyagramı
7.3 Koşullu İfadeler (if
, elif
, else
)
Koşullu ifadeler, belirli bir koşula göre farklı işlemler yapılmasını sağlar.
pythonsayi = 10 if sayi > 0: print("Pozitif") elif sayi == 0: print("Sıfır") else: print("Negatif")
Görsel: Koşullu İfadeler Akış Diyagramı
🧠 8. Fonksiyonlar ve Modüler Programlama
Fonksiyonlar, belirli bir görevi yerine getiren kod bloklarıdır. Kodunuzu daha modüler ve okunabilir hale getirirler.
8.1 Fonksiyon Tanımlama
pythondef selamla(isim): print(f"Merhaba, {isim}!")
Görsel: Fonksiyon Yapısı
8.2 Parametreler ve Geri Dönüş Değerleri
pythondef topla(a, b): return a + b sonuc = topla(3, 5) print(sonuc) # Çıktı: 8
Görsel: Fonksiyon Parametreleri ve Geri Dönüş
📁 9. Dosya İşlemleri: Okuma ve Yazma
Python’da dosya işlemleri, verileri kalıcı olarak saklamak ve yönetmek için temel bir beceridir. Dosyalarla çalışırken, dosyaları açmak, okumak, yazmak ve kapatmak gibi işlemler gerçekleştirilir.
9.1 Dosya Açma ve Kapatma
Dosyaları açmak için open()
fonksiyonu kullanılır. Dosya işlemleri tamamlandıktan sonra dosyanın kapatılması önemlidir.
pythondosya = open("ornek.txt", "r") # Dosyayı okuma modunda açar icerik = dosya.read() dosya.close() # Dosyayı kapatır
Not: Dosya işlemlerinde with
ifadesi kullanmak, dosyanın otomatik olarak kapatılmasını sağlar ve hata yönetimini kolaylaştırır.
pythonwith open("ornek.txt", "r") as dosya: icerik = dosya.read()
9.2 Dosya Okuma Yöntemleri
-
read()
: Dosyanın tamamını okur. -
readline()
: Dosyanın bir satırını okur. -
readlines()
: Dosyanın tüm satırlarını bir liste olarak döndürür.
pythonwith open("ornek.txt", "r") as dosya: satir = dosya.readline() print(satir)
9.3 Dosyaya Yazma
Dosyaya yazmak için "w"
(yazma) veya "a"
(ekleme) modları kullanılır.
pythonwith open("ornek.txt", "w") as dosya: dosya.write("Merhaba, Dünya!")
Görsel: Dosya İşlemleri Akış Diyagramı
⚠️ 10. Hata Yönetimi: try, except, else, finally
Programlama sırasında hatalar kaçınılmazdır. Python’da hata yönetimi, programın beklenmedik durumlarla başa çıkabilmesini sağlar.
10.1 Temel try-except Yapısı
pythontry: sayi = int(input("Bir sayı girin: ")) print(10 / sayi) except ZeroDivisionError: print("Sıfıra bölme hatası!") except ValueError: print("Geçersiz giriş!")
10.2 else ve finally Blokları
-
else
: try bloğunda hata oluşmazsa çalışır. -
finally
: Hata oluşsa da oluşmasa da her zaman çalışır.
pythontry: dosya = open("veri.txt", "r") except FileNotFoundError: print("Dosya bulunamadı.") else: icerik = dosya.read() print(icerik) dosya.close() finally: print("Dosya işlemi tamamlandı.")
Görsel: Hata Yönetimi Akış Diyagramı
🧱 11. Nesne Tabanlı Programlama (OOP)
Nesne tabanlı programlama, kodunuzu daha modüler ve yeniden kullanılabilir hale getirir. Python, nesne tabanlı programlamayı destekleyen bir dildir.
11.1 Sınıf ve Nesne Oluşturma
pythonclass Araba: def __init__(self, marka, model): self.marka = marka self.model = model def bilgi_goster(self): print(f"Araba: {self.marka} {self.model}") arac = Araba("Toyota", "Corolla") arac.bilgi_goster()
11.2 Kalıtım (Inheritance)
Kalıtım, bir sınıfın başka bir sınıfın özelliklerini ve yöntemlerini miras almasını sağlar.
pythonclass ElektrikliAraba(Araba): def __init__(self, marka, model, batarya_kapasitesi): super().__init__(marka, model) self.batarya_kapasitesi = batarya_kapasitesi def bilgi_goster(self): super().bilgi_goster() print(f"Batarya Kapasitesi: {self.batarya_kapasitesi} kWh") e_arac = ElektrikliAraba("Tesla", "Model S", 100) e_arac.bilgi_goster()
Görsel: Sınıf ve Kalıtım İlişkisi
📦 12. Modüller ve Paketler: Kodunuzu Organize Etmenin Güçlü Yolu
Python’da modüller ve paketler, kodunuzu daha düzenli ve yönetilebilir hale getirmenizi sağlar. Bu yapıların kullanımı, büyük projelerde kodun okunabilirliğini ve yeniden kullanılabilirliğini artırır.
12.1 Modüller (Modules)
Modül, Python kodlarını içeren bir dosyadır. Bu dosya, fonksiyonlar, sınıflar ve değişkenler içerebilir. Modüller, kodunuzu farklı dosyalara bölerek daha organize bir yapı oluşturmanızı sağlar.
Modül Oluşturma:
python# selam.py def selamla(isim): print(f"Merhaba, {isim}!")
Modül Kullanımı:
pythonimport selam selam.selamla("Ahmet")
12.2 Paketler (Packages)
Paket, birden fazla modülü bir araya getiren dizindir. Paketler, ilgili modülleri ve alt paketleri içeren birer klasördür. Python projeleri büyüdükçe, kodu daha düzenli ve anlamlı bir şekilde gruplamak için paketleri kullanmak önemlidir .
Paket Yapısı:
markdownproje/ ├── __init__.py ├── modul1.py └── modul2.py
Paket Kullanımı:
pythonfrom proje import modul1 modul1.fonksiyon()
Görsel: Modül ve Paket Yapısı
📚 13. Python Standart Kütüphaneleri: Güçlü Araçlar
Python, geniş bir standart kütüphane koleksiyonuna sahiptir. Bu kütüphaneler, dosya işlemleri, veri analizi, web geliştirme ve daha birçok alanda hazır fonksiyonlar sunar.
13.1 Dosya ve İşletim Sistemi İşlemleri
-
os: İşletim sistemiyle etkileşim kurmak için kullanılır.
pythonimport os print(os.getcwd()) # Geçerli çalışma dizinini verir
-
shutil: Dosya ve dizin işlemleri için kullanılır.
pythonimport shutil shutil.copy("kaynak.txt", "hedef.txt") # Dosya kopyalama
13.2 Veri İşleme
-
csv: CSV dosyalarını okuma ve yazma işlemleri için kullanılır.
pythonimport csv with open("veriler.csv", newline='') as csvfile: reader = csv.reader(csvfile) for row in reader: print(row)
-
json: JSON verilerini işlemek için kullanılır.
pythonimport json veri = {'ad': 'Ali', 'yas': 25} json_veri = json.dumps(veri) print(json_veri)
13.3 Zaman ve Tarih İşlemleri
-
datetime: Tarih ve saat işlemleri için kullanılır.
pythonfrom datetime import datetime simdi = datetime.now() print(simdi.strftime("%Y-%m-%d %H:%M:%S"))
-
time: Zamanla ilgili işlemler için kullanılır.
pythonimport time time.sleep(2) # 2 saniye bekleme
13.4 Matematiksel İşlemler
-
math: Matematiksel fonksiyonlar içerir.
pythonimport math print(math.sqrt(16)) # Kare kök hesaplama
-
random: Rastgele sayı üretimi için kullanılır.
pythonimport random print(random.randint(1, 10)) # 1 ile 10 arasında rastgele sayı
Görsel: Standart Kütüphane Modülleri
📊 14. Veri Analizi ve Görselleştirme: pandas ve matplotlib
Python, veri analizi ve görselleştirme için güçlü kütüphaneler sunar. Bu kütüphaneler, verileri anlamlandırmak ve etkili sunumlar hazırlamak için vazgeçilmezdir.
14.1 pandas: Veri Manipülasyonu
pandas, veri yapıları ve veri analizi araçları sağlayan bir kütüphanedir. En yaygın kullanılan veri yapıları:
-
Series: Tek boyutlu veri yapısı.
-
DataFrame: İki boyutlu, tablo benzeri veri yapısı.
Örnek: DataFrame Oluşturma
pythonimport pandas as pd veri = { 'Ad': ['Ali', 'Ayşe', 'Mehmet'], 'Yaş': [25, 30, 22], 'Şehir': ['İstanbul', 'Ankara', 'İzmir'] } df = pd.DataFrame(veri) print(df)
Çıktı:
markdownAd Yaş Şehir 0 Ali 25 İstanbul 1 Ayşe 30 Ankara 2 Mehmet 22 İzmir
Görsel: DataFrame Yapısı
14.2 matplotlib: Veri Görselleştirme
matplotlib, verileri görselleştirmek için kullanılan bir kütüphanedir. En yaygın kullanılan modülü pyplot‘tur.
Örnek: Basit Grafik Çizimi
pythonimport matplotlib.pyplot as plt x = [1, 2, 3, 4] y = [10, 20, 25, 30] plt.plot(x, y) plt.title('Örnek Grafik') plt.xlabel('X Ekseni') plt.ylabel('Y Ekseni') plt.show()
Görsel: Basit Çizgi Grafiği
🔍 15. NumPy: Sayısal Hesaplamalar
NumPy, büyük, çok boyutlu diziler ve matrisler üzerinde yüksek performanslı işlemler yapmayı sağlayan bir kütüphanedir.
Örnek: NumPy Dizisi Oluşturma
pythonimport numpy as np a = np.array([1, 2, 3]) print(a)
Çıktı:
csharp[1 2 3]
Örnek: Matris İşlemleri
pythonb = np.array([[1, 2], [3, 4]]) c = np.array([[5, 6], [7, 8]]) toplam = b + c print(toplam)
Çıktı:
lua[[ 6 8] [10 12]]
Görsel: NumPy Matris İşlemleri
📈 16. Seaborn: İleri Düzey Görselleştirme
Seaborn, matplotlib üzerine inşa edilmiş, istatistiksel verileri görselleştirmek için kullanılan bir kütüphanedir.
Örnek: Dağılım Grafiği
pythonimport seaborn as sns import pandas as pd # Örnek veri seti df = pd.DataFrame({ 'Yaş': [25, 30, 22, 35, 28], 'Gelir': [5000, 6000, 4500, 7000, 5200] }) sns.scatterplot(x='Yaş', y='Gelir', data=df)
🌐 17. Python ile Web Geliştirme: Django ve Flask
Python, web geliştirme alanında güçlü ve esnek framework’ler sunar. Bu framework’ler, dinamik ve ölçeklenebilir web uygulamaları oluşturmanıza olanak tanır.
17.1 Django: Kapsamlı Web Geliştirme Framework’ü
Django, hızlı geliştirme ve temiz, pragmatik tasarım için yüksek seviyeli bir Python web framework’üdür. Özellikleri arasında:
-
Otomatik yönetim paneli: Veritabanı modellerine dayalı olarak otomatik olarak oluşturulur.
-
ORM (Object-Relational Mapping): Veritabanı işlemlerini Python sınıflarıyla yönetmenizi sağlar.
-
Güvenlik: CSRF, XSS, SQL enjeksiyonu gibi yaygın güvenlik tehditlerine karşı koruma sağlar.
-
URL yönlendirme: Temiz ve okunabilir URL’ler oluşturmanıza yardımcı olur.
Örnek: Basit Django Projesi Oluşturma
-
Django’yu yükleyin:
bashpip install django
-
Yeni bir proje oluşturun:
bashdjango-admin startproject myproject
-
Sunucuyu başlatın:
bashpython manage.py runserver
17.2 Flask: Hafif ve Esnek Web Framework’ü
Flask, minimal ve genişletilebilir bir web framework’üdür. Küçük ve orta ölçekli projeler için idealdir. Özellikleri arasında:
-
Basit yapı: Öğrenmesi ve kullanması kolaydır.
-
Esneklik: İhtiyaçlarınıza göre genişletilebilir.
-
Geniş eklenti desteği: Veritabanı, form doğrulama, yükleme gibi işlemler için birçok eklenti mevcuttur.
Örnek: Basit Flask Uygulaması
pythonfrom flask import Flask app = Flask(__name__) @app.route('/') def anasayfa(): return 'Merhaba, Flask!' if __name__ == '__main__': app.run(debug=True)
Görsel: Django ve Flask Karşılaştırması
🔌 18. API Nedir ve Neden Önemlidir?
API (Application Programming Interface), farklı yazılım uygulamalarının birbirleriyle iletişim kurmasını sağlayan bir arabirimdir. Web geliştirmede, API’ler genellikle veri alışverişi ve hizmet entegrasyonu için kullanılır.
18.1 RESTful API’ler
REST (Representational State Transfer), web servisleri oluşturmak için kullanılan bir mimari tarzdır. RESTful API’ler, HTTP protokolleri üzerinden veri alışverişi yapar ve genellikle JSON formatını kullanır.
HTTP Metotları:
-
GET: Veri alma
-
POST: Yeni veri oluşturma
-
PUT: Mevcut veriyi güncelleme
-
DELETE: Veri silme
Örnek: Basit RESTful API
pythonfrom flask import Flask, jsonify app = Flask(__name__) @app.route('/api/selam', methods=['GET']) def selam(): return jsonify({'mesaj': 'Merhaba, API!'}) if __name__ == '__main__': app.run(debug=True)
18.2 FastAPI: Modern ve Hızlı API Geliştirme
FastAPI, modern, hızlı (yüksek performanslı) web API’leri oluşturmak için kullanılan bir Python web framework’üdür. Özellikleri arasında:
-
Yüksek performans: Asenkron programlama desteği sayesinde hızlıdır.
-
Otomatik belge oluşturma: Swagger UI ve ReDoc ile otomatik API belgeleri sunar.
-
Tip güvenliği: Python 3.6+’nın tip ipuçlarını kullanarak hata oranını azaltır.
Örnek: Basit FastAPI Uygulaması
pythonfrom fastapi import FastAPI app = FastAPI() @app.get("/") def anasayfa(): return {"mesaj": "Merhaba, FastAPI!"}
Görsel: RESTful API İletişimi
🔗 19. Python ile API Tüketimi: requests Kütüphanesi
Python’da, harici API’lerle iletişim kurmak için requests kütüphanesi kullanılır. Bu kütüphane, HTTP istekleri göndermenizi ve yanıtları işlemenizi sağlar.
Örnek: GET İsteği Gönderme
pythonimport requests response = requests.get('https://api.example.com/veri') if response.status_code == 200: veri = response.json() print(veri)
Örnek: POST İsteği Gönderme
pythonimport requests yeni_veri = {'isim': 'Ali', 'yas': 30} response = requests.post('https://api.example.com/ekle', json=yeni_veri) print(response.status_code)
🗄️ 20. Python ile Veritabanı İşlemleri: Temel Bilgiler
Veritabanları, verileri kalıcı olarak saklamak ve yönetmek için kullanılır. Python, çeşitli veritabanı sistemleriyle etkileşim kurmak için güçlü araçlar sunar.
20.1 SQLite ile Veritabanı İşlemleri
SQLite, hafif ve kurulumu kolay bir veritabanı sistemidir. Python’un standart kütüphanesi içinde yer alan sqlite3
modülü ile kullanılabilir.
Örnek: SQLite Kullanımı
pythonimport sqlite3 # Veritabanına bağlan conn = sqlite3.connect('veritabani.db') cursor = conn.cursor() # Tablo oluştur cursor.execute(''' CREATE TABLE IF NOT EXISTS kullanicilar ( id INTEGER PRIMARY KEY, isim TEXT, yas INTEGER ) ''') # Veri ekle cursor.execute("INSERT INTO kullanicilar (isim, yas) VALUES (?, ?)", ("Ali", 30)) # Verileri çek cursor.execute("SELECT * FROM kullanicilar") veriler = cursor.fetchall() print(veriler) # Bağlantıyı kapat conn.close()
Görsel: SQLite Veritabanı Yapısı
20.2 MySQL ve PostgreSQL ile Veritabanı İşlemleri
Python, MySQL ve PostgreSQL gibi popüler veritabanı sistemleriyle de uyumlu çalışabilir. Bu sistemlerle etkileşim kurmak için ek kütüphaneler kullanılır:
-
MySQL:
mysql-connector-python
veyaPyMySQL
kütüphaneleri kullanılır. -
PostgreSQL:
psycopg2
kütüphanesi kullanılır.
Örnek: MySQL Kullanımı
pythonimport mysql.connector # Veritabanına bağlan conn = mysql.connector.connect( host="localhost", user="kullanici_adi", password="sifre", database="veritabani_adi" ) cursor = conn.cursor() # Tablo oluştur cursor.execute(''' CREATE TABLE IF NOT EXISTS kullanicilar ( id INT AUTO_INCREMENT PRIMARY KEY, isim VARCHAR(255), yas INT ) ''') # Veri ekle cursor.execute("INSERT INTO kullanicilar (isim, yas) VALUES (%s, %s)", ("Ayşe", 25)) conn.commit() # Verileri çek cursor.execute("SELECT * FROM kullanicilar") veriler = cursor.fetchall() print(veriler) # Bağlantıyı kapat conn.close()
Görsel: MySQL Veritabanı Yapısı
🧭 21. ORM (Object-Relational Mapping) Nedir?
ORM, veritabanı işlemlerini nesne yönelimli programlama ile entegre eden bir tekniktir. ORM kullanarak, SQL sorguları yazmadan veritabanı işlemleri gerçekleştirebilirsiniz.
21.1 SQLAlchemy ile ORM Kullanımı
SQLAlchemy, Python için güçlü bir ORM kütüphanesidir. Veritabanı işlemlerini nesneler aracılığıyla yönetmenizi sağlar.
Örnek: SQLAlchemy Kullanımı
pythonfrom sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import declarative_base, sessionmaker # Veritabanı motorunu oluştur engine = create_engine('sqlite:///veritabani.db', echo=True) Base = declarative_base() # Model sınıfı tanımla class Kullanici(Base): __tablename__ = 'kullanicilar' id = Column(Integer, primary_key=True) isim = Column(String) yas = Column(Integer) # Veritabanını oluştur Base.metadata.create_all(engine) # Oturum oluştur Session = sessionmaker(bind=engine) session = Session() # Yeni kullanıcı ekle yeni_kullanici = Kullanici(isim="Mehmet", yas=28) session.add(yeni_kullanici) session.commit() # Verileri çek kullanicilar = session.query(Kullanici).all() for kullanici in kullanicilar: print(kullanici.isim, kullanici.yas)
Görsel: SQLAlchemy ORM Yapısı
21.2 Django ORM ile Veritabanı İşlemleri
Django, kendi ORM sistemine sahip bir web framework’üdür. Veritabanı işlemlerini Python sınıfları aracılığıyla yönetmenizi sağlar.
Örnek: Django ORM Kullanımı
pythonfrom django.db import models class Kullanici(models.Model): isim = models.CharField(max_length=100) yas = models.IntegerField()
🧪 22. Python’da Test Yazımı: Kod Kalitesini Artırmak
Test yazımı, yazılım geliştirme sürecinin vazgeçilmez bir parçasıdır. Python, test yazımı için çeşitli kütüphaneler ve araçlar sunar.
22.1 unittest Kütüphanesi
Python’un standart kütüphanesi olan unittest
, test yazımı için temel bir araçtır.
Örnek: unittest Kullanımı
pythonimport unittest def topla(a, b): return a + b class TestTopla(unittest.TestCase): def test_topla_pozitif(self): self.assertEqual(topla(2, 3), 5) def test_topla_negatif(self): self.assertEqual(topla(-2, -3), -5) if __name__ == '__main__': unittest.main()
22.2 pytest Kütüphanesi
pytest
, daha gelişmiş test senaryoları için kullanılan popüler bir kütüphanedir. Daha az kodla daha fazla test yazmanıza olanak tanır.
Örnek: pytest Kullanımı
pythondef topla(a, b): return a + b def test_topla(): assert topla(2, 3) == 5 assert topla(-2, -3) == -5
22.3 doctest Kütüphanesi
doctest
, fonksiyonların docstring’lerinde yazılan örnekleri test eder.
Örnek: doctest Kullanımı
pythondef topla(a, b): """ >>> topla(2, 3) 5 >>> topla(-2, -3) -5 """ return a + b if __name__ == "__main__": import doctest doctest.testmod()
🐞 23. Python’da Hata Ayıklama: Debugging Teknikleri
Hata ayıklama, kodunuzdaki hataları bulmak ve düzeltmek için kullanılan yöntemler bütünüdür.
23.1 print() Fonksiyonu ile Hata Ayıklama
En basit hata ayıklama yöntemi, print()
fonksiyonu ile değişkenlerin değerlerini yazdırmaktır.
Örnek:
pythondef topla(a, b): print(f"a: {a}, b: {b}") return a + b
23.2 pdb Modülü ile Hata Ayıklama
Python’un yerleşik hata ayıklayıcısı olan pdb
, kodunuzu adım adım incelemenizi sağlar.
Örnek:
pythonimport pdb def topla(a, b): pdb.set_trace() return a + b topla(2, 3)
23.3 IDE’ler ile Hata Ayıklama
Birçok IDE (örneğin, PyCharm, VSCode), entegre hata ayıklama araçları sunar. Bu araçlar, breakpoint’ler, adım adım yürütme ve değişken izleme gibi özellikler içerir.
⚠️ 24. Python’da Hata Türleri ve Yönetimi
Python’da karşılaşabileceğiniz hata türleri ve bu hataların nasıl yönetileceği:
24.1 Hata Türleri
-
SyntaxError: Yazım hataları.
-
NameError: Tanımlanmamış bir değişken kullanımı.
-
TypeError: Yanlış veri tipi kullanımı.
-
IndexError: Liste veya dizinin geçersiz bir indeksine erişim.
24.2 Hata Yönetimi
Python’da hataları yönetmek için try
, except
, else
ve finally
blokları kullanılır.
Örnek:
pythontry: sonuc = 10 / 0 except ZeroDivisionError: print("Sıfıra bölme hatası!") else: print("İşlem başarılı.") finally: print("İşlem tamamlandı.")
🗂️ 25. Python’da Dosya İşlemleri: Veri Okuma ve Yazma
Dosya işlemleri, programların harici veri kaynaklarıyla etkileşim kurmasını sağlar. Python, dosya işlemleri için güçlü ve esnek yöntemler sunar.
25.1 Dosya Açma ve Kapatma
Python’da bir dosyayı açmak için open()
fonksiyonu kullanılır. İşlem tamamlandıktan sonra dosyanın kapatılması önemlidir.
Örnek: Dosya Açma ve Kapatma
python# Dosyayı açma dosya = open('ornek.txt', 'r') # 'r' okuma modunu belirtir # Dosya işlemleri burada gerçekleştirilir # Dosyayı kapatma dosya.close()
Not: Dosya işlemlerinde with
ifadesi kullanmak, dosyanın otomatik olarak kapanmasını sağlar ve hata yönetimini kolaylaştırır.
Örnek: with İfadesi ile Dosya Açma
pythonwith open('ornek.txt', 'r') as dosya: # Dosya işlemleri burada gerçekleştirilir icerik = dosya.read()
25.2 Dosyaya Yazma
Dosyaya veri yazmak için write()
fonksiyonu kullanılır. Yazma modları şunlardır:
-
'w'
: Yazma modu. Dosya mevcutsa içeriği silinir, yoksa yeni dosya oluşturulur. -
'a'
: Ekleme modu. Dosya mevcutsa sonuna ekleme yapar, yoksa yeni dosya oluşturulur.
Örnek: Dosyaya Yazma
python# 'w' modu ile dosyaya yazma with open('ornek.txt', 'w') as dosya: dosya.write('Merhaba, Dünya!n') # 'a' modu ile dosyaya ekleme with open('ornek.txt', 'a') as dosya: dosya.write('Python ile dosya işlemleri.n')
25.3 Dosyadan Okuma
Dosyadan veri okumak için read()
, readline()
veya readlines()
fonksiyonları kullanılır.
-
read()
: Tüm dosyayı okur. -
readline()
: Dosyanın bir satırını okur. -
readlines()
: Dosyanın tüm satırlarını bir liste olarak döner.
Örnek: Dosyadan Okuma
pythonwith open('ornek.txt', 'r') as dosya: tum_icerik = dosya.read() print(tum_icerik) with open('ornek.txt', 'r') as dosya: satir = dosya.readline() print(satir) with open('ornek.txt', 'r') as dosya: satirlar = dosya.readlines() print(satirlar)
Görsel: Python Dosya İşlemleri Akışı
📊 26. Python ile Veri Analizi: Temel Araçlar ve Kütüphaneler
Veri analizi, verilerden anlamlı bilgiler çıkarma sürecidir. Python, veri analizi için zengin kütüphaneler ve araçlar sunar.
26.1 NumPy: Sayısal Hesaplamalar
NumPy, çok boyutlu diziler ve matrisler üzerinde yüksek performanslı işlemler yapmayı sağlayan bir kütüphanedir.
Örnek: NumPy Kullanımı
pythonimport numpy as np # Bir NumPy dizisi oluşturma dizi = np.array([1, 2, 3, 4, 5]) # Dizinin elemanlarına 2 ekleme yeni_dizi = dizi + 2 print(yeni_dizi)
26.2 Pandas: Veri Manipülasyonu
Pandas, veri yapıları ve veri analizi araçları sunan güçlü bir kütüphanedir. DataFrame
ve Series
gibi veri yapılarıyla çalışır.
Örnek: Pandas ile DataFrame Oluşturma
pythonimport pandas as pd # Sözlük verisinden DataFrame oluşturma veri = { 'İsim': ['Ahmet', 'Ayşe', 'Mehmet'], 'Yaş': [25, 30, 22], 'Şehir': ['İstanbul', 'Ankara', 'İzmir'] } df = pd.DataFrame(veri) print(df)
26.3 Matplotlib ve Seaborn: Veri Görselleştirme
Matplotlib ve Seaborn, verileri görselleştirmek için kullanılan popüler kütüphanelerdir.
Örnek: Matplotlib ile Çizgi Grafiği
pythonimport matplotlib.pyplot as plt # Veriler x = [1, 2, 3, 4, 5] y = [2, 3, 5, 7, 11] # Grafik oluşturma plt.plot(x, y) plt.title('Basit Çizgi Grafiği') plt.xlabel('X Ekseni') plt.ylabel('Y Ekseni') plt.show()
Görsel: Matplotlib ile Çizgi Grafiği Örneği
26.4 scikit-learn: Makine Öğrenmesi
scikit-learn, makine öğrenmesi algoritmaları ve araçları sunan geniş kapsamlı bir kütüphanedir.
Örnek: scikit-learn ile Lineer Regresyon
pythonfrom sklearn.linear_model import LinearRegression import numpy as np # Örnek veriler X = np.array([[1], [2], [3], [4], [5]]) y = np.array([2, 4, 5, 4, 5]) # Model oluşturma ve eğitme model = LinearRegression() model.fit(X, y) # Tahmin yapma tahmin = model.predict([[6]]) print(tahmin)
🌐 27. Python ile Web Geliştirme: Flask ve Django Framework’leri
Python, web geliştirme alanında güçlü ve esnek çözümler sunan bir programlama dilidir. Bu alanda en çok tercih edilen iki framework, Flask ve Django’dur. Her ikisi de farklı ihtiyaçlara hitap eder ve projelerin gereksinimlerine göre seçim yapılmalıdır.
27.1 Flask: Hafif ve Esnek Bir Mikro Framework
Flask, minimal yapısı ve esnekliği ile bilinen bir mikro web framework’tür. Küçük ve orta ölçekli projeler için idealdir ve geliştiricilere büyük bir özgürlük sunar.
Öne Çıkan Özellikleri:
-
Hafif ve Genişletilebilir: Flask, temel işlevselliği sağlar ve geliştiricilerin ihtiyaçlarına göre genişletilebilir.
-
Esnek Yapı: Geliştiricilere uygulama mimarisi, kitaplıklar ve uzantılar üzerinde tam kontrol sağlar.
-
Kolay Öğrenme Eğrisi: Basit API’si sayesinde hızlı bir şekilde öğrenilebilir ve uygulanabilir.
-
RESTful İstek Desteği: HTTP ve RESTful isteklerini destekler, bu da API geliştirmeyi kolaylaştırır.
Kullanım Alanları:
-
Küçük ve orta ölçekli web uygulamaları
-
Mikro servis mimarileri
-
Hızlı prototipleme ve MVP geliştirme
Görsel: Flask Framework Logosu
27.2 Django: Kapsamlı ve Güçlü Bir Framework
Django, “batteries-included” yaklaşımıyla gelen, tam özellikli bir web framework’tür. Büyük ve karmaşık projeler için uygundur ve birçok yerleşik özellik sunar.
Öne Çıkan Özellikleri:
-
Yerleşik ORM: Veritabanı işlemleri için güçlü bir nesne-ilişkisel eşleme sistemi sunar.
-
Yönetici Paneli: Otomatik olarak oluşturulan bir yönetici arayüzü ile içerik yönetimini kolaylaştırır.
-
Güvenlik: CSRF, XSS ve SQL enjeksiyonu gibi yaygın güvenlik tehditlerine karşı koruma sağlar.
-
URL Yönlendirme ve Şablonlama: Kolay ve etkili URL şemaları ile güçlü bir şablon motoru sunar.
Kullanım Alanları:
-
Büyük ölçekli web uygulamaları
-
İçerik yönetim sistemleri (CMS)
-
E-ticaret platformları
-
Sosyal medya siteleri
Görsel: Django Framework Logosu
27.3 Flask ve Django Karşılaştırması
Özellik | Flask | Django |
---|---|---|
Yapı | Mikro framework | Tam özellikli framework |
Esneklik | Yüksek | Orta |
Öğrenme Eğrisi | Kolay | Orta |
Yerleşik Özellikler | Az (gerektiğinde eklenir) | Çok (çoğu hazır gelir) |
Kullanım Alanı | Küçük ve orta ölçekli projeler | Orta ve büyük ölçekli projeler |
Topluluk Desteği | Geniş | Çok geniş |
🔗 28. Python ile API Geliştirme ve RESTful Servisler
API (Application Programming Interface), farklı yazılım bileşenlerinin birbirleriyle iletişim kurmasını sağlayan bir arayüzdür. RESTful API’ler, HTTP protokolü üzerinden çalışan ve kaynaklara erişim sağlayan yaygın bir API türüdür.
28.1 RESTful API Nedir?
REST (Representational State Transfer), web servisleri için kullanılan bir mimari tarzdır. RESTful API’ler, HTTP yöntemlerini kullanarak kaynaklara erişim sağlar.
Temel HTTP Yöntemleri:
-
GET: Veri okuma
-
POST: Yeni veri oluşturma
-
PUT: Mevcut veriyi güncelleme
-
DELETE: Veri silme
REST Prensipleri:
-
Stateless: Her istek bağımsızdır, sunucu istemci durumunu saklamaz.
-
Cacheable: Yanıtlar önbelleğe alınabilir.
-
Client-Server: İstemci ve sunucu ayrıdır.
-
Uniform Interface: Standart bir arayüz kullanılır.
28.2 Flask ile Basit Bir RESTful API Oluşturma
Flask, hafif ve esnek bir web framework’tür. RESTful API geliştirmek için idealdir.
Adımlar:
-
Kurulum:
bashpip install flask
-
Uygulama Oluşturma:
pythonfrom flask import Flask, jsonify, request app = Flask(__name__) veriler = [] @app.route('/veri', methods=['GET']) def veri_getir(): return jsonify(veriler) @app.route('/veri', methods=['POST']) def veri_ekle(): yeni_veri = request.get_json() veriler.append(yeni_veri) return jsonify(yeni_veri), 201 if __name__ == '__main__': app.run(debug=True)
Bu örnek, /veri
endpoint’ine GET ve POST istekleriyle veri okuma ve ekleme işlemlerini gerçekleştirir.
28.3 Django REST Framework ile Gelişmiş API’ler
Django REST Framework (DRF), Django üzerinde RESTful API’ler geliştirmek için kullanılan güçlü bir kütüphanedir.
Kurulum:
bashpip install djangorestframework
Kullanım:
DRF, model tanımlamaları, serializer’lar ve viewset’ler kullanarak hızlı ve güvenli API’ler oluşturmanıza olanak tanır.
🗃️ 29. Python’da Veritabanı İşlemleri ve ORM Kullanımı
Veritabanı işlemleri, yazılım geliştirme sürecinin önemli bir parçasıdır. Python, veritabanı işlemleri için çeşitli yöntemler ve araçlar sunar. Bu bölümde, doğrudan SQL sorguları kullanarak veritabanı işlemleri yapmayı ve ORM kullanarak bu işlemleri daha soyut bir şekilde gerçekleştirmeyi öğreneceğiz.
29.1 Doğrudan SQL Sorguları ile Veritabanı İşlemleri
Python, yerleşik sqlite3
modülü sayesinde SQLite veritabanlarıyla doğrudan çalışabilir. Ayrıca, MySQL, PostgreSQL gibi diğer veritabanları için de uygun kütüphaneler mevcuttur.
Örnek: SQLite ile Temel Veritabanı İşlemleri
pythonimport sqlite3 # Veritabanına bağlanma conn = sqlite3.connect('ornek.db') cursor = conn.cursor() # Tablo oluşturma cursor.execute(''' CREATE TABLE IF NOT EXISTS kullanicilar ( id INTEGER PRIMARY KEY AUTOINCREMENT, isim TEXT NOT NULL, yas INTEGER NOT NULL ) ''') # Veri ekleme cursor.execute("INSERT INTO kullanicilar (isim, yas) VALUES (?, ?)", ("Ahmet", 30)) # Verileri okuma cursor.execute("SELECT * FROM kullanicilar") sonuclar = cursor.fetchall() for satir in sonuclar: print(satir) # Değişiklikleri kaydetme ve bağlantıyı kapatma conn.commit() conn.close()
Bu yöntem, küçük projeler için yeterli olabilir. Ancak, büyük ve karmaşık projelerde ORM kullanımı daha verimli ve sürdürülebilir bir çözüm sunar.
29.2 ORM Nedir?
ORM (Object-Relational Mapping), veritabanı tablolarını nesne yönelimli programlama dillerinde sınıflar olarak temsil etmeyi sağlayan bir tekniktir. ORM kullanarak, SQL sorguları yazmadan veritabanı işlemleri gerçekleştirebiliriz.
Python’da popüler ORM kütüphaneleri arasında SQLAlchemy ve Django ORM bulunmaktadır.
🛠️ 30. SQLAlchemy ile ORM Kullanımı
SQLAlchemy, Python için güçlü ve esnek bir ORM kütüphanesidir. Veritabanı işlemlerini daha kolay ve verimli hale getirerek, geliştiricilerin veritabanı etkileşimlerini doğrudan SQL yazmak yerine Python nesneleri üzerinden yönetmelerini sağlar .
30.1 Kurulum
SQLAlchemy’yi pip kullanarak kolayca kurabilirsiniz:
bashpip install sqlalchemy
30.2 Temel Kullanım
Örnek: SQLAlchemy ile Veritabanı İşlemleri
pythonfrom sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import declarative_base, sessionmaker # Veritabanı bağlantısı engine = create_engine('sqlite:///ornek.db', echo=True) Base = declarative_base() # Model tanımı class Kullanici(Base): __tablename__ = 'kullanicilar' id = Column(Integer, primary_key=True) isim = Column(String) yas = Column(Integer) # Tabloları oluşturma Base.metadata.create_all(engine) # Oturum oluşturma Session = sessionmaker(bind=engine) session = Session() # Veri ekleme yeni_kullanici = Kullanici(isim="Ayşe", yas=25) session.add(yeni_kullanici) session.commit() # Verileri okuma kullanicilar = session.query(Kullanici).all() for kullanici in kullanicilar: print(kullanici.isim, kullanici.yas)
Bu örnek, SQLAlchemy kullanarak veritabanı işlemlerini nasıl gerçekleştireceğinizi göstermektedir.
🧰 31. Django ORM ile Veritabanı İşlemleri
Django, Python tabanlı bir web çatısıdır ve kendi içinde güçlü bir ORM sistemine sahiptir. Django ORM, veritabanı işlemlerini Python sınıfları üzerinden yapma imkanı sunar .
31.1 Django Projesi Oluşturma
Öncelikle, Django’yu kurmanız gerekmektedir:
bashpip install django
Ardından, bir Django projesi ve uygulaması oluşturun:
bashdjango-admin startproject ornekproje cd ornekproje python manage.py startapp ornekuygulama
31.2 Model Tanımlama
ornekuygulama/models.py
dosyasında modelinizi tanımlayın:
pythonfrom django.db import models class Kullanici(models.Model): isim = models.CharField(max_length=100) yas = models.IntegerField()
31.3 Veritabanı İşlemleri
Veritabanı tablolarını oluşturmak için aşağıdaki komutları kullanın:
bashpython manage.py makemigrations python manage.py migrate
Veri eklemek ve sorgulamak için Django’nun ORM API’sini kullanabilirsiniz:
python# Veri ekleme kullanici = Kullanici(isim="Mehmet", yas=28) kullanici.save() # Verileri okuma kullanicilar = Kullanici.objects.all() for kullanici in kullanicilar: print(kullanici.isim, kullanici.yas)
Django ORM, veritabanı işlemlerini daha anlaşılır ve daha az karmaşık hale getirir. SQL sorgularıyla uğraşmak yerine, sadece Python nesneleri ile etkileşime geçebilirsiniz .
🧪 32. Python’da Test Yazımı ve Hata Ayıklama
Yazılım geliştirme sürecinde, kodun doğruluğunu ve güvenilirliğini sağlamak için test yazımı ve hata ayıklama (debugging) kritik öneme sahiptir. Python, bu süreçleri desteklemek için çeşitli araçlar ve teknikler sunar.
32.1 Test Yazımının Önemi
Testler, kodun beklenen şekilde çalıştığını doğrulamak için kullanılır. İyi yazılmış testler, kod değişikliklerinin mevcut işlevselliği bozmadığından emin olmanıza yardımcı olur.
32.2 Python’da Test Yazma Araçları
Python, test yazımı için birkaç yerleşik ve üçüncü taraf kütüphane sunar:
-
unittest: Python’un standart kütüphanesinde bulunan bir test çerçevesidir.
-
pytest: Daha gelişmiş özellikler ve daha okunabilir testler için popüler bir üçüncü taraf kütüphanedir.
-
doctest: Dokümantasyon içinde yazılmış örnek kodları test eder.
unittest Kullanımı
pythonimport unittest def topla(a, b): return a + b class TestTopla(unittest.TestCase): def test_topla(self): self.assertEqual(topla(2, 3), 5) if __name__ == '__main__': unittest.main()
pytest Kullanımı
pythondef topla(a, b): return a + b def test_topla(): assert topla(2, 3) == 5
32.3 Hata Ayıklama (Debugging) Teknikleri
Hata ayıklama, kodunuzdaki hataları bulma ve düzeltme sürecidir. Python, bu süreçte yardımcı olacak çeşitli araçlar sunar:
-
print() Fonksiyonu: Değişkenlerin değerlerini ve kodun akışını izlemek için kullanılır.
-
pdb Modülü: Python’un yerleşik hata ayıklayıcısıdır. Kodunuzu adım adım çalıştırarak hataları bulmanıza yardımcı olur.
-
IDE’ler: PyCharm, VS Code gibi entegre geliştirme ortamları, gelişmiş hata ayıklama araçları sunar.
pdb Kullanımı
pythonimport pdb def topla(a, b): pdb.set_trace() return a + b topla(2, 3)
Bu kod çalıştırıldığında, pdb.set_trace()
satırında program durur ve etkileşimli bir hata ayıklama oturumu başlatılır.
32.4 Hata Türleri ve Yönetimi
Python’da karşılaşabileceğiniz başlıca hata türleri:
-
SyntaxError: Yazım hataları.
-
TypeError: Yanlış veri tipi kullanımı.
-
NameError: Tanımlanmamış değişken kullanımı.
-
IndexError: Liste veya dizilerde geçersiz indeks kullanımı.
Hataları yönetmek için try-except
blokları kullanılır:
pythontry: sonuc = 10 / 0 except ZeroDivisionError: print("Sıfıra bölme hatası!")
32.5 Logging ile Hata Takibi
logging
modülü, uygulamanızın çalışması sırasında oluşan olayları kaydetmenize olanak tanır. Bu, özellikle üretim ortamlarında hata ayıklama için faydalıdır.
pythonimport logging logging.basicConfig(level=logging.INFO) logging.info("Program başlatıldı.")
🧵 33. Python’da Çoklu İş Parçacığı (Multithreading) ve Çoklu İşlem (Multiprocessing)
Modern bilgisayarlar, birden fazla işlemci çekirdeği sayesinde aynı anda birden fazla işlemi gerçekleştirebilir. Python’da, bu paralel işlemleri gerçekleştirmek için çoklu iş parçacığı (multithreading) ve çoklu işlem (multiprocessing) olmak üzere iki ana yöntem bulunmaktadır. Bu bölümde, her iki yöntemin de ne olduğunu, nasıl kullanıldığını ve hangi durumlarda tercih edilmesi gerektiğini inceleyeceğiz.
33.1 Çoklu İş Parçacığı (Multithreading) Nedir?
İş parçacığı (thread), bir işlem (process) içerisinde çalışan en küçük yürütme birimidir. Çoklu iş parçacığı (multithreading), bir işlem içinde birden fazla iş parçacığının aynı anda çalıştırılmasıdır. Bu, özellikle I/O (girdi/çıktı) işlemleri gibi bekleme süresi yüksek olan görevlerde programın daha verimli çalışmasını sağlar.
Python’da threading Modülü:
Python’da, threading
modülü kullanılarak çoklu iş parçacığı oluşturulabilir. Aşağıda basit bir örnek bulunmaktadır:
pythonimport threading import time def is_parcacigi(isim): print(f"{isim} başladı.") time.sleep(2) print(f"{isim} bitti.") # İş parçacıklarını oluşturma thread1 = threading.Thread(target=is_parcacigi, args=("İş Parçacığı 1",)) thread2 = threading.Thread(target=is_parcacigi, args=("İş Parçacığı 2",)) # İş parçacıklarını başlatma thread1.start() thread2.start() # Ana iş parçacığının diğer iş parçacıklarının bitmesini beklemesi thread1.join() thread2.join() print("Tüm iş parçacıkları tamamlandı.")
Bu örnekte, iki iş parçacığı oluşturulup başlatılmakta ve ana iş parçacığı, bu iş parçacıklarının tamamlanmasını beklemektedir.
Global Interpreter Lock (GIL) ve Multithreading:
Python’un Global Interpreter Lock (GIL) adı verilen bir mekanizması vardır. GIL, aynı anda sadece bir iş parçacığının Python bayt kodunu çalıştırmasına izin verir. Bu nedenle, Python’da çoklu iş parçacığı kullanımı, CPU yoğunluklu işlemlerde beklenen performans artışını sağlamayabilir. Ancak, I/O yoğunluklu işlemlerde (örneğin, dosya okuma/yazma, ağ işlemleri) çoklu iş parçacığı kullanımı performansı artırabilir.
33.2 Çoklu İşlem (Multiprocessing) Nedir?
Çoklu işlem (multiprocessing), her biri kendi bellek alanına sahip ayrı işlemcilerin (process) oluşturulmasıdır. Bu yöntem, özellikle CPU yoğunluklu işlemlerde etkilidir çünkü her işlem kendi GIL’ine sahip olur ve böylece Python’un GIL sınırlamalarını aşarak gerçek paralel işlem yapabilir.
Python’da multiprocessing Modülü:
Python’da, multiprocessing
modülü kullanılarak çoklu işlem oluşturulabilir. Aşağıda basit bir örnek bulunmaktadır:
pythonimport multiprocessing import time def islem(isim): print(f"{isim} başladı.") time.sleep(2) print(f"{isim} bitti.") if __name__ == "__main__": # İşlemleri oluşturma process1 = multiprocessing.Process(target=islem, args=("İşlem 1",)) process2 = multiprocessing.Process(target=islem, args=("İşlem 2",)) # İşlemleri başlatma process1.start() process2.start() # Ana işlemin diğer işlemlerin bitmesini beklemesi process1.join() process2.join() print("Tüm işlemler tamamlandı.")
Bu örnekte, iki ayrı işlem oluşturulup başlatılmakta ve ana işlem, bu işlemlerin tamamlanmasını beklemektedir.
Multiprocessing Kullanımının Avantajları:
-
Gerçek Paralellik: Her işlem kendi bellek alanına ve GIL’ine sahip olduğundan, CPU yoğunluklu işlemlerde gerçek paralellik sağlanır.
-
Stabilite: İşlemler birbirinden bağımsız çalıştığı için, bir işlemde oluşan hata diğerlerini etkilemez.
33.3 Multithreading ve Multiprocessing Arasındaki Farklar
Özellik | Multithreading | Multiprocessing |
---|---|---|
Bellek Paylaşımı | Tüm iş parçacıkları aynı bellek alanını paylaşır. | Her işlem kendi bellek alanına sahiptir. |
GIL Etkisi | GIL nedeniyle aynı anda sadece bir iş parçacığı Python kodu çalıştırabilir. | Her işlem kendi GIL’ine sahip olduğundan gerçek paralellik mümkündür. |
Kullanım Alanı | I/O yoğunluklu işlemler için uygundur. | CPU yoğunluklu işlemler için uygundur. |
İşlem Ağırlığı | İş parçacıkları hafiftir ve oluşturulması daha az kaynak gerektirir. | İşlemler daha ağırdır ve oluşturulması daha fazla kaynak gerektirir. |
33.4 Hangi Durumda Hangi Yöntem Tercih Edilmeli?
-
I/O Yoğunluklu İşlemler: Dosya okuma/yazma, ağ işlemleri gibi I/O beklemeleri içeren görevlerde multithreading tercih edilmelidir. Bu sayede, bir iş parçacığı I/O işlemi beklerken diğerleri çalışmaya devam edebilir.
-
CPU Yoğunluklu İşlemler: Matematiksel hesaplamalar, veri işleme gibi CPU’yu yoğun kullanan görevlerde multiprocessing tercih edilmelidir. Bu sayede, işlemler farklı çekirdeklerde paralel olarak çalışabilir ve performans artışı sağlanır.
33.5 Örnek: I/O Yoğunluklu İşlemde Multithreading Kullanımı
Aşağıdaki örnekte, birden fazla URL’den veri çekmek için çoklu iş parçacığı kullanımı gösterilmektedir:
pythonimport threading import requests def veri_cek(url): response = requests.get(url) print(f"{url} - ::contentReference[oaicite:1]{index=1}
🧵 33. Python’da Çoklu İş Parçacığı (Multithreading) ve Çoklu İşlem (Multiprocessing)
Modern bilgisayarlar, birden fazla işlemci çekirdeği sayesinde aynı anda birden fazla işlemi gerçekleştirebilir. Python’da, bu paralel işlemleri gerçekleştirmek için çoklu iş parçacığı (multithreading) ve çoklu işlem (multiprocessing) olmak üzere iki ana yöntem bulunmaktadır. Bu bölümde, her iki yöntemin de ne olduğunu, nasıl kullanıldığını ve hangi durumlarda tercih edilmesi gerektiğini inceleyeceğiz.
33.1 Çoklu İş Parçacığı (Multithreading) Nedir?
İş parçacığı (thread), bir işlem (process) içerisinde çalışan en küçük yürütme birimidir. Çoklu iş parçacığı (multithreading), bir işlem içinde birden fazla iş parçacığının aynı anda çalıştırılmasıdır. Bu, özellikle I/O (girdi/çıktı) işlemleri gibi bekleme süresi yüksek olan görevlerde programın daha verimli çalışmasını sağlar.
Python’da threading Modülü:
Python’da, threading
modülü kullanılarak çoklu iş parçacığı oluşturulabilir. Aşağıda basit bir örnek bulunmaktadır:
pythonimport threading import time def is_parcacigi(isim): print(f"{isim} başladı.") time.sleep(2) print(f"{isim} bitti.") # İş parçacıklarını oluşturma thread1 = threading.Thread(target=is_parcacigi, args=("İş Parçacığı 1",)) thread2 = threading.Thread(target=is_parcacigi, args=("İş Parçacığı 2",)) # İş parçacıklarını başlatma thread1.start() thread2.start() # Ana iş parçacığının diğer iş parçacıklarının bitmesini beklemesi thread1.join() thread2.join() print("Tüm iş parçacıkları tamamlandı.")
Bu örnekte, iki iş parçacığı oluşturulup başlatılmakta ve ana iş parçacığı, bu iş parçacıklarının tamamlanmasını beklemektedir.
Global Interpreter Lock (GIL) ve Multithreading:
Python’un Global Interpreter Lock (GIL) adı verilen bir mekanizması vardır. GIL, aynı anda sadece bir iş parçacığının Python bayt kodunu çalıştırmasına izin verir. Bu nedenle, Python’da çoklu iş parçacığı kullanımı, CPU yoğunluklu işlemlerde beklenen performans artışını sağlamayabilir. Ancak, I/O yoğunluklu işlemlerde (örneğin, dosya okuma/yazma, ağ işlemleri) çoklu iş parçacığı kullanımı performansı artırabilir.
33.2 Çoklu İşlem (Multiprocessing) Nedir?
Çoklu işlem (multiprocessing), her biri kendi bellek alanına sahip ayrı işlemcilerin (process) oluşturulmasıdır. Bu yöntem, özellikle CPU yoğunluklu işlemlerde etkilidir çünkü her işlem kendi GIL’ine sahip olur ve böylece Python’un GIL sınırlamalarını aşarak gerçek paralel işlem yapabilir.
Python’da multiprocessing Modülü:
Python’da, multiprocessing
modülü kullanılarak çoklu işlem oluşturulabilir. Aşağıda basit bir örnek bulunmaktadır:
pythonimport multiprocessing import time def islem(isim): print(f"{isim} başladı.") time.sleep(2) print(f"{isim} bitti.") if __name__ == "__main__": # İşlemleri oluşturma process1 = multiprocessing.Process(target=islem, args=("İşlem 1",)) process2 = multiprocessing.Process(target=islem, args=("İşlem 2",)) # İşlemleri başlatma process1.start() process2.start() # Ana işlemin diğer işlemlerin bitmesini beklemesi process1.join() process2.join() print("Tüm işlemler tamamlandı.")
Bu örnekte, iki ayrı işlem oluşturulup başlatılmakta ve ana işlem, bu işlemlerin tamamlanmasını beklemektedir.
Multiprocessing Kullanımının Avantajları:
-
Gerçek Paralellik: Her işlem kendi bellek alanına ve GIL’ine sahip olduğundan, CPU yoğunluklu işlemlerde gerçek paralellik sağlanır.
-
Stabilite: İşlemler birbirinden bağımsız çalıştığı için, bir işlemde oluşan hata diğerlerini etkilemez.
33.3 Multithreading ve Multiprocessing Arasındaki Farklar
Özellik | Multithreading | Multiprocessing |
---|---|---|
Bellek Paylaşımı | Tüm iş parçacıkları aynı bellek alanını paylaşır. | Her işlem kendi bellek alanına sahiptir. |
GIL Etkisi | GIL nedeniyle aynı anda sadece bir iş parçacığı Python kodu çalıştırabilir. | Her işlem kendi GIL’ine sahip olduğundan gerçek paralellik mümkündür. |
Kullanım Alanı | I/O yoğunluklu işlemler için uygundur. | CPU yoğunluklu işlemler için uygundur. |
İşlem Ağırlığı | İş parçacıkları hafiftir ve oluşturulması daha az kaynak gerektirir. | İşlemler daha ağırdır ve oluşturulması daha fazla kaynak gerektirir. |
33.4 Hangi Durumda Hangi Yöntem Tercih Edilmeli?
-
I/O Yoğunluklu İşlemler: Dosya okuma/yazma, ağ işlemleri gibi I/O beklemeleri içeren görevlerde multithreading tercih edilmelidir. Bu sayede, bir iş parçacığı I/O işlemi beklerken diğerleri çalışmaya devam edebilir.
-
CPU Yoğunluklu İşlemler: Matematiksel hesaplamalar, veri işleme gibi CPU’yu yoğun kullanan görevlerde multiprocessing tercih edilmelidir. Bu sayede, işlemler farklı çekirdeklerde paralel olarak çalışabilir ve performans artışı sağlanır.
33.5 Örnek: I/O Yoğunluklu İşlemde Multithreading Kullanımı
Aşağıdaki örnekte, birden fazla URL’den veri çekmek için çoklu iş parçacığı kullanımı gösterilmektedir:
pythonimport threading import requests def veri_cek(url): response = requests.get(url) print(f"{url} - ::contentReference[oaicite:1]{index=1}
33.5 Örnek: I/O Yoğunluklu İşlemde Multithreading Kullanımı
Aşağıdaki örnekte, birden fazla URL’den veri çekmek için çoklu iş parçacığı kullanımı gösterilmektedir:
pythonimport threading import requests def veri_cek(url): response = requests.get(url) print(f"{url} - Durum Kodu: {response.status_code}") url_listesi = [ "https://www.example.com", "https://www.example.org", "https://www.example.net", ] is_parcaciklari = [] for url in url_listesi: thread = threading.Thread(target=veri_cek, args=(url,)) is_parcaciklari.append(thread) thread.start() for thread in is_parcaciklari: thread.join()
Bu kodda, her bir URL için ayrı bir iş parçacığı oluşturulmakta ve bu iş parçacıkları aynı anda çalıştırılmaktadır. Bu sayede, ağ istekleri paralel olarak gerçekleştirilir ve toplam işlem süresi azalır.
33.6 Örnek: CPU Yoğunluklu İşlemde Multiprocessing Kullanımı
Aşağıdaki örnekte, büyük bir sayı listesinde kare alma işlemi için çoklu işlem kullanımı gösterilmektedir:
pythonimport multiprocessing def kare_al(sayi): return sayi * sayi sayi_listesi = list(range(1, 1000000)) if __name__ == "__main__": with multiprocessing.Pool() as havuz: sonuc = havuz.map(kare_al, sayi_listesi)
Bu kodda, multiprocessing.Pool
kullanılarak işlem havuzu oluşturulmakta ve map
fonksiyonu ile her bir sayı için kare_al
fonksiyonu paralel olarak çalıştırılmaktadır. Bu sayede, CPU yoğunluklu bu işlem tüm çekirdekler üzerinde dağıtılarak daha hızlı tamamlanır.
33.7 Sonuç
Python’da multithreading ve multiprocessing kavramları, programların performansını artırmak için önemli araçlardır. Hangi yöntemin kullanılacağı, işlemin türüne bağlıdır:
-
I/O Yoğunluklu İşlemler: Ağ istekleri, dosya okuma/yazma gibi işlemler için multithreading uygundur.
-
CPU Yoğunluklu İşlemler: Yoğun hesaplama gerektiren işlemler için multiprocessing tercih edilmelidir.
Her iki yöntemin de avantajları ve dezavantajları bulunmaktadır. Bu nedenle, uygulamanızın ihtiyaçlarına ve işlem türüne göre en uygun yöntemi seçmek önemlidir.
⚙️ 34. Python’da Asenkron Programlama ve asyncio
Modülü
34.1 Asenkron Programlama Nedir?
Asenkron programlama, programın belirli işlemleri beklerken diğer işlemleri engellemeden çalışmasına olanak tanır. Bu, özellikle ağ istekleri, dosya işlemleri gibi I/O yoğunluklu görevlerde önemlidir. Python’da bu yaklaşımı gerçekleştirmek için asyncio
modülü kullanılır.
34.2 asyncio
Modülüne Giriş
Python’un asyncio
modülü, asenkron programlama için temel bir araçtır. Bu modül, tek bir iş parçacığı ve işlem kullanarak eşzamanlı görevlerin yürütülmesini sağlar. asyncio
, özellikle yüksek performanslı ağ ve web sunucuları, veritabanı bağlantı kütüphaneleri ve dağıtık görev kuyrukları gibi asenkron çerçevelerin temelini oluşturur .
34.3 async
ve await
Anahtar Kelimeleri
-
async
anahtar kelimesi, bir fonksiyonun asenkron olarak tanımlanmasını sağlar. Bu fonksiyonlar, diğer asenkron fonksiyonları çağırabilir veawait
ifadesiyle bekleyebilir. -
await
anahtar kelimesi, bir asenkron fonksiyonun sonucunu beklemek için kullanılır. Bu, programın diğer görevleri engellemeden belirli bir işlemi tamamlamasını sağlar.
34.4 Basit Bir asyncio
Örneği
Aşağıdaki örnek, asyncio
modülünü kullanarak asenkron bir fonksiyonun nasıl tanımlanacağını ve çalıştırılacağını göstermektedir:
pythonimport asyncio async def merhaba(): print("Merhaba") await asyncio.sleep(1) print("Dünya") asyncio.run(merhaba())
Bu kod, “Merhaba” yazısını yazdırır, 1 saniye bekler ve ardından “Dünya” yazısını yazdırır.
34.5 Asenkron Görevlerin Eşzamanlı Yürütülmesi
asyncio.gather()
fonksiyonu, birden fazla asenkron görevi eşzamanlı olarak çalıştırmak için kullanılır. Aşağıdaki örnek, iki farklı görevin aynı anda nasıl yürütülebileceğini göstermektedir:
pythonimport asyncio async def gorev1(): await asyncio.sleep(1) print("Görev 1 tamamlandı") async def gorev2(): await asyncio.sleep(2) print("Görev 2 tamamlandı") async def main(): await asyncio.gather(gorev1(), gorev2()) asyncio.run(main())
Bu kod, gorev1
ve gorev2
fonksiyonlarını eşzamanlı olarak çalıştırır ve her biri tamamlandığında ilgili mesajı yazdırır.
34.6 Gerçek Dünya Uygulaması: Web Sayfalarını Asenkron Olarak İndirme
Asenkron programlama, web sayfalarını eşzamanlı olarak indirmek gibi görevlerde oldukça etkilidir. Aşağıdaki örnek, aiohttp
kütüphanesini kullanarak birden fazla web sayfasını asenkron olarak indirmeyi göstermektedir:
pythonimport asyncio import aiohttp async def sayfa_indir(session, url): async with session.get(url) as response: print(f"{url} - Durum Kodu: {response.status}") async def main(): url_listesi = [ "https://www.example.com", "https://www.example.org", "https://www.example.net", ] async with aiohttp.ClientSession() as session: görevler = [sayfa_indir(session, url) for url in url_listesi] await asyncio.gather(*görevler) asyncio.run(main())
Bu kod, belirtilen URL’leri asenkron olarak indirir ve her birinin durum kodunu yazdırır.
34.7 asyncio
ile Görevlerin Zamanlanması
asyncio.create_task()
fonksiyonu, bir asenkron görevi zamanlamak için kullanılır. Bu, görevlerin başlatılmasını ve yönetilmesini sağlar. Aşağıdaki örnek, iki görevin nasıl zamanlanacağını göstermektedir:
pythonimport asyncio async def gorev1(): await asyncio.sleep(1) print("Görev 1 tamamlandı") async def gorev2(): await asyncio.sleep(2) print("Görev 2 tamamlandı") async def main(): task1 = asyncio.create_task(gorev1()) task2 = asyncio.create_task(gorev2()) await task1 await task2 asyncio.run(main())
Bu kod, gorev1
ve gorev2
fonksiyonlarını zamanlar ve her biri tamamlandığında ilgili mesajı yazdırır.
34.8 asyncio
ile CPU Yoğunluklu İşlemler
asyncio
, I/O yoğunluklu işlemler için idealdir, ancak CPU yoğunluklu işlemler için uygun değildir. CPU yoğunluklu işlemler için concurrent.futures
modülünü kullanarak işlemleri ayrı iş parçacıklarında veya işlemlerde çalıştırmak daha uygundur.
🚀 34. Python’da Asenkron Programlamanın İleri Düzey Konuları
34.1 Görevlerin Zaman Aşımı ile Sınırlandırılması
Asenkron görevlerin belirli bir süre içinde tamamlanmasını sağlamak için asyncio.wait_for()
fonksiyonu kullanılır. Bu, özellikle ağ istekleri gibi zaman alabilecek işlemlerde önemlidir.
pythonimport asyncio async def uzun_sureli_gorev(): await asyncio.sleep(5) return "Tamamlandı" async def main(): try: sonuc = await asyncio.wait_for(uzun_sureli_gorev(), timeout=3) print(sonuc) except asyncio.TimeoutError: print("Görev zaman aşımına uğradı.") asyncio.run(main())
Bu örnekte, uzun_sureli_gorev
fonksiyonu 5 saniye sürerken, wait_for
ile 3 saniyelik bir zaman aşımı belirlenmiştir. Görev bu süre içinde tamamlanmazsa, TimeoutError
istisnası yakalanır.
34.2 Görevlerin İptal Edilmesi
Asenkron görevler, belirli koşullar altında iptal edilebilir. Bu, özellikle kullanıcı müdahalesi veya belirli bir durumun gerçekleşmesi durumunda önemlidir.
pythonimport asyncio async def iptal_edilebilir_gorev(): try: while True: print("Görev çalışıyor...") await asyncio.sleep(1) except asyncio.CancelledError: print("Görev iptal edildi.") raise async def main(): gorev = asyncio.create_task(iptal_edilebilir_gorev()) await asyncio.sleep(3) gorev.cancel() try: await gorev except asyncio.CancelledError: print("Ana görev: Görev iptal edildi.") asyncio.run(main())
Bu kodda, iptal_edilebilir_gorev
fonksiyonu sürekli çalışırken, ana görev 3 saniye sonra bu görevi iptal eder.
34.3 Görev Grupları ile Yönetim
Python 3.11 ve sonrasında tanıtılan asyncio.TaskGroup
, birden fazla görevi birlikte yönetmek için kullanılır. Bu, görevlerin birlikte başlatılması ve hata yönetiminin merkezi olarak yapılmasını sağlar.
pythonimport asyncio async def gorev(numara): await asyncio.sleep(numara) print(f"Görev {numara} tamamlandı.") async def main(): async with asyncio.TaskGroup() as grup: for i in range(1, 4): grup.create_task(gorev(i)) asyncio.run(main())
Bu örnekte, üç görev aynı anda başlatılır ve her biri kendi süresine göre tamamlandığında mesaj yazdırılır.
34.4 Asenkron Kuyruklar ile Görev Sıralaması
asyncio.Queue
, görevlerin belirli bir sırayla işlenmesini sağlar. Bu, özellikle üretici-tüketici modellerinde kullanılır.
pythonimport asyncio async def uretici(kuyruk): for i in range(5): await kuyruk.put(i) print(f"Üretici: {i} eklendi.") await asyncio.sleep(1) async def tuketici(kuyruk): while True: veri = await kuyruk.get() print(f"Tüketici: {veri} alındı.") kuyruk.task_done() async def main(): kuyruk = asyncio.Queue() await asyncio.gather(uretici(kuyruk), tuketici(kuyruk)) asyncio.run(main())
Bu kodda, üretici görev kuyruğa veri eklerken, tüketici görev bu verileri alır ve işler.
34.5 Asenkron Kodlarda Hata Yönetimi
Asenkron fonksiyonlarda hata yönetimi, try-except
blokları ile yapılır. Bu, beklenmeyen durumların kontrol altına alınmasını sağlar.
pythonimport asyncio async def hata_veren_gorev(): await asyncio.sleep(1) raise ValueError("Bir hata oluştu.") async def main(): try: await hata_veren_gorev() except ValueError as e: print(f"Hata yakalandı: {e}") asyncio.run(main())
Bu örnekte, hata_veren_gorev
fonksiyonu bir hata fırlatır ve ana görev bu hatayı yakalar.
📁 34.9 Asenkron Dosya İşlemleri
Python’un asyncio
kütüphanesi, asenkron programlama için güçlü bir temel sağlar. Ancak, yerleşik open()
fonksiyonu ve dosya işlemleri senkron çalıştığından, bu işlemler asyncio
ile doğrudan asenkron hale getirilemez. Bu durumda, üçüncü taraf kütüphaneler devreye girer.
🔧 aiofiles
Kütüphanesi ile Asenkron Dosya İşlemleri
aiofiles
, dosya işlemlerini asenkron olarak gerçekleştirmek için kullanılan popüler bir üçüncü taraf kütüphanedir. Bu kütüphane, dosya okuma ve yazma işlemlerini async
/await
sözdizimiyle uyumlu hale getirir.
Kurulum
bashpip install aiofiles
Kullanım Örneği
pythonimport asyncio import aiofiles async def dosya_islemleri(): # Dosyaya yazma async with aiofiles.open('ornek.txt', mode='w') as dosya: await dosya.write('Merhaba, dünya!') # Dosyadan okuma async with aiofiles.open('ornek.txt', mode='r') as dosya: icerik = await dosya.read() print(icerik) asyncio.run(dosya_islemleri())
Bu örnekte, aiofiles.open()
fonksiyonu ile dosya işlemleri asenkron olarak gerçekleştirilir. Bu sayede, dosya işlemleri sırasında diğer görevlerin çalışmasına engel olunmaz.
Not:
aiofiles
, dosya işlemlerini arka planda ayrı bir iş parçacığında gerçekleştirerek asenkron hale getirir. Bu,asyncio
ile uyumlu bir şekilde çalışmasını sağlar.
🗄️ 34.10 Asenkron Veritabanı Bağlantıları
Asenkron programlama, veritabanı işlemlerinde de büyük avantajlar sağlar. Ancak, standart veritabanı kütüphaneleri genellikle senkron çalışır. Bu nedenle, asenkron veritabanı işlemleri için özel kütüphaneler kullanılır.
🐘 PostgreSQL için asyncpg
asyncpg
, PostgreSQL veritabanı ile asenkron bağlantı kurmak için kullanılan yüksek performanslı bir kütüphanedir.
Kurulum
bashpip install asyncpg
Kullanım Örneği
pythonimport asyncio import asyncpg async def veritabani_islemleri(): # Veritabanına bağlan conn = await asyncpg.connect(user='kullanici', password='sifre', database='veritabani', host='127.0.0.1') # Sorgu çalıştır deger = await conn.fetchval('SELECT 1') print(deger) # Bağlantıyı kapat await conn.close() asyncio.run(veritabani_islemleri())
Bu örnekte, asyncpg.connect()
fonksiyonu ile veritabanına asenkron olarak bağlanılır ve fetchval()
ile bir sorgu çalıştırılır.
🐍 SQLAlchemy ile Asenkron Veritabanı İşlemleri
SQLAlchemy, Python’da popüler bir ORM (Object-Relational Mapping) kütüphanesidir. SQLAlchemy 1.4 ve sonrasında, asenkron veritabanı işlemleri için destek eklenmiştir.
Kurulum
bashpip install sqlalchemy asyncpg
Kullanım Örneği
pythonimport asyncio from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker # Asenkron veritabanı motoru oluştur engine = create_async_engine('postgresql+asyncpg://kullanici:sifre@localhost/veritabani', echo=True) # Asenkron oturum oluşturucu AsyncSessionLocal = sessionmaker(engine, expire_on_commit=False, class_=AsyncSession) async def veritabani_islemleri(): async with AsyncSessionLocal() as session: # Veritabanı işlemleri burada gerçekleştirilir pass asyncio.run(veritabani_islemleri())
Bu yapı, SQLAlchemy’nin ORM özelliklerini asenkron programlama ile birleştirmenizi sağlar.
🔄 34.11 asyncio
ile Dosya ve Veritabanı İşlemlerinin Birlikte Kullanımı
Asenkron dosya ve veritabanı işlemlerini bir arada kullanarak, yüksek performanslı ve verimli uygulamalar geliştirebilirsiniz. Örneğin, bir dosyadan okunan verileri veritabanına asenkron olarak kaydetmek mümkündür.
pythonimport asyncio import aiofiles import asyncpg async def dosyadan_veritabani(): # Veritabanına bağlan conn = await asyncpg.connect(user='kullanici', password='sifre', database='veritabani', host='127.0.0.1') # Dosyadan oku ve veritabanına yaz async with aiofiles.open('veriler.txt', mode='r') as dosya: async for satir in dosya: await conn.execute('INSERT INTO tablo_adi (veri) VALUES ($1)', satir.strip()) # Bağlantıyı kapat await conn.close() asyncio.run(dosyadan_veritabani())
Bu örnekte, aiofiles
ile dosyadan satır satır okunan veriler, asyncpg
kullanılarak veritabanına asenkron olarak eklenir.
✅ 34.12 Sonuç
Asenkron programlama, dosya ve veritabanı işlemlerinde büyük avantajlar sağlar. aiofiles
, asyncpg
ve SQLAlchemy gibi kütüphaneler, bu işlemleri asenkron hale getirerek uygulamalarınızın performansını artırmanıza yardımcı olur. Bu araçları kullanarak, daha verimli ve ölçeklenebilir Python uygulamaları geliştirebilirsiniz.
⏰ 34.13 Zamanlayıcılar: Asenkron Zaman Tabanlı İşlemler
asyncio
modülü, zaman tabanlı işlemleri asenkron olarak gerçekleştirmek için çeşitli yöntemler sunar.
asyncio.sleep()
: Belirli Bir Süre Beklemek
pythonimport asyncio async def bekle(): print("Bekleme başlıyor...") await asyncio.sleep(2) print("2 saniye geçti.") asyncio.run(bekle())
Bu örnekte, await asyncio.sleep(2)
ifadesi, 2 saniyelik bir bekleme süresi oluşturur. Bu süre zarfında diğer asenkron görevler çalışmaya devam edebilir.
asyncio.call_later()
: Belirli Bir Süre Sonra Fonksiyon Çağırmak
pythonimport asyncio def zamanli_fonksiyon(): print("Bu mesaj 3 saniye sonra gösterildi.") loop = asyncio.get_event_loop() loop.call_later(3, zamanli_fonksiyon) loop.run_forever()
Bu kodda, zamanli_fonksiyon
fonksiyonu 3 saniye sonra çağrılır. call_later()
metodu, zamanlayıcı işlevi görür.
🛑 34.14 Sinyal İşleme: Sistem Sinyallerine Tepki Verme
asyncio
, sistem sinyallerini asenkron olarak işlemek için mekanizmalar sağlar. Bu, özellikle uygulamanın düzgün bir şekilde sonlandırılması veya belirli sinyallere tepki verilmesi gereken durumlarda kullanılır.
loop.add_signal_handler()
: Sinyal İşleyici Eklemek
pythonimport asyncio import signal def sinyal_yakalandi(): print("SIGINT sinyali alındı. Program sonlandırılıyor.") loop.stop() loop = asyncio.get_event_loop() loop.add_signal_handler(signal.SIGINT, sinyal_yakalandi) print("Program çalışıyor. Ctrl+C ile durdurabilirsiniz.") loop.run_forever()
Bu örnekte, SIGINT
(Ctrl+C) sinyali alındığında sinyal_yakalandi
fonksiyonu çağrılır ve program sonlandırılır.
Not: Windows işletim sisteminde sinyal işleme sınırlamaları olabilir. Bu nedenle, sinyal işleme kodları platforma özgü farklılıklar gösterebilir.
🧵 34.15 Alt Süreçlerin Yönetimi: asyncio.create_subprocess_exec()
asyncio
, alt süreçleri (subprocess) asenkron olarak başlatmak ve yönetmek için işlevler sunar. Bu, dış komutların çalıştırılması ve çıktılarının işlenmesi gibi durumlarda kullanılır.
asyncio.create_subprocess_exec()
: Alt Süreç Başlatmak
pythonimport asyncio async def alt_surec_calistir(): process = await asyncio.create_subprocess_exec( 'ls', '-l', stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE ) stdout, stderr = await process.communicate() print(f'[ÇIKIŞ KODU] {process.returncode}') print(f'[STDOUT]n{stdout.decode()}') print(f'[STDERR]n{stderr.decode()}') asyncio.run(alt_surec_calistir())
Bu kodda, ls -l
komutu asenkron olarak çalıştırılır ve çıktısı elde edilir. create_subprocess_exec()
fonksiyonu, alt süreci başlatır ve communicate()
metodu ile çıktılar alınır.
Not: Windows sistemlerinde
ls
komutu yerinedir
komutu kullanılabilir.
🔄 34.16 asyncio.run_in_executor()
: CPU Yoğunluklu İşlemleri Yönetmek
asyncio.run_in_executor()
fonksiyonu, CPU yoğunluklu veya bloklayıcı işlemleri ayrı bir iş parçacığında veya süreçte çalıştırmak için kullanılır. Bu sayede, ana asenkron döngü engellenmeden işlemler gerçekleştirilir.
Örnek: Bloklayıcı Fonksiyonu Asenkron Hale Getirmek
pythonimport asyncio import time def bloklayici_fonksiyon(): time.sleep(3) return "Bloklayıcı işlem tamamlandı." async def main(): loop = asyncio.get_running_loop() sonuc = await loop.run_in_executor(None, bloklayici_fonksiyon) print(sonuc) asyncio.run(main())
Bu örnekte, bloklayici_fonksiyon
adlı senkron fonksiyon, run_in_executor
ile ayrı bir iş parçacığında çalıştırılır. Bu sayede, ana asenkron döngü engellenmez.
✅ 34.17 Sonuç
Bu bölümde, Python’da asyncio
modülünü kullanarak zamanlayıcılar, sinyaller ve alt süreçlerin yönetimi gibi ileri düzey asenkron programlama konularını ele aldık. Bu konular, özellikle yüksek performanslı ve ölçeklenebilir uygulamalar geliştirmek isteyen geliştiriciler için önemlidir.
🌐 Web Geliştirme İçin Asenkron Kütüphaneler
1. aiohttp
Hem istemci hem de sunucu tarafında asenkron HTTP işlemleri için kullanılan bir kütüphanedir. Yüksek performanslı web uygulamaları geliştirmek için idealdir.
Kullanım Örneği:
pythonimport aiohttp import asyncio async def veri_getir(url): async with aiohttp.ClientSession() as oturum: async with oturum.get(url) as yanit: return await yanit.text() async def main(): icerik = await veri_getir('https://example.com') print(icerik) asyncio.run(main())
Bu örnekte, aiohttp
kullanılarak belirtilen URL’den asenkron olarak veri çekilmektedir.
2. FastAPI
Modern, hızlı (yüksek performanslı) web API’leri oluşturmak için kullanılan bir web framework’üdür. asyncio
ile tam uyumlu olup, otomatik olarak OpenAPI belgeleri oluşturur.
Kullanım Örneği:
pythonfrom fastapi import FastAPI app = FastAPI() @app.get("/") async def anasayfa(): return {"mesaj": "Merhaba, dünya!"}
Bu örnekte, FastAPI
kullanılarak basit bir GET endpoint’i tanımlanmıştır.
🗄️ Asenkron Veritabanı Kütüphaneleri
3. asyncpg
PostgreSQL veritabanı ile asenkron bağlantı kurmak için kullanılan yüksek performanslı bir kütüphanedir.
Kullanım Örneği:
pythonimport asyncpg import asyncio async def veritabani_islemi(): baglanti = await asyncpg.connect(user='kullanici', password='sifre', database='veritabani', host='127.0.0.1') deger = await baglanti.fetchval('SELECT 1') print(deger) await baglanti.close() asyncio.run(veritabani_islemi())
Bu örnekte, asyncpg
kullanılarak PostgreSQL veritabanına bağlanılmakta ve basit bir sorgu çalıştırılmaktadır.
4. aiomysql
MySQL veritabanı ile asenkron bağlantı kurmak için kullanılan bir kütüphanedir.
Kullanım Örneği:
pythonimport aiomysql import asyncio async def veritabani_islemi(): baglanti = await aiomysql.connect(host='127.0.0.1', port=3306, user='kullanici', password='sifre', db='veritabani') async with baglanti.cursor() as imlec: await imlec.execute("SELECT VERSION()") sonuc = await imlec.fetchone() print(sonuc) baglanti.close() asyncio.run(veritabani_islemi())
Bu örnekte, aiomysql
kullanılarak MySQL veritabanına bağlanılmakta ve versiyon bilgisi çekilmektedir.
🔄 Mesajlaşma ve Kuyruk Sistemleri
5. aio_pika
RabbitMQ gibi AMQP tabanlı mesajlaşma sistemleri ile asenkron iletişim kurmak için kullanılan bir kütüphanedir.
Kullanım Örneği:
pythonimport aio_pika import asyncio async def mesaj_gonder(): baglanti = await aio_pika.connect_robust("amqp://kullanici:sifre@localhost/") kanal = await baglanti.channel() kuyruk = await kanal.declare_queue("ornek_kuyruk", durable=True) await kanal.default_exchange.publish( aio_pika.Message(body=b"Merhaba, dünya!"), routing_key="ornek_kuyruk" ) await baglanti.close() asyncio.run(mesaj_gonder())
Bu örnekte, aio_pika
kullanılarak RabbitMQ’ya bir mesaj gönderilmektedir.
📁 Dosya İşlemleri
6. aiofiles
Dosya okuma ve yazma işlemlerini asenkron olarak gerçekleştirmek için kullanılan bir kütüphanedir.
Kullanım Örneği:
pythonimport aiofiles import asyncio async def dosya_islemi(): async with aiofiles.open('ornek.txt', mode='w') as dosya: await dosya.write('Merhaba, dünya!') asyncio.run(dosya_islemi())
Bu örnekte, aiofiles
kullanılarak bir dosyaya asenkron olarak yazı yazılmaktadır.
🔌 Diğer Faydalı Kütüphaneler
-
httpx: Asenkron HTTP istemcisi olarak kullanılabilir.
-
websockets: WebSocket protokolü ile asenkron iletişim kurmak için kullanılır.
-
trio: Alternatif bir asenkron programlama kütüphanesidir.
🧠 1. Gelişmiş Görev Yönetimi ve asyncio.gather()
asyncio.gather()
fonksiyonu, birden fazla coroutine’i eşzamanlı olarak çalıştırmak ve sonuçlarını toplamak için kullanılır.
Örnek:
pythonimport asyncio async def görev(numara): await asyncio.sleep(numara) return f"Görev {numara} tamamlandı" async def main(): sonuçlar = await asyncio.gather( görev(1), görev(2), görev(3) ) print(sonuçlar) asyncio.run(main())
Bu örnekte, üç görev eşzamanlı olarak başlatılır ve tamamlandıklarında sonuçları bir liste olarak döndürülür.
🔁 2. asyncio.Queue
ile Görev Kuyruğu Yönetimi
asyncio.Queue
, görevleri bir kuyrukta tutarak işçilerin bu görevleri alıp işlemesini sağlar. Bu yapı, üretici-tüketici senaryoları için idealdir.
Örnek:
pythonimport asyncio async def işçi(isim, kuyruk): while True: görev = await kuyruk.get() print(f"{isim} görevi alıyor: {görev}") await asyncio.sleep(1) print(f"{isim} görevi tamamladı: {görev}") kuyruk.task_done() async def main(): kuyruk = asyncio.Queue() # İşçileri başlat for i in range(3): asyncio.create_task(işçi(f"İşçi-{i+1}", kuyruk)) # Görevleri kuyruğa ekle for i in range(5): await kuyruk.put(f"Görev-{i+1}") await kuyruk.join() # Tüm görevler tamamlanana kadar bekle asyncio.run(main())
Bu örnekte, üç işçi eşzamanlı olarak kuyruğa eklenen görevleri alıp işler.
🧵 3. asyncio.to_thread()
ile Bloklayıcı Fonksiyonları Asenkron Hale Getirme
Python 3.9 ve sonrasında, asyncio.to_thread()
fonksiyonu ile senkron (bloklayıcı) fonksiyonları ayrı bir iş parçacığında çalıştırarak asenkron hale getirebilirsiniz.
Örnek:
pythonimport asyncio import time def bloklayici_fonksiyon(): time.sleep(2) return "Bloklayıcı işlem tamamlandı" async def main(): sonuç = await asyncio.to_thread(bloklayici_fonksiyon) print(sonuç) asyncio.run(main())
Bu örnekte, bloklayici_fonksiyon
ayrı bir iş parçacığında çalıştırılır ve ana asenkron döngü engellenmeden işlem devam eder.
🔄 4. asyncio.shield()
ile Görevlerin İptal Edilmesini Engelleme
asyncio.shield()
fonksiyonu, belirli bir coroutine’in iptal edilmesini engellemek için kullanılır.
Örnek:
pythonimport asyncio async def uzun_süreli_görev(): try: await asyncio.sleep(5) print("Görev tamamlandı") except asyncio.CancelledError: print("Görev iptal edildi") async def main(): görev = asyncio.create_task(uzun_süreli_görev()) await asyncio.sleep(1) görev.cancel() try: await asyncio.shield(görev) except asyncio.CancelledError: print("Shield bile görevi koruyamadı") asyncio.run(main())
Bu örnekte, uzun_süreli_görev
coroutine’i shield
ile korunmaya çalışılır, ancak görev iptal edildiği için CancelledError
yakalanır.
📚 5. asyncio.run()
ve Etkinlik Döngüsü Yönetimi
asyncio.run()
fonksiyonu, bir coroutine’i çalıştırmak için yeni bir etkinlik döngüsü oluşturur, çalıştırır ve döngüyü kapatır.
Örnek:
pythonimport asyncio async def merhaba(): print("Merhaba, asyncio!") asyncio.run(merhaba())
Bu örnekte, merhaba
coroutine’i asyncio.run()
ile çalıştırılır.
📦 1. Python Modülleri ve Paketler
✅ Modül Nedir?
Python’da bir modül, .py
uzantılı tek bir dosyadır ve bu dosya içinde tanımlı fonksiyonlar, sınıflar, değişkenler veya çalıştırılabilir kodlar bulunabilir.
örnek_modul.py
pythondef selamla(isim): print(f"Merhaba, {isim}!")
kullan.py
pythonimport ornek_modul ornek_modul.selamla("Zeynep")
📁 Paket Nedir?
Birden fazla modül dosyasını tek bir klasör altında toplamak ve bu klasörü kullanarak daha organize bir yapıya geçmek mümkündür. Bu klasöre paket denir. Paketler, genellikle bir __init__.py
dosyası içerir (bu dosya boş da olabilir).
Dizin Yapısı:
markdownprojem/ │ ├── __init__.py ├── modul1.py └── modul2.py
modul1.py
pythondef topla(a, b): return a + b
modul2.py
pythondef carp(a, b): return a * b
kullan.py
pythonfrom projem import modul1, modul2 print(modul1.topla(3, 5)) print(modul2.carp(4, 6))
🧱 2. Büyük Proje Yapısı (Python Proje Mimarisi)
Büyük bir Python projesinde düzeni sağlamak için klasör yapısı çok önemlidir. İşte standart bir proje yapısı:
markdownornek_proje/ ├── app/ │ ├── __init__.py │ ├── views.py │ ├── models.py │ └── controllers.py │ ├── tests/ │ ├── __init__.py │ └── test_models.py │ ├── requirements.txt ├── README.md └── main.py
Dosyaların İşlevleri:
-
app/: Ana uygulama dosyalarının yer aldığı dizin.
-
tests/: Test dosyaları.
-
requirements.txt: Kullanılan paketlerin listesi.
-
main.py: Uygulamanın çalıştırılacağı ana dosya.
🛠️ 3. __init__.py
Dosyasının Rolü
Bir klasörü Python paketi haline getirir. İçinde alt modülleri dışa aktarmak veya başlangıç kodları yazmak mümkündür.
python# __init__.py print("Paket başlatıldı")
Bu dosya boş olabilir ama genellikle içe aktarılan modülleri tek noktada kontrol etmek için kullanılır:
pythonfrom .modul1 import topla from .modul2 import carp
📚 4. if __name__ == "__main__"
Kullanımı
Python dosyalarının hem modül olarak hem de doğrudan çalıştırılabilir olması için kullanılır:
pythondef ana_fonksiyon(): print("Program çalıştı!") if __name__ == "__main__": ana_fonksiyon()
Bu kod, dosya doğrudan çalıştırıldığında ana_fonksiyon()
’u çağırır ama başka bir dosyada import edildiğinde çalışmaz.
🔄 5. Paket Yöneticileri ve pip
Bir projede ihtiyaç duyulan tüm bağımlılıkları requirements.txt
dosyasıyla tanımlayıp şu komutla yükleyebilirsin:
bashpip install -r requirements.txt
Örnek requirements.txt
:
inirequests==2.31.0 aiohttp==3.8.6 fastapi==0.110.0
🧠 1. Nesne Yönelimli Programlamaya Giriş
🚀 OOP Nedir?
Nesne Yönelimli Programlama, yazılımı nesneler (object) ve bu nesnelere ait davranışlar (method) etrafında şekillendirir. Python bu paradigmayı destekler ve oldukça esnek bir şekilde kullanmamıza olanak tanır.
🧱 2. Sınıf (Class) ve Nesne (Object)
✅ Sınıf Tanımı
pythonclass Araba: def __init__(self, marka, model): self.marka = marka self.model = model def bilgi_goster(self): print(f"Araba: {self.marka} {self.model}")
✅ Nesne Oluşturma
pythonarac1 = Araba("Toyota", "Corolla") arac1.bilgi_goster() # Çıktı: Araba: Toyota Corolla
🔧 3. __init__
ve self
Nedir?
-
__init__
: Nesne oluşturulduğunda otomatik olarak çalışan yapıcı (constructor) fonksiyondur. -
self
: Sınıf içindeki her metoda nesnenin kendisini referans olarak verir.
🧩 4. Nitelikler (Attributes) ve Metotlar (Methods)
📌 Nitelik: Nesneye ait veri
pythonarac1.marka # "Toyota"
📌 Metot: Nesneye ait işlev
pythonarac1.bilgi_goster()
🔁 5. Miras Alma (Inheritance)
Bir sınıf başka bir sınıftan türeyebilir. Bu, kodun yeniden kullanılmasını sağlar.
pythonclass ElektrikliAraba(Araba): def __init__(self, marka, model, batarya): super().__init__(marka, model) self.batarya = batarya def batarya_bilgisi(self): print(f"Batarya kapasitesi: {self.batarya} kWh")
pythontesla = ElektrikliAraba("Tesla", "Model S", 100) tesla.bilgi_goster() tesla.batarya_bilgisi()
🔁 6. Metot Geçersiz Kılma (Override)
Alt sınıfta, üst sınıftaki bir metodu aynı isimle yeniden tanımlayarak geçersiz kılabilirsin.
pythonclass ElektrikliAraba(Araba): def bilgi_goster(self): print(f"Elektrikli Araba: {self.marka} {self.model}")
🔐 7. Kapsülleme (Encapsulation)
Verileri dış müdahaleden korumak için nitelikleri özel hale getirebilirsin.
pythonclass Kisi: def __init__(self, isim, yas): self.isim = isim self.__yas = yas # __ ile başlayan nitelikler private olur def yas_goster(self): print(f"Yaş: {self.__yas}")
pythonali = Kisi("Ali", 30) ali.yas_goster() # Yaş: 30 print(ali.__yas) # AttributeError: 'Kisi' object has no attribute '__yas'
🧩 8. Polimorfizm (Çok Biçimlilik)
Farklı sınıflardaki aynı isimli metodlar farklı şekillerde davranabilir.
pythonclass Kedi: def ses_cikar(self): print("Miyav!") class Kopek: def ses_cikar(self): print("Hav hav!") def ses_ver(hayvan): hayvan.ses_cikar() kedi = Kedi() kopek = Kopek() ses_ver(kedi) # Miyav! ses_ver(kopek) # Hav hav!
🧠 9. @property
ve getter/setter
Veriye erişimi kontrol etmek için @property
dekoratörü kullanılır.
pythonclass Calisan: def __init__(self, isim): self._isim = isim @property def isim(self): return self._isim.upper() @isim.setter def isim(self, deger): self._isim = deger c = Calisan("ahmet") print(c.isim) # AHMET c.isim = "mehmet" print(c.isim) # MEHMET
🧼 10. Sınıf ve Statik Metotlar
-
@classmethod
: Sınıfın kendisini parametre olarak alır (cls
). -
@staticmethod
: Sınıfla ilişkili ama bağımsız işlemler için kullanılır.
pythonclass Matematik: @staticmethod def topla(a, b): return a + b print(Matematik.topla(5, 3)) # 8
🏗️ 1. Katmanlı Yazılım Mimarisi Nedir?
Python’da büyük projeler genellikle katmanlı mimari (layered architecture) ile geliştirilir. Bu mimaride, her katman belirli bir görevi üstlenir.
🔧 Katmanlar:
-
Model (Veri Katmanı): Veritabanı işlemleri, veri modeli.
-
Controller (İş Katmanı): İş kuralları, işlemler, algoritmalar.
-
View (Sunum Katmanı): Kullanıcıya gösterilen çıktı (CLI, API, Web vs.).
🧱 2. MVC Mimarisi ile Python Projesi
Model-View-Controller (MVC), uygulamayı bölerek geliştirilebilirlik ve test edilebilirlik sağlar.
🎯 Amaç:
-
Kod tekrarını azaltmak
-
Test edilebilirliği artırmak
-
Bakımı kolaylaştırmak
📁 Örnek Dizin Yapısı:
cssproje_mvc/ ├── models/ │ └── kullanici.py ├── controllers/ │ └── kullanici_controller.py ├── views/ │ └── arayuz.py └── main.py
📦 3. Model: models/kullanici.py
pythonclass Kullanici: def __init__(self, isim, yas): self.isim = isim self.yas = yas
🔁 4. Controller: controllers/kullanici_controller.py
pythonfrom models.kullanici import Kullanici class KullaniciController: def __init__(self): self.kullanicilar = [] def kullanici_ekle(self, isim, yas): yeni_kullanici = Kullanici(isim, yas) self.kullanicilar.append(yeni_kullanici) def listele(self): return self.kullanicilar
🖥️ 5. View: views/arayuz.py
pythondef kullanici_goster(kullanici): print(f"Kullanıcı: {kullanici.isim} ({kullanici.yas} yaşında)")
🧪 6. main.py: Uygulamanın Giriş Noktası
pythonfrom controllers.kullanici_controller import KullaniciController from views.arayuz import kullanici_goster def main(): kontrol = KullaniciController() kontrol.kullanici_ekle("Ayşe", 25) kontrol.kullanici_ekle("Mehmet", 30) for k in kontrol.listele(): kullanici_goster(k) if __name__ == "__main__": main()
🟢 Bu yapı, küçük bir terminal uygulaması için MVC mimarisine uygun bir Python projesinin temel örneğidir.
🗄️ 7. SQLite ile Veritabanı Entegrasyonu
Python’da hafif bir veritabanı olarak SQLite oldukça popülerdir.
Bağlantı Kurma ve Tablo Oluşturma:
pythonimport sqlite3 conn = sqlite3.connect("veritabani.db") cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS kullanicilar ( id INTEGER PRIMARY KEY AUTOINCREMENT, isim TEXT NOT NULL, yas INTEGER NOT NULL ) ''') conn.commit() conn.close()
💾 8. Veritabanı ile CRUD İşlemleri
Kayıt Ekleme:
pythondef kullanici_ekle(isim, yas): conn = sqlite3.connect("veritabani.db") cursor = conn.cursor() cursor.execute("INSERT INTO kullanicilar (isim, yas) VALUES (?, ?)", (isim, yas)) conn.commit() conn.close()
Listeleme:
pythondef kullanicilari_getir(): conn = sqlite3.connect("veritabani.db") cursor = conn.cursor() cursor.execute("SELECT * FROM kullanicilar") veriler = cursor.fetchall() conn.close() return veriler
🚀 9. Flask ile API (İleri Seviye)
İlerleyen bölümlerde bu yapıyı Flask veya FastAPI ile REST API’ye dönüştüreceğiz.
🌐 1. Flask Nedir?
Flask, Python ile yazılmış hafif bir web framework’tür. Minimalist yapısı sayesinde, küçük uygulamalardan büyük projelere kadar esnek bir kullanım sunar.
🔧 Flask Kurulumu
bashpip install flask
🚀 2. Basit Bir Flask Uygulaması
app.py
pythonfrom flask import Flask app = Flask(__name__) @app.route("/") def anasayfa(): return "Merhaba Flask!" if __name__ == "__main__": app.run(debug=True)
🟢 python app.py
komutuyla çalıştır → tarayıcıda http://localhost:5000
aç.
📦 3. Route (Yol) Kavramı
Flask’ta her URL bir route (yol) ile eşleştirilir.
python@app.route("/hakkinda") def hakkinda(): return "Bu bir hakkımızda sayfasıdır."
📥 4. Dinamik URL Kullanımı
python@app.route("/kullanici/<isim>") def selamla(isim): return f"Merhaba {isim.capitalize()}!"
http://localhost:5000/kullanici/ahmet
→ Merhaba Ahmet!
📡 5. JSON API Oluşturma
pythonfrom flask import jsonify @app.route("/api/mesaj") def mesaj(): return jsonify({"durum": "başarılı", "mesaj": "API çalışıyor!"})
Tarayıcıda http://localhost:5000/api/mesaj
çağrıldığında JSON dönülür.
🔁 6. GET ve POST İşlemleri
POST isteği alalım:
pythonfrom flask import request @app.route("/api/ekle", methods=["POST"]) def veri_ekle(): data = request.json isim = data.get("isim") return jsonify({"mesaj": f"{isim} eklendi."})
POSTman veya JavaScript üzerinden şu şekilde istek atılabilir:
json{ "isim": "Zeynep" }
🧩 7. Flask ile MVC Yapısı
Flask projelerinde yapı genelde şu şekilde olur:
arduinoproje/ ├── app/ │ ├── __init__.py │ ├── routes.py │ ├── models.py │ └── controllers.py ├── run.py └── requirements.txt
🔐 8. JWT ile Kimlik Doğrulama (Giriş)
pyjwt
Kurulumu:
bashpip install PyJWT
Token Üretme:
pythonimport jwt import datetime SECRET_KEY = "gizli_anahtar" def token_uret(kullanici_adi): payload = { "kullanici": kullanici_adi, "exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=30) } return jwt.encode(payload, SECRET_KEY, algorithm="HS256")
Token Doğrulama:
pythondef token_kontrol(token): try: data = jwt.decode(token, SECRET_KEY, algorithms=["HS256"]) return data except jwt.ExpiredSignatureError: return "Token süresi doldu" except jwt.InvalidTokenError: return "Geçersiz token"
🔒 9. Güvenlik için Token Kullanımı
python@app.route("/api/korumali") def korumali(): token = request.headers.get("Authorization") sonuc = token_kontrol(token) if isinstance(sonuc, dict): return jsonify({"mesaj": f"Merhaba {sonuc['kullanici']}"}) else: return jsonify({"hata": sonuc}), 401
🧪 10. Postman ile Test Etme
Flask ile geliştirdiğin her API endpoint’ini Postman gibi araçlarla test edebilirsin. JSON gönderip, header ekleyip, token doğrulama gibi işlemler için birebir.
Bu bölümde şunları öğrendik:
-
Flask ile web uygulaması kurmak
-
JSON API oluşturmak
-
MVC yapısında Flask kullanımı
-
JWT ile kullanıcı doğrulama
🗃️ 1. Flask + SQLAlchemy ile Veritabanı Kullanımı
Flask içinde veritabanı işlemleri için en çok kullanılan ORM (Object Relational Mapping) aracı: SQLAlchemy’dir.
🔧 Kurulum:
bashpip install flask_sqlalchemy
📁 Dosya Yapısı:
arduinoproje/ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── routes.py ├── run.py
🔌 app/__init__.py
– Uygulama Başlatma
pythonfrom flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///veritabani.db" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db.init_app(app) from app.routes import bp app.register_blueprint(bp) return app
📄 app/models.py
– Veri Modelleri
pythonfrom app import db class Kullanici(db.Model): id = db.Column(db.Integer, primary_key=True) isim = db.Column(db.String(100), nullable=False) yas = db.Column(db.Integer, nullable=False)
📄 app/routes.py
– API Yolları
pythonfrom flask import Blueprint, request, jsonify from app import db from app.models import Kullanici bp = Blueprint("routes", __name__) @bp.route("/api/kullanici", methods=["POST"]) def kullanici_ekle(): data = request.json yeni = Kullanici(isim=data["isim"], yas=data["yas"]) db.session.add(yeni) db.session.commit() return jsonify({"mesaj": "Kullanıcı eklendi."}) @bp.route("/api/kullanicilar", methods=["GET"]) def kullanici_listele(): kisiler = Kullanici.query.all() return jsonify([{"id": k.id, "isim": k.isim, "yas": k.yas} for k in kisiler])
🏃 run.py
– Projeyi Başlat
pythonfrom app import create_app, db app = create_app() with app.app_context(): db.create_all() if __name__ == "__main__": app.run(debug=True)
🧾 2. Flask ile Form Verisi Alma
HTML formu ile veri gönderdiğinde request.form
üzerinden veriye ulaşabilirsin.
pythonfrom flask import request @app.route("/form", methods=["POST"]) def form_al(): ad = request.form.get("ad") return f"Merhaba {ad}"
⚠️ 3. Hata Yönetimi (Error Handling)
Flask’ta hata durumlarına özel tepkiler verebilirsin.
python@app.errorhandler(404) def sayfa_bulunamadi(e): return jsonify({"hata": "Sayfa bulunamadı!"}), 404 @app.errorhandler(500) def sunucu_hatasi(e): return jsonify({"hata": "Sunucu hatası!"}), 500
🧩 4. Blueprint ile Modüler Yapı
Büyük projelerde her bölüm için ayrı Blueprint
oluşturmak işleri kolaylaştırır.
🔷 routes.py
pythonfrom flask import Blueprint bp = Blueprint("ana", __name__) @bp.route("/") def anasayfa(): return "Anasayfa"
📦 Blueprint’i Uygulamaya Dahil Et
pythonapp.register_blueprint(bp, url_prefix="/")
🔐 5. Basit Kullanıcı Girişi
JWT kullanmadan, session tabanlı örnek giriş sistemi:
pythonfrom flask import session @app.route("/giris", methods=["POST"]) def giris(): data = request.json if data["kullanici"] == "admin" and data["sifre"] == "123": session["giris"] = True return jsonify({"mesaj": "Giriş başarılı."}) return jsonify({"hata": "Geçersiz bilgiler"}), 401
python@app.route("/panel") def panel(): if session.get("giris"): return "Yönetim Paneli" return "Lütfen giriş yapınız.", 403
🛠️ 6. Projeyi Geliştirme İpuçları
✅ Her modül (model, view, controller) için ayrı dosya
✅ Gelişmiş hatalar için logging
modülü
✅ Formlar için Flask-WTF
kullanabilirsin
✅ Oturum yönetimi için Flask-Login
önerilir
Bu bölümde:
-
SQLAlchemy ile veritabanı bağlantısı
-
Blueprint ile modüler yapı
-
Form verisi alma
-
Hata yönetimi
-
Flask ile temel giriş sistemi
gibi temel yapı taşlarını oluşturduk.
🌐 1. Flask + Jinja2 ile Dinamik Web Sayfaları
Flask, varsayılan olarak Jinja2 şablon motorunu kullanır. Bu sayede Python verilerini HTML içinde kolayca gösterebiliriz.
📁 Klasör Yapısı:
csharpproje/ ├── templates/ │ ├── base.html │ └── index.html ├── static/ │ └── style.css └── app.py
🧱 2. templates/base.html
– Temel Şablon
html<!DOCTYPE html> <html lang="tr"> <head> <meta charset="UTF-8"> <title>{% block title %}Başlık{% endblock %}</title> <link rel="stylesheet" href="/static/style.css"> </head> <body> <header><h1>Python Web Uygulaması</h1></header> <main> {% block content %}{% endblock %} </main> </body> </html>
📄 3. templates/index.html
– Ana Sayfa
html{% extends "base.html" %} {% block title %}Anasayfa{% endblock %} {% block content %} <h2>Hoş geldiniz, {{ kullanici }}!</h2> {% endblock %}
🚀 4. app.py
– Flask Uygulaması
pythonfrom flask import Flask, render_template app = Flask(__name__) @app.route("/") def anasayfa(): return render_template("index.html", kullanici="Zeynep") if __name__ == "__main__": app.run(debug=True)
🎨 5. static/style.css
– Stil Dosyası
cssbody { font-family: Arial; background-color: #f9f9f9; padding: 20px; } h1 { color: #444; }
📋 6. Form Oluşturma ve İşleme
templates/form.html
html{% extends "base.html" %} {% block content %} <form method="POST" action="/form"> <label>Adınız:</label> <input type="text" name="ad"> <input type="submit" value="Gönder"> </form> {% endblock %}
Flask ile Form Verisini Alma
pythonfrom flask import request @app.route("/form", methods=["GET", "POST"]) def form(): if request.method == "POST": ad = request.form.get("ad") return f"Merhaba {ad}" return render_template("form.html")
⚡ 7. AJAX ile Dinamik Veri Getirme (jQuery)
HTML – templates/ajax.html
html{% extends "base.html" %} {% block content %} <button onclick="veriGetir()">Veri Getir</button> <p id="sonuc"></p> <script> function veriGetir() { fetch("/api/data") .then(res => res.json()) .then(data => { document.getElementById("sonuc").innerText = data.mesaj; }); } </script> {% endblock %}
Flask API – AJAX Endpoint
python@app.route("/api/data") def ajax_data(): return {"mesaj": "AJAX ile veri başarıyla alındı!"}
📦 8. Bootstrap ile Hızlı Tasarım
HTML sayfalarına Bootstrap ekleyerek hızlı ve modern arayüzler oluşturabilirsin.
html<head> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head>
Ve ardından:
html<button class="btn btn-primary">Kaydet</button>
🧪 9. Projeyi Geliştirme Önerileri
-
Jinja2 ile
for
,if
,include
,macro
gibi yapıları öğren -
Formlar için
Flask-WTF
kullan -
Javascript ile frontend dinamikliğini artır
-
AJAX ile sayfa yenilemeden veri gönder/al
Bu bölümde:
🔹 Flask + Jinja2 ile dinamik HTML oluşturmayı
🔹 CSS & Bootstrap ile görünüm eklemeyi
🔹 Form gönderimi
🔹 AJAX ile sayfa yenilemeden veri getirmeyi öğrendin.
✅ 1. Flask-WTF ile Form Doğrulama
🔧 Kurulum:
bashpip install flask-wtf
📄 forms.py
pythonfrom flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Length class LoginForm(FlaskForm): kullanici_adi = StringField("Kullanıcı Adı", validators=[DataRequired()]) sifre = PasswordField("Şifre", validators=[DataRequired(), Length(min=3)]) submit = SubmitField("Giriş Yap")
📄 HTML Şablon – login.html
html<form method="POST"> {{ form.hidden_tag() }} <div> {{ form.kullanici_adi.label }} {{ form.kullanici_adi }} </div> <div> {{ form.sifre.label }} {{ form.sifre }} </div> {{ form.submit }} </form>
📄 routes.py
– Formu Kullanma
pythonfrom flask import render_template, redirect, url_for from app.forms import LoginForm @app.route("/giris", methods=["GET", "POST"]) def giris(): form = LoginForm() if form.validate_on_submit(): if form.kullanici_adi.data == "admin" and form.sifre.data == "123": return redirect(url_for("panel")) return render_template("login.html", form=form)
🔐 2. Flask-Login ile Oturum Yönetimi
🔧 Kurulum:
bashpip install flask-login
📄 Uygulama Ayarları
pythonfrom flask_login import LoginManager login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = "giris"
📄 models.py
– Kullanıcı Modeli
pythonfrom flask_login import UserMixin class Kullanici(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) kullanici_adi = db.Column(db.String(100), unique=True, nullable=False) sifre = db.Column(db.String(100), nullable=False)
📄 Kullanıcı Yükleyici
python@login_manager.user_loader def load_user(user_id): return Kullanici.query.get(int(user_id))
📄 Giriş-Çıkış
pythonfrom flask_login import login_user, logout_user, login_required @app.route("/giris", methods=["GET", "POST"]) def giris(): # kullanıcı kontrolü kullanici = Kullanici.query.filter_by(kullanici_adi=form.kullanici_adi.data).first() if kullanici and kullanici.sifre == form.sifre.data: login_user(kullanici) return redirect(url_for("panel")) @app.route("/cikis") @login_required def cikis(): logout_user() return redirect(url_for("giris")) @app.route("/panel") @login_required def panel(): return "Giriş yapıldı, hoş geldin!"
✅ 3. Mini Proje: Görev Listesi (To-Do App)
📄 models.py
pythonclass Gorev(db.Model): id = db.Column(db.Integer, primary_key=True) aciklama = db.Column(db.String(200), nullable=False) tamamlandi = db.Column(db.Boolean, default=False)
📄 routes.py
python@app.route("/gorevler") def gorevler(): liste = Gorev.query.all() return render_template("gorevler.html", liste=liste) @app.route("/ekle", methods=["POST"]) def ekle(): aciklama = request.form.get("aciklama") yeni = Gorev(aciklama=aciklama) db.session.add(yeni) db.session.commit() return redirect("/gorevler") @app.route("/sil/<int:id>") def sil(id): g = Gorev.query.get(id) db.session.delete(g) db.session.commit() return redirect("/gorevler")
📄 HTML – gorevler.html
html<h2>Görev Listesi</h2> <form method="POST" action="/ekle"> <input name="aciklama" placeholder="Yeni görev"> <button type="submit">Ekle</button> </form> <ul> {% for g in liste %} <li>{{ g.aciklama }} <a href="/sil/{{ g.id }}">❌</a></li> {% endfor %} </ul>
💡 4. Projeyi Yayına Hazırlamak
-
app.config["SECRET_KEY"]
ayarla -
debug=False
ile çalıştır -
gunicorn
,docker
, veyarender.com
gibi servislerle dağıtım yap
Bu bölümde:
🔐 Kullanıcı girişi
📋 Form doğrulama
📦 Oturum yönetimi
📝 Basit bir görev listesi uygulaması
yaparak, tam anlamıyla web uygulaması yazmaya başladın.
📡 1. RESTful API Mimarisi
RESTful API’ler, client-server iletişimini sade ve organize hale getirir. İşte Flask ile basit bir görev API’si örneği:
📁 routes_api.py
pythonfrom flask import Blueprint, request, jsonify from app.models import Gorev from app import db api = Blueprint("api", __name__) @api.route("/api/gorevler", methods=["GET"]) def gorevleri_getir(): gorevler = Gorev.query.all() return jsonify([{"id": g.id, "aciklama": g.aciklama} for g in gorevler]) @api.route("/api/gorev", methods=["POST"]) def gorev_ekle(): data = request.json yeni = Gorev(aciklama=data["aciklama"]) db.session.add(yeni) db.session.commit() return jsonify({"mesaj": "Görev eklendi", "id": yeni.id})
🔗 Blueprint’e Dahil Et
pythonfrom app.routes_api import api app.register_blueprint(api)
🖼️ 2. Flask ile Dosya Yükleme
📄 HTML – upload.html
html<form method="POST" enctype="multipart/form-data"> <input type="file" name="dosya"> <input type="submit" value="Yükle"> </form>
📄 Flask Route
pythonimport os from werkzeug.utils import secure_filename UPLOAD_KLASORU = "uploads" app.config["UPLOAD_FOLDER"] = UPLOAD_KLASORU @app.route("/yukle", methods=["GET", "POST"]) def dosya_yukle(): if request.method == "POST": dosya = request.files["dosya"] ad = secure_filename(dosya.filename) yol = os.path.join(app.config["UPLOAD_FOLDER"], ad) dosya.save(yol) return f"Dosya yüklendi: {ad}" return render_template("upload.html")
📸 3. Yüklenen Görselleri Gösterme
Flask ile statik dosyaları göstermek çok kolaydır. Yüklenen klasörü /static/uploads
gibi yaparsan, erişim doğrudan sağlanabilir:
html<img src="{{ url_for('static', filename='uploads/resim1.png') }}">
🔐 4. Rol Bazlı Yetkilendirme
Bazı sayfaların sadece admin tarafından erişilebilmesini sağlamak için kullanıcı rollerini kontrol ederiz.
📄 models.py
pythonclass Kullanici(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) kullanici_adi = db.Column(db.String(100)) sifre = db.Column(db.String(100)) rol = db.Column(db.String(20), default="user") # admin veya user
📄 Örnek Kullanım
pythonfrom flask_login import current_user @app.route("/admin") @login_required def admin_panel(): if current_user.rol != "admin": return "Yetkisiz erişim", 403 return "Admin paneline hoş geldiniz"
📧 5. Flask ile E-posta Gönderimi
🔧 Kurulum
bashpip install flask-mail
📄 Ayarlar
pythonfrom flask_mail import Mail, Message app.config["MAIL_SERVER"] = "smtp.gmail.com" app.config["MAIL_PORT"] = 587 app.config["MAIL_USE_TLS"] = True app.config["MAIL_USERNAME"] = "youremail@gmail.com" app.config["MAIL_PASSWORD"] = "yourpassword" mail = Mail(app)
📤 Mail Gönderimi
python@app.route("/mail") def mail_gonder(): msg = Message("Merhaba", sender="youremail@gmail.com", recipients=["kisi@example.com"]) msg.body = "Bu bir Flask Mail testidir." mail.send(msg) return "E-posta gönderildi!"
⚠️ Gmail veya diğer servislerde uygulama şifreleri kullanman gerekebilir.
🔧 6. İleri Seviye Geliştirme Önerileri
-
API’lerde JWT Authentication (Flask-JWT-Extended)
-
Frontend tarafı için Vue.js, React veya HTMX
-
Dosya yüklerken uzantı ve boyut kontrolü
-
Kullanıcı kayıt onayı için e-posta doğrulama
-
Hata loglama için
logging
modülü
Bu bölümde:
-
RESTful API mimarisi
-
Dosya yükleme ve gösterme
-
Rol bazlı erişim kontrolü
-
Flask ile e-posta gönderimi
gibi web projelerinde çok işe yarayan yetenekleri öğrendik.
🎯 Bu bölümde neler var?
✅ Flask ile büyük proje yapısı
✅ Kullanıcı kayıt & giriş sistemi
✅ Şifre sıfırlama (e-posta ile)
✅ API dokümantasyonu (Swagger UI)
✅ Test yazma ve hata takibi
✅ Deploy (yayına alma) rehberi
🏗️ 1. Profesyonel Proje Mimarisi
Flask’ta her şey tek bir dosyada olmaz. Büyük projelerde yapı şöyle olur:
arduinoproje/ ├── app/ │ ├── __init__.py │ ├── routes/ │ │ ├── auth.py │ │ ├── main.py │ │ └── api.py │ ├── templates/ │ ├── static/ │ ├── models.py │ ├── forms.py ├── config.py ├── run.py └── requirements.txt
🔄 2. app/__init__.py
– Uygulama Kurulumu
pythonfrom flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager from flask_mail import Mail db = SQLAlchemy() login_manager = LoginManager() mail = Mail() def create_app(): app = Flask(__name__) app.config.from_object("config.Config") db.init_app(app) login_manager.init_app(app) mail.init_app(app) from app.routes.auth import auth from app.routes.main import main from app.routes.api import api app.register_blueprint(auth) app.register_blueprint(main) app.register_blueprint(api, url_prefix="/api") return app
👤 3. Kullanıcı Kayıt & Giriş Sistemi
Kayıt formu: forms.py
Kullanıcı modeli: models.py
Giriş/çıkış route’ları: routes/auth.py
🔑 Şifreleme İçin:
bashpip install werkzeug
pythonfrom werkzeug.security import generate_password_hash, check_password_hash
📄 Kayıt Örneği
pythonyeni_kullanici = Kullanici( kullanici_adi=form.kullanici_adi.data, sifre=generate_password_hash(form.sifre.data) )
🔁 4. Şifre Sıfırlama (Token + E-posta)
📄 Token Oluştur
pythonfrom itsdangerous import URLSafeTimedSerializer s = URLSafeTimedSerializer(app.config["SECRET_KEY"]) token = s.dumps(user.email, salt="sifre-sifirla")
📄 Token Doğrulama
pythonemail = s.loads(token, salt="sifre-sifirla", max_age=3600)
📧 E-posta ile Link Gönder
pythonmsg = Message("Şifre sıfırlama", recipients=[user.email]) msg.body = f"Şifre sıfırlama bağlantısı: http://site.com/sifirla/{token}" mail.send(msg)
📘 5. API Dokümantasyonu (Swagger UI)
🔧 Kurulum
bashpip install flask-restx
📄 Basit Kullanım
pythonfrom flask_restx import Api, Resource api_blueprint = Blueprint("api", __name__) api = Api(api_blueprint, doc="/docs") @api.route("/selam") class Selam(Resource): def get(self): return {"mesaj": "Merhaba Swagger!"}
Swagger UI: http://localhost:5000/docs
✅ 6. Test Yazmak (unittest)
pythonimport unittest from app import create_app class TestApp(unittest.TestCase): def setUp(self): self.app = create_app().test_client() def test_anasayfa(self): res = self.app.get("/") self.assertEqual(res.status_code, 200)
bashpython -m unittest discover
🚀 7. Deploy – Flask Uygulamasını Yayına Almak
🔧 1. requirements.txt
Oluştur
bashpip freeze > requirements.txt
🔧 2. WSGI Dosyası – run.py
pythonfrom app import create_app app = create_app()
☁️ 3. Deploy Araçları
-
Render.com (ücretsiz, kolay)
-
Vercel (FastAPI için)
-
Heroku (artık sınırlı)
-
DigitalOcean / AWS / Docker
🔁 Sonraki Adımlar İçin Öneriler
✔ React veya Vue ile REST API kullan
✔ Flask-Admin veya custom admin panel
✔ Kullanıcı eylem log’ları
✔ Flask ile PDF, grafik, veri analiz
✔ Versiyonlama ve CI/CD kullan (GitHub Actions)
Bu bölümlerle beraber:
🔧 Projeyi büyük yapıya taşıdın
📧 E-posta sistemi kurdun
🔐 Güvenli kullanıcı sistemine geçtin
🧪 Test ve dokümantasyon ekledin
🚀 Yayınlama işlemini öğrendin
📊 Python ile Veri Analizi ve Görselleştirme
1️⃣ Pandas ile Veri Analizi
📦 Pandas Nedir?
Pandas, Python’da veri analizini kolaylaştıran bir kütüphanedir. Genellikle CSV, Excel gibi dosyaları okur ve tablo gibi işlememizi sağlar.
🔧 Kurulum
bashpip install pandas
📄 CSV Okuma
pythonimport pandas as pd veri = pd.read_csv("veriler.csv") print(veri.head()) # İlk 5 satırı göster
📊 Temel İşlemler
pythonprint(veri.columns) # Sütun adları print(veri.describe()) # İstatistiksel özet print(veri["Yaş"].mean()) # Yaş ortalaması
2️⃣ Matplotlib ile Grafik Çizme
📦 Kurulum
bashpip install matplotlib
📈 Temel Grafik
pythonimport matplotlib.pyplot as plt yas = [22, 25, 30, 27, 29] maas = [3000, 3500, 4000, 3700, 3900] plt.plot(yas, maas) plt.xlabel("Yaş") plt.ylabel("Maaş") plt.title("Yaşa Göre Maaş Dağılımı") plt.grid(True) plt.show()
3️⃣ Seaborn ile Gelişmiş Görselleştirme
Seaborn, Matplotlib üzerine inşa edilmiştir ama daha şık ve istatistiksel grafikler için idealdir.
🔧 Kurulum
bashpip install seaborn
📊 Örnek: Kategorik Veri Çizimi
pythonimport seaborn as sns veri = pd.read_csv("tips.csv") sns.barplot(x="day", y="total_bill", data=veri) plt.title("Günlere Göre Fatura Tutarı") plt.show()
4️⃣ Pandas ile Veri Temizleme
Veri setleri genellikle eksik ya da kirli olur. İşte yaygın temizlik işlemleri:
pythonveri.dropna(inplace=True) # Eksik verileri sil veri.fillna(0, inplace=True) # Eksik verileri 0 ile doldur veri["Yaş"] = veri["Yaş"].astype(int) # Veri tipi değiştir
📘 5. Proje: Öğrenci Başarı Analizi
Bir ogrenciler.csv
dosyasını analiz edelim:
csvisim,not1,not2,proje Ali,70,80,90 Ayşe,85,78,88 Can,60,65,70
📄 Python Kodu
pythondf = pd.read_csv("ogrenciler.csv") df["ortalama"] = (df["not1"] + df["not2"] + df["proje"]) / 3 df["durum"] = df["ortalama"].apply(lambda x: "Geçti" if x >= 70 else "Kaldı") print(df) sns.histplot(df["ortalama"], bins=5, kde=True) plt.title("Ortalama Not Dağılımı") plt.show()
🧠 Neler Öğrendik?
-
Pandas ile veri okuma, analiz ve temizleme
-
Matplotlib ile çizgi ve çubuk grafikleri
-
Seaborn ile istatistiksel grafikler
-
Mini proje: Öğrenci başarı analizi
🌐 Python ile Web Scraping ve Otomasyon
🔧 1. Web Scraping Nedir?
Web scraping, bir web sitesindeki verileri otomatik olarak çekme işlemidir. Mesela bir haber sitesinden başlıkları ya da bir e-ticaret sitesinden ürün fiyatlarını almak gibi.
🛠 Kullanılan Kütüphaneler:
-
requests
→ Web sayfasını çağırır -
BeautifulSoup
→ HTML verisini işler -
Selenium
→ Sayfalarla etkileşim kurar (JavaScript ağırlıklı sitelerde)
🔹 2. Requests ile Sayfa Çekme
bashpip install requests
pythonimport requests url = "https://www.example.com" response = requests.get(url) print(response.status_code) # 200 = başarılı print(response.text) # HTML içeriği
🔹 3. BeautifulSoup ile HTML Ayrıştırma
bashpip install beautifulsoup4
pythonfrom bs4 import BeautifulSoup html = response.text soup = BeautifulSoup(html, "html.parser") basliklar = soup.find_all("h2") for b in basliklar: print(b.text)
📘 Uygulama: Bir haber sitesinden başlıkları çek.
🔹 4. Örnek: Döviz Kuru Çekme
pythonurl = "https://www.tcmb.gov.tr/kurlar/today.xml" response = requests.get(url) soup = BeautifulSoup(response.content, "xml") dolar = soup.find("Currency", {"Kod": "USD"}).find("ForexSelling").text euro = soup.find("Currency", {"Kod": "EUR"}).find("ForexSelling").text print("Dolar: ", dolar) print("Euro: ", euro)
🧪 5. Selenium ile Otomasyon
Selenium, butona tıklama, giriş yapma, kaydırma gibi işlemler yapmamıza olanak tanır.
bashpip install selenium
Ayrıca ChromeDriver indirilmelidir.
pythonfrom selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://www.google.com") arama = driver.find_element(By.NAME, "q") arama.send_keys("Python dersleri") arama.submit()
💼 6. Proje: E-Ticaret Sitesinden Ürün Fiyatı Çekme
pythonfrom bs4 import BeautifulSoup import requests url = "https://www.example.com/urun/telefon" headers = { "User-Agent": "Mozilla/5.0" } r = requests.get(url, headers=headers) soup = BeautifulSoup(r.content, "html.parser") fiyat = soup.find("span", {"class": "fiyat"}).text print("Telefon fiyatı:", fiyat)
🔁 7. Otomatik Zamanlama (Schedule)
bashpip install schedule
pythonimport schedule import time def kontrol_et(): print("Fiyat kontrol ediliyor...") schedule.every(5).minutes.do(kontrol_et) while True: schedule.run_pending() time.sleep(1)
🧠 Neler Öğrendik?
✅ Web scraping temel araçları: requests
, BeautifulSoup
✅ Sayfa okuma, veri çekme, veri ayıklama
✅ Selenium ile sayfalarla etkileşim
✅ Fiyat takip sistemi ve otomatik çalışma
🧰 Python ile Excel, Word ve PDF İşlemleri
📊 1. Excel İşlemleri (openpyxl)
🧩 openpyxl Kurulumu
bashpip install openpyxl
📄 Excel Dosyası Oluşturma
pythonfrom openpyxl import Workbook wb = Workbook() ws = wb.active ws.title = "Rapor" ws["A1"] = "Ad" ws["B1"] = "Not" ws.append(["Ali", 90]) ws.append(["Ayşe", 85]) ws.append(["Can", 75]) wb.save("ogrenci_raporu.xlsx")
📄 Excel Dosyası Okuma
pythonfrom openpyxl import load_workbook wb = load_workbook("ogrenci_raporu.xlsx") ws = wb.active for row in ws.iter_rows(min_row=2, values_only=True): print(row)
📄 2. Word Belgeleri (python-docx)
🔧 Kurulum
bashpip install python-docx
📄 Word Belgesi Oluşturma
pythonfrom docx import Document doc = Document() doc.add_heading("Python Belge Oluşturma", level=1) doc.add_paragraph("Bu belge python-docx ile oluşturuldu.") doc.add_paragraph("Ad: AlinNot: 90") doc.save("rapor.docx")
📄 3. PDF Oluşturma (fpdf)
📦 Kurulum
bashpip install fpdf
📄 Basit PDF Oluşturma
pythonfrom fpdf import FPDF pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) pdf.cell(200, 10, txt="Python ile PDF Raporu", ln=True, align="C") pdf.ln(10) pdf.cell(200, 10, txt="Ad: Ali - Not: 90", ln=True) pdf.output("rapor.pdf")
📘 Proje: Otomatik Raporlama Sistemi
Senaryo: Bir not listesi dosyasından veriler çekilecek ve hem Excel, hem Word hem de PDF olarak çıktı alınacak.
🔄 Adımlar:
-
veri.csv
dosyasını oku -
openpyxl
ile Excel çıktısı oluştur -
docx
ile Word belgesi oluştur -
fpdf
ile PDF çıktısı ver
Örnek CSV Dosyası (veri.csv
)
mathematicaAd,Not Ali,90 Ayşe,85 Can,70
Kodu: Tüm Raporlama
pythonimport pandas as pd from openpyxl import Workbook from docx import Document from fpdf import FPDF # CSV'den veri oku df = pd.read_csv("veri.csv") # Excel wb = Workbook() ws = wb.active ws.append(["Ad", "Not"]) for index, row in df.iterrows(): ws.append([row["Ad"], row["Not"]]) wb.save("rapor.xlsx") # Word doc = Document() doc.add_heading("Öğrenci Raporu", level=1) for index, row in df.iterrows(): doc.add_paragraph(f"Ad: {row['Ad']} - Not: {row['Not']}") doc.save("rapor.docx") # PDF pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) pdf.cell(200, 10, txt="Öğrenci Raporu", ln=True, align="C") pdf.ln(10) for index, row in df.iterrows(): pdf.cell(200, 10, txt=f"Ad: {row['Ad']} - Not: {row['Not']}", ln=True) pdf.output("rapor.pdf")
🧠 Neler Öğrendik?
✅ Excel dosyası oluşturup veri yazma
✅ Word belgesi oluşturma ve biçimlendirme
✅ PDF çıktısı alma ve düzenleme
✅ Otomatik raporlama sistemi kurma
🤖 Python ile Makine Öğrenmesine Giriş
🔬 1. Makine Öğrenmesi Nedir?
Makine öğrenmesi, verilerden otomatik olarak öğrenen ve tahminler yapabilen algoritmaların genel adıdır. Python, bu alanda en popüler dildir çünkü çok güçlü kütüphanelere sahiptir:
📦 Kullanılan Kütüphaneler:
-
numpy
→ Sayısal işlemler -
pandas
→ Veri işleme -
scikit-learn
→ Makine öğrenmesi algoritmaları -
matplotlib / seaborn
→ Görselleştirme
🔧 2. Gerekli Kurulumlar
bashpip install numpy pandas scikit-learn matplotlib seaborn
🔢 3. NumPy Temelleri
pythonimport numpy as np a = np.array([1, 2, 3]) print(a.mean()) # Ortalama print(a.std()) # Standart sapma print(a.reshape(3, 1)) # Şekil değiştirme
📊 4. Veri Seti Hazırlama
scikit-learn
içinde hazır veri setleri vardır. Örneğin iris veri seti:
pythonfrom sklearn.datasets import load_iris import pandas as pd iris = load_iris() df = pd.DataFrame(data=iris.data, columns=iris.feature_names) df["target"] = iris.target print(df.head())
🧠 5. Regresyon Modeli (LinearRegression)
Tahmin problemi: Örneğin ev fiyatını tahmin etmek.
pythonfrom sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split X = df[["sepal length (cm)"]] y = df["target"] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) model = LinearRegression() model.fit(X_train, y_train) tahmin = model.predict(X_test) print(tahmin)
🧪 6. Sınıflandırma (Classification)
Karar ağacı ile çiçek türü tahmini:
pythonfrom sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score X = df.drop("target", axis=1) y = df["target"] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) model = DecisionTreeClassifier() model.fit(X_train, y_train) y_pred = model.predict(X_test) print("Doğruluk Oranı:", accuracy_score(y_test, y_pred))
📈 7. Görselleştirme
pythonimport seaborn as sns import matplotlib.pyplot as plt sns.pairplot(df, hue="target") plt.show()
🧠 8. Gerçek Veri Seti ile Uygulama
🎯 Proje: Öğrenci notlarıyla başarı tahmini yap.
Veri:
sinav1,sinav2,proje,sonuc 85,90,92,1 70,60,65,0 78,80,88,1
Model: Lojistik regresyon
pythondf = pd.read_csv("notlar.csv") X = df[["sinav1", "sinav2", "proje"]] y = df["sonuc"] from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X, y) tahmin = model.predict([[80, 85, 90]]) print("Tahmin (1 = Geçti):", tahmin)
🧠 Neler Öğrendik?
✅ NumPy ve veri işlemenin temelleri
✅ Hazır veri setleri ile model eğitme
✅ Regresyon ve sınıflandırma modelleri
✅ Tahmin, test ve değerlendirme
✅ Görselleştirme ve yorumlama
🧪 Gerçek Hayat Python Projeleri: Yapay Zeka + Web + Otomasyon
📌 1. Proje: E-Posta Spam Tespiti
🔹 Amaç:
Bir e-postanın spam (istenmeyen) olup olmadığını tahmin eden bir sistem.
🧾 Örnek Veri (CSV Formatı)
arduinolabel,text spam,"Kazandınız! Hemen tıklayın!" ham,"Bugün toplantı var" spam,"Kredi kartı aidatınız silindi!" ham,"Raporu hazırladım"
📦 Gerekli Kütüphaneler
bashpip install pandas scikit-learn
🧠 Model Eğitimi
pythonimport pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # Veriyi oku df = pd.read_csv("mail.csv") # Özellik ve hedef ayır X = df["text"] y = df["label"] # Metni sayısal hale getir cv = CountVectorizer() X_vectorized = cv.fit_transform(X) # Eğitimi ve testi ayır X_train, X_test, y_train, y_test = train_test_split(X_vectorized, y, test_size=0.2) # Modeli eğit model = MultinomialNB() model.fit(X_train, y_train) # Test y_pred = model.predict(X_test) print("Doğruluk:", accuracy_score(y_test, y_pred))
📦 2. Modeli Kaydetme (pickle
)
pythonimport pickle # Modeli ve vektörü kaydet pickle.dump(model, open("spam_model.pkl", "wb")) pickle.dump(cv, open("vectorizer.pkl", "wb"))
🌐 3. Flask ile Web Arayüzü Oluşturma
bashpip install flask
📁 Flask Proje Yapısı
pgsqlproje/ │ ├── app.py ├── spam_model.pkl ├── vectorizer.pkl └── templates/ └── index.html
app.py
(Flask Web Sunucusu)
pythonfrom flask import Flask, request, render_template import pickle app = Flask(__name__) model = pickle.load(open("spam_model.pkl", "rb")) cv = pickle.load(open("vectorizer.pkl", "rb")) @app.route("/") def home(): return render_template("index.html") @app.route("/tahmin", methods=["POST"]) def tahmin(): mesaj = request.form["mesaj"] verivektor = cv.transform([mesaj]) sonuc = model.predict(verivektor) return render_template("index.html", sonuc=sonuc[0]) if __name__ == "__main__": app.run(debug=True)
index.html
(Basit Form)
html<!DOCTYPE html> <html> <head><title>Spam Tespiti</title></head> <body> <h2>Spam Tespit Sistemi</h2> <form method="POST" action="/tahmin"> <textarea name="mesaj" rows="4" cols="50" placeholder="E-posta içeriğini yaz..."></textarea><br><br> <input type="submit" value="Kontrol Et"> </form> {% if sonuc %} <h3>Sonuç: {{ sonuc }}</h3> {% endif %} </body> </html>
🤖 4. Bonus Proje: Mini Python ChatBot
pythonwhile True: giris = input("Sen: ").lower() if "merhaba" in giris: print("Bot: Merhaba, nasılsın?") elif "iyiyim" in giris: print("Bot: Harika!") elif "kapat" in giris: print("Bot: Görüşürüz!") break else: print("Bot: Anlayamadım, tekrar eder misin?")
🧠 Neler Öğrendik?
✅ Metin verisini analiz etme ve sınıflandırma
✅ Makine öğrenmesi modelini dışa aktarma
✅ Flask ile Python’u web’e taşıma
✅ HTML ile basit arayüz
✅ Kullanıcıdan veri alıp tahmin yapma
✅ Komut satırından chatbot geliştirme
🔗 Python ile Web API Geliştirme ve Entegrasyon (FastAPI, Requests)
🧩 1. API Nedir?
API (Application Programming Interface), iki uygulamanın birbirine veri göndermesini sağlar. Örneğin:
-
Hava durumu verisini bir servisten almak
-
Kendi modelini bir mobil uygulamaya açmak
-
Başka bir siteden kripto para fiyatlarını çekmek
⚙️ 2. Python ile API’ye İstek Atmak (requests
)
bashpip install requests
🌦️ Örnek: Hava Durumu API’si Kullanımı
pythonimport requests api_key = "API_KEYİNİZ" sehir = "Istanbul" url = f"http://api.openweathermap.org/data/2.5/weather?q={sehir}&appid={api_key}&units=metric" response = requests.get(url) veri = response.json() print(f"{sehir} Hava: {veri['main']['temp']}°C")
🚀 3. Kendi API’nı Yaz: FastAPI ile
bashpip install fastapi uvicorn
📁 Proje Yapısı
cssapi/ │ ├── main.py
main.py
pythonfrom fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Girdi(BaseModel): ad: str yas: int @app.get("/") def anasayfa(): return {"mesaj": "Hoş geldiniz!"} @app.post("/merhaba") def selamla(girdi: Girdi): return {"mesaj": f"Merhaba {girdi.ad}, {girdi.yas} yaşındasın!"}
▶️ API’yi Başlat
bashuvicorn main:app --reload
Tarayıcıdan:
📍 http://127.0.0.1:8000/docs
FastAPI, otomatik olarak Swagger UI ile belgeleri sunar. Harika bir özellik!
📲 4. Mobil/Frontend için API Açma
Modelini POST ile aç:
python@app.post("/tahmin") def tahmin(veri: dict): veri_input = [[veri["not1"], veri["not2"]]] sonuc = model.predict(veri_input) return {"tahmin": int(sonuc[0])}
Mobil uygulama bu adrese JSON gönderir:
json{ "not1": 85, "not2": 90 }
Ve gelen yanıt:
json{ "tahmin": 1 }
🧠 5. API ile Dosya Yükleme
pythonfrom fastapi import File, UploadFile @app.post("/yukle") async def dosya_yukle(dosya: UploadFile = File(...)): icerik = await dosya.read() return {"dosya_adi": dosya.filename, "boyut": len(icerik)}
📨 6. Otomatik E-Posta Gönderimi
bashpip install yagmail
pythonimport yagmail yag = yagmail.SMTP("mail@gmail.com", "şifre") yag.send(to="hedef@gmail.com", subject="Python Raporu", contents="Merhaba! Otomatik rapor ektedir.")
🧠 Neler Öğrendik?
✅ API nedir, nasıl kullanılır?
✅ Başka servisten veri alma (requests)
✅ Kendi API’ni yazma (FastAPI)
✅ Model tahminini API üzerinden alma
✅ Dosya yükleme, JSON POST
✅ Otomatik e-posta entegrasyonu
🛠️ Python ile Tam Uygulama Geliştirme ve Otomasyon Projeleri
🔄 1. Otomatik Excel Raporlama + Mail Gönderme
📊 Excel Raporu Oluştur (openpyxl)
bashpip install openpyxl
pythonfrom openpyxl import Workbook wb = Workbook() ws = wb.active ws.append(["Ad", "Not1", "Not2", "Ortalama"]) veriler = [ ["Ali", 80, 85], ["Ayşe", 90, 95], ["Mehmet", 70, 75] ] for satir in veriler: ortalama = (satir[1] + satir[2]) / 2 ws.append([satir[0], satir[1], satir[2], ortalama]) wb.save("rapor.xlsx")
📧 Excel Dosyasını Mail ile Gönder
pythonimport yagmail yag = yagmail.SMTP("mail@gmail.com", "şifre") yag.send( to="hedef@mail.com", subject="Haftalık Rapor", contents="Merhaba, rapor ektedir.", attachments="rapor.xlsx" )
📑 2. Otomatik PDF Oluşturma
bashpip install fpdf
pythonfrom fpdf import FPDF pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=12) pdf.cell(200, 10, txt="Python Otomatik Rapor", ln=True, align='C') pdf.cell(200, 10, txt="Veri analizi tamamlandı.", ln=True) pdf.output("rapor.pdf")
🔌 3. API + Arayüz + Model + Otomasyon Birleşimi
Tam uygulama mimarisi:
css📁 proje/ │ ├── model/ ← Makine öğrenmesi modeli (pickle) ├── api/ ← FastAPI sunucusu │ └── main.py ├── otomasyon/ │ └── rapor_olustur.py ├── templates/ ← Arayüz │ └── index.html └── mail/ ← Gönderici script └── gonder.py
🧩 4. Otomatik Veri Analizi + Tahmin + Raporlama
Örnek: Öğrenci notlarını oku, tahmin yap, rapor oluştur, mail gönder.
pythonimport pandas as pd import pickle from openpyxl import Workbook import yagmail # Veriyi oku df = pd.read_csv("notlar.csv") # Model yükle model = pickle.load(open("model.pkl", "rb")) # Tahmin yap df["tahmin"] = model.predict(df[["sinav1", "sinav2"]]) # Excel raporu oluştur wb = Workbook() ws = wb.active ws.append(df.columns.tolist()) for i in df.values.tolist(): ws.append(i) wb.save("rapor.xlsx") # Mail gönder yag = yagmail.SMTP("mail@gmail.com", "şifre") yag.send("yonetici@mail.com", "Otomatik Tahmin Raporu", "Rapor ektedir", "rapor.xlsx")
📲 5. Python ile SaaS Mantığında Servis
-
Kullanıcı → Web formu üzerinden veri girer
-
API → Veriyi alır, modele gönderir
-
Model → Tahmin döner
-
Rapor → PDF/Excel hazırlanır
-
E-posta → Kullanıcıya rapor gönderilir
Tamamen otomatik ve gerçek bir servis mantığı!
🧠 Final: Python ile Gerçek Projelerle Uygulama Geliştirme
Proje | Konular |
---|---|
📊 Not Tahmin Sistemi | ML + API + Arayüz + Rapor |
📨 Spam E-posta Filtre | NLP + Naive Bayes |
📉 Kripto Bot | Web scraping + API |
📬 Otomatik Mail Gönderici | Otomasyon + Excel/PDF |
📁 Dosya Yönetim Sistemi | GUI + File Handling |
🏁 Sonuç: Artık Bir Python Uzmanısın!
🎓 Bu 20.000 kelimelik dev Python eğitiminde:
✅ Temellerden başlayarak ileri seviyeye ulaştık
✅ Gerçek projeler geliştirdik
✅ Otomasyon, AI, Web API, Mail, Raporlama öğrendik
✅ Python ile profesyonel uygulamalar geliştirdik
Review Python Dersleri: 0’dan İleri Seviyeye Kadar Python Eğitimi.