Python Dersleri: 0’dan İleri Seviyeye Kadar Python Eğitimi

 

Python Dersleri: 0'dan İleri Seviyeye Kadar Python Eğitimi
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.

python

sayi = 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

python

sayi = 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ü:

python

for i in range(5): print(i)
  • while Döngüsü:

python

i = 0 while i < 5: print(i) i += 1

5. Fonksiyonlar

Fonksiyonlar, belirli bir görevi yerine getiren kod bloklarıdır.

python

def 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.

python

meyveler = ["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.

python

koordinatlar = (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.

python

ogrenci = {"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.

python

renkler = {"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.

python

for 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.

python

i = 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.

python

sayi = 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

python

def selamla(isim): print(f"Merhaba, {isim}!")

Görsel: Fonksiyon Yapısı

8.2 Parametreler ve Geri Dönüş Değerleri

python

def 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.

python

dosya = 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.

python

with 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.

python

with 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.

python

with 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ı

python

try: 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.

python

try: 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

python

class 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.

python

class 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ı:

python
import 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ı:

markdown
proje/ ├── __init__.py ├── modul1.py └── modul2.py

Paket Kullanımı:

python
from 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.

    python

    import os print(os.getcwd()) # Geçerli çalışma dizinini verir
  • shutil: Dosya ve dizin işlemleri için kullanılır.

    python

    import 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.

    python

    import 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.

    python

    import 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.

    python

    from 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.

    python

    import time time.sleep(2) # 2 saniye bekleme

13.4 Matematiksel İşlemler

  • math: Matematiksel fonksiyonlar içerir.

    python

    import math print(math.sqrt(16)) # Kare kök hesaplama
  • random: Rastgele sayı üretimi için kullanılır.

    python

    import 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

python

import pandas as pd veri = { 'Ad': ['Ali', 'Ayşe', 'Mehmet'], 'Yaş': [25, 30, 22], 'Şehir': ['İstanbul', 'Ankara', 'İzmir'] } df = pd.DataFrame(veri) print(df)

Çıktı:

markdown

Ad 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

python

import 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

python

import numpy as np a = np.array([1, 2, 3]) print(a)

Çıktı:

csharp

[1 2 3]

Örnek: Matris İşlemleri

python

b = 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

python

import 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

  1. Django’yu yükleyin:

    bash

    pip install django
  2. Yeni bir proje oluşturun:

    bash

    django-admin startproject myproject
  3. Sunucuyu başlatın:

    bash

    python 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ı

python

from 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

python

from 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ı

python

from 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

python

import 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

python

import 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ı

python

import 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 veya PyMySQL kütüphaneleri kullanılır.

  • PostgreSQL: psycopg2 kütüphanesi kullanılır.

Örnek: MySQL Kullanımı

python

import 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ı

python

from 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ı

python

from 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ı

python

import 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ı

python

def 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ı

python

def 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:

python

def 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:

python

import 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:

python

try: 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

python

with 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

python

with 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ı

python

import 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

python

import 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

python

import 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

python

from 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:

  1. Kurulum:

    bash

    pip install flask
  2. Uygulama Oluşturma:

    python

    from 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:

bash

pip 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

python

import 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:

bash

pip install sqlalchemy

30.2 Temel Kullanım

Örnek: SQLAlchemy ile Veritabanı İşlemleri

python

from 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:

bash

pip install django

Ardından, bir Django projesi ve uygulaması oluşturun:

bash

django-admin startproject ornekproje cd ornekproje python manage.py startapp ornekuygulama

31.2 Model Tanımlama

ornekuygulama/models.py dosyasında modelinizi tanımlayın:

python

from 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:

bash

python 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ı

python

import 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ı

python

def 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ı

python

import 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:

python

try: 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.

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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 ve await 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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.

python

import 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.

python

import 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.

python

import 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.

python

import 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.

python

import 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

bash
pip install aiofiles

Kullanım Örneği

python
import 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

bash

pip install asyncpg

Kullanım Örneği

python

import 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

bash

pip install sqlalchemy asyncpg

Kullanım Örneği

python

import 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.

python

import 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

python

import 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

python

import 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

python

import 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

python

import 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 yerine dir 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

python

import 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:

python

import 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:

python

from 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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:

python

import 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

python

def selamla(isim): print(f"Merhaba, {isim}!")

kullan.py

python

import 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ı:

markdown

projem/ │ ├── __init__.py ├── modul1.py └── modul2.py

modul1.py

python

def topla(a, b): return a + b

modul2.py

python

def carp(a, b): return a * b

kullan.py

python

from 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ı:

markdown

ornek_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:

python

from .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:

python

def 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:

bash

pip install -r requirements.txt

Örnek requirements.txt:

ini

requests==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ı

python

class 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

python

arac1 = 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

python

arac1.marka # "Toyota"

📌 Metot: Nesneye ait işlev

python

arac1.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.

python

class 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")
python

tesla = 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.

python

class 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.

python

class 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}")
python

ali = 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.

python

class 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.

python

class 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.

python

class 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ı:

css

proje_mvc/ ├── models/ │ └── kullanici.py ├── controllers/ │ └── kullanici_controller.py ├── views/ │ └── arayuz.py └── main.py

📦 3. Model: models/kullanici.py

python

class Kullanici: def __init__(self, isim, yas): self.isim = isim self.yas = yas

🔁 4. Controller: controllers/kullanici_controller.py

python

from 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

python

def kullanici_goster(kullanici): print(f"Kullanıcı: {kullanici.isim} ({kullanici.yas} yaşında)")

🧪 6. main.py: Uygulamanın Giriş Noktası

python

from 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:

python

import 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:

python

def 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:

python

def 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

bash

pip install flask

🚀 2. Basit Bir Flask Uygulaması

app.py

python

from 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

python

from 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:

python

from 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:

arduino

proje/ ├── app/ │ ├── __init__.py │ ├── routes.py │ ├── models.py │ └── controllers.py ├── run.py └── requirements.txt

🔐 8. JWT ile Kimlik Doğrulama (Giriş)

pyjwt Kurulumu:

bash

pip install PyJWT

Token Üretme:

python

import 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:

python

def 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:

bash

pip install flask_sqlalchemy

📁 Dosya Yapısı:

arduino

proje/ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── routes.py ├── run.py

🔌 app/__init__.py – Uygulama Başlatma

python

from 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

python

from 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ı

python

from 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

python

from 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.

python

from 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

python

from flask import Blueprint bp = Blueprint("ana", __name__) @bp.route("/") def anasayfa(): return "Anasayfa"

📦 Blueprint’i Uygulamaya Dahil Et

python

app.register_blueprint(bp, url_prefix="/")

🔐 5. Basit Kullanıcı Girişi

JWT kullanmadan, session tabanlı örnek giriş sistemi:

python

from 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ı:

csharp

proje/ ├── 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ı

python

from 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ı

css

body { 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

python

from 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:

bash

pip install flask-wtf

📄 forms.py

python

from 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

python

from 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:

bash

pip install flask-login

📄 Uygulama Ayarları

python

from flask_login import LoginManager login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = "giris"

📄 models.py – Kullanıcı Modeli

python

from 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ış

python

from 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

python

class 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, veya render.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

python

from 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

python

from 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

python

import 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

python

class 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

python

from 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

bash

pip install flask-mail

📄 Ayarlar

python

from 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:

arduino

proje/ ├── 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

python

from 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:

bash

pip install werkzeug
python

from werkzeug.security import generate_password_hash, check_password_hash

📄 Kayıt Örneği

python

yeni_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

python

from itsdangerous import URLSafeTimedSerializer s = URLSafeTimedSerializer(app.config["SECRET_KEY"]) token = s.dumps(user.email, salt="sifre-sifirla")

📄 Token Doğrulama

python

email = s.loads(token, salt="sifre-sifirla", max_age=3600)

📧 E-posta ile Link Gönder

python

msg = 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

bash

pip install flask-restx

📄 Basit Kullanım

python

from 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)

python

import 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)
bash

python -m unittest discover

🚀 7. Deploy – Flask Uygulamasını Yayına Almak

🔧 1. requirements.txt Oluştur

bash

pip freeze > requirements.txt

🔧 2. WSGI Dosyası – run.py

python

from 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

bash

pip install pandas

📄 CSV Okuma

python

import pandas as pd veri = pd.read_csv("veriler.csv") print(veri.head()) # İlk 5 satırı göster

📊 Temel İşlemler

python

print(veri.columns) # Sütun adları print(veri.describe()) # İstatistiksel özet print(veri["Yaş"].mean()) # Yaş ortalaması

2️⃣ Matplotlib ile Grafik Çizme

📦 Kurulum

bash

pip install matplotlib

📈 Temel Grafik

python

import 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

bash

pip install seaborn

📊 Örnek: Kategorik Veri Çizimi

python

import 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:

python

veri.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:

csv

isim,not1,not2,proje Ali,70,80,90 Ayşe,85,78,88 Can,60,65,70

📄 Python Kodu

python

df = 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

bash

pip install requests
python

import 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

bash

pip install beautifulsoup4
python

from 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

python

url = "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.

bash

pip install selenium

Ayrıca ChromeDriver indirilmelidir.

python

from 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

python

from 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)

bash

pip install schedule
python

import 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

bash

pip install openpyxl

📄 Excel Dosyası Oluşturma

python

from 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

python

from 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

bash

pip install python-docx

📄 Word Belgesi Oluşturma

python

from 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

bash

pip install fpdf

📄 Basit PDF Oluşturma

python

from 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:

  1. veri.csv dosyasını oku

  2. openpyxl ile Excel çıktısı oluştur

  3. docx ile Word belgesi oluştur

  4. fpdf ile PDF çıktısı ver


Örnek CSV Dosyası (veri.csv)

mathematica

Ad,Not Ali,90 Ayşe,85 Can,70

Kodu: Tüm Raporlama

python

import 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

bash

pip install numpy pandas scikit-learn matplotlib seaborn

🔢 3. NumPy Temelleri

python

import 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:

python

from 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.

python

from 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:

python

from 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

python

import 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

python

df = 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ı)

arduino

label,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

bash

pip install pandas scikit-learn

🧠 Model Eğitimi

python

import 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)

python

import 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

bash

pip install flask

📁 Flask Proje Yapısı

pgsql

proje/ │ ├── app.py ├── spam_model.pkl ├── vectorizer.pkl └── templates/ └── index.html

app.py (Flask Web Sunucusu)

python

from 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

python

while 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)

bash

pip install requests

🌦️ Örnek: Hava Durumu API’si Kullanımı

python

import 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

bash
pip install fastapi uvicorn

📁 Proje Yapısı

css

api/ │ ├── main.py

main.py

python

from 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

bash

uvicorn 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

python

from 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

bash

pip install yagmail
python

import 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)

bash

pip install openpyxl
python

from 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

python

import 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

bash

pip install fpdf
python

from 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.

python

import 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.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir