İleri Seviye Python Konuları

İleri seviye Python konuları, dilin daha karmaşık ve güçlü özelliklerini anlamayı ve bunları etkili bir şekilde kullanmayı içerir. Bu konular, performans optimizasyonu, esneklik, büyük projelerin yönetimi ve daha ileri düzeyde yazılım mühendisliği teknikleriyle ilgilenir. İşte bazı ileri seviye Python konuları:

1. Dekoratörler (Decorators)

Dekoratörler, fonksiyonları veya sınıfları modifiye eden ve genişleten yüksek seviyeli fonksiyonlardır. Dekoratörler, bir fonksiyonu veya sınıfı sarmalayarak onun davranışını değiştirmeyi sağlar.

a. Fonksiyon Dekoratörleri

Fonksiyon dekoratörleri, bir fonksiyonu alır, onun üzerinde işlem yapar ve ardından değiştirilmiş bir fonksiyon döner.

Örnek:
def zamanlayici(func):
import time
def wrapper(*args, **kwargs):
baslangic = time.time()
sonuc = func(*args, **kwargs)
bitis = time.time()
print(f"Fonksiyon {func.__name__} {bitis - baslangic:.4f} saniye sürdü.")
return sonuc
return wrapper

@zamanlayici
def bekle(sure):
time.sleep(sure)

bekle(2)
Bu örnekte, zamanlayici dekoratörü, bekle fonksiyonunun ne kadar sürdüğünü hesaplar ve bu bilgiyi ekrana yazar.

b. Sınıf Dekoratörleri

Sınıf dekoratörleri, bir sınıfı alır ve onu genişleterek yeni bir sınıf döner.

Örnek:

def singleton(cls):
instance = None
def wrapper(*args, **kwargs):
nonlocal instance
if instance is None:
instance = cls(*args, **kwargs)
return instance
return wrapper

@singleton
class VeriTabani:
def __init__(self):
print("Veritabanı bağlantısı kuruldu.")

db1 = VeriTabani()
db2 = VeriTabani()

print(db1 is db2) # True

Bu örnekte, singleton dekoratörü, VeriTabani sınıfının sadece bir kez oluşturulmasını sağlar.

2. Metasınıflar (Metaclasses)

Metasınıflar, sınıfları oluşturan “sınıflardır”. Python’da sınıflar da nesnelerdir ve bu nesneler bir metaklas tarafından oluşturulur. Metasınıflar, sınıf oluşturma sürecini özelleştirmek için kullanılır.

Örnek:
class CustomMeta(type):
def __new__(cls, name, bases, attrs):
attrs['yeni_metod'] = lambda self: f"Bu sınıfın adı: {name}"
return super().__new__(cls, name, bases, attrs)

class MyClass(metaclass=CustomMeta):
pass

obj = MyClass()
print(obj.yeni_metod()) # Bu sınıfın adı: MyClass

Bu örnekte, CustomMeta adında bir metasınıf tanımlanmıştır. MyClass sınıfı bu metaklası kullanır ve otomatik olarak yeni_metod adlı bir metoda sahip olur.

3. Generatörler ve İteratörler

Generatörler ve iteratörler, büyük veri kümeleriyle verimli bir şekilde çalışmayı sağlar. Generatörler, veri üretimini birer birer gerçekleştirir ve belleği verimli kullanır.

a. Generatörler

Generatörler, yield anahtar kelimesi ile veri üreten fonksiyonlardır.

Örnek:
def sayac(baslangic, bitis):
while baslangic <= bitis:
yield baslangic
baslangic += 1

for sayi in sayac(1, 5):
print(sayi)

Bu örnekte, sayac fonksiyonu, 1’den 5’e kadar olan sayıları birer birer üretir.

b. İteratörler

İteratörler, sıralı veri yapıları üzerinde gezinmeyi sağlar. Python’da bir nesne __iter__ ve __next__ metodlarına sahipse iteratördür.

Örnek:
class Ters:
def __init__(self, data):
self.data = data
self.index = len(data)

def __iter__(self):
return self

def __next__(self):
if self.index == 0:
raise StopIteration
self.index -= 1
return self.data[self.index]

ters = Ters([1, 2, 3, 4])
for eleman in ters:
print(eleman)

Bu örnekte, Ters sınıfı bir iteratördür ve bir listeyi ters sırada döner.

4. Asenkron Programlama (Asyncio)

Asenkron programlama, bir programın aynı anda birden fazla işlemi gerçekleştirmesini sağlar. Python’da asyncio kütüphanesi bu işlemler için kullanılır.

Örnek:
import asyncio

async def bekle(sure):
print(f"{sure} saniye bekleniyor...")
await asyncio.sleep(sure)
print(f"{sure} saniye bitti.")

async def ana_gorev():
await asyncio.gather(bekle(1), bekle(2), bekle(3))

asyncio.run(ana_gorev())

Bu örnekte, ana_gorev fonksiyonu aynı anda birden fazla bekleme görevini asenkron olarak yürütür.

5. Context Managers (Bağlam Yöneticileri)

Context managers, with ifadesi kullanılarak kaynakların otomatik olarak yönetilmesini sağlar (örneğin, dosya açma ve kapama). Python’da context managers genellikle __enter__ ve __exit__ metodlarıyla tanımlanır.

Örnek:
class DosyaYoneticisi:
def __init__(self, dosya_adi, mod):
self.dosya_adi = dosya_adi
self.mod = mod

def __enter__(self):
self.dosya = open(self.dosya_adi, self.mod)
return self.dosya

def __exit__(self, exc_type, exc_val, exc_tb):
self.dosya.close()

with DosyaYoneticisi("deneme.txt", "w") as dosya:
dosya.write("Merhaba, dünya!")

Bu örnekte, DosyaYoneticisi sınıfı bir bağlam yöneticisidir ve dosya açma ve kapama işlemleri otomatik olarak yönetilir.

6. Çoklu Miras (Multiple Inheritance)

Python’da bir sınıf birden fazla sınıftan miras alabilir. Bu, bir sınıfın birden fazla ebeveyn sınıftan özellikleri ve metodları devralmasını sağlar.

Örnek:
class A:
def metot_a(self):
print("A sınıfından")

class B:
def metot_b(self):
print("B sınıfından")

class C(A, B):
pass

c = C()
c.metot_a() # A sınıfından
c.metot_b() # B sınıfından

Bu örnekte, C sınıfı hem A hem de B sınıflarından miras alır.

7. Python’da Hafıza Yönetimi ve Referans Sayımı

Python, bellek yönetimini otomatik olarak yapar ve nesnelerin bellekten ne zaman silineceğini belirlemek için referans sayımı kullanır. Bir nesneye işaret eden referans sayısı sıfıra ulaştığında, Python bu nesneyi bellekten otomatik olarak temizler.

Örnek:
import sys

a = []
print(sys.getrefcount(a)) # 2

b = a
print(sys.getrefcount(a)) # 3

del b
print(sys.getrefcount(a)) # 2

Bu örnekte, sys.getrefcount() fonksiyonu bir nesneye işaret eden referans sayısını döner.

8. Descriptor’ler

Descriptor’ler, bir nesneye ait bir özelliğin nasıl saklanacağını ve erişileceğini kontrol eder. __get__, __set__, ve __delete__ metodlarıyla tanımlanır.

Örnek:
class Deeger:
def __init__(self):
self.deger = None

def __get__(self, instance, owner):
return self.deger

def __set__(self, instance, value):
self.deger = value

class Ornek:
deger = Deeger()

ornek = Ornek()
ornek.deger = 10
print(ornek.deger) # 10

Bu örnekte, Deeger sınıfı bir descriptor’dir ve Ornek sınıfının deger özelliğini kontrol eder.

9. Threading ve Multiprocessing

Python’da çoklu iş parçacığı (threading) ve çoklu işlem (multiprocessing) kullanarak paralel programlama yapılabilir. Bu, programların performansını artırmak için kullanılır.

a. Threading

Threading, aynı anda birden fazla iş parçacığını çalıştırmayı sağlar.

Örnek:
import threading

def fonksiyon(sure):
print(f"{sure} saniye bekleniyor...")
time.sleep(sure)
print(f"{sure} saniye bitti.")

t1 = threading.Thread(target=fonksiyon, args=(2,))
t2 = threading.Thread(target=fonksiyon, args=(4,))

t1.start()
t2.start()

t1.join()
t2.join()

b. Multiprocessing

Multiprocessing, farklı CPU çekirdeklerinde aynı anda birden fazla işlemi çalıştırmayı sağlar.

Örnek:
import multiprocessing

def kare_al(sayi):
return sayi * sayi

if __name__ == "__main__":
pool = multiprocessing.Pool()
sonuc = pool.map(kare_al, [1, 2, 3, 4, 5])
print(sonuc) # [1, 4, 9, 16, 25]

10. yield ve Generatörler ile Veri Akışı

yield anahtar kelimesi, bir fonksiyonun bir generatör olarak davranmasını sağlar. Generatörler, büyük veri kümeleriyle verimli bir şekilde çalışmayı sağlar ve veriyi gerektiğinde üretir.

Örnek:
def sayac(baslangic, bitis):
while baslangic <= bitis:
yield baslangic
baslangic += 1

for sayi in sayac(1, 5):
print(sayi)

İleri seviye Python konuları, dilin güçlü özelliklerini kullanarak daha karmaşık ve optimize yazılımlar geliştirmeyi mümkün kılar. Dekoratörler, metasınıflar, asenkron programlama, generatörler, threading, multiprocessing ve diğer ileri seviye konular, Python’un esnekliğini ve gücünü tam anlamıyla ortaya koyar. Bu konular üzerinde derinlemesine çalışmak, Python’da daha yetkin bir programcı olmanıza yardımcı olacaktır.

Comments

Bir yanıt yazın

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

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.