İ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.
Bir yanıt yazın