-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
================================================================================
🐍 SIFIRDAN İLERİ SEVİYEYE PYTHON EĞİTİM SERİSİ - BÖLÜM 2
================================================================================
Selamlar Tekrar Değerli Forum Sakinleri! 🚀🔥
Serimizin ilk bölümünde Python'ın bellek modeline, CPython mimarisine ve
referans mantığına değinmiştik. Hiç vakit kaybetmeden Bölüm 2 ile
derinlere inmeye devam ediyoruz! ☕💻
Bu bölümde:
1. Akış Kontrolleri ve Bytecode Analizi (dis Modülü)
2. Kapsam (Scope) Yönetimi ve LEGB Kuralı
3. CPython Garbage Collection (Çöp Toplayıcı) & Reference Counting
--------------------------------------------------------------------------------
1. Koşul Yapıları ve Döngülerin Bytecode Analizi ⚙️
--------------------------------------------------------------------------------
Python'da bir if bloğu veya for döngüsü yazdığımızda, CPython Sanal
Makinesi (PVM) arka planda bunları yığın (stack) bazlı komutlara dönüştürür.
Dahili dis (disassembler) modülünü kullanarak bir Python kodunun bytecode
karşılığını inceleyelim:
import dis
def kontrol(x):
if x > 5:
return "Büyük"
return "Küçük"
# Fonksiyonun bytecode talimatlarını ekrana basalım:
dis.dis(kontrol)
Çıktı Analizi (PVM Komutları):
LOAD_FAST 0 (x) # 'x' değişkenini yığına yükle
LOAD_CONST 1 (5) # '5' sabitini yığına yükle
COMPARE_OP 6 (>) # Karşılaştırma yap (x > 5)
POP_JUMP_IF_FALSE 10 # Yanlışsa 10. offset'e atla!
LOAD_CONST 2 ('Büyük') # Doğruysa 'Büyük' yükle ve döndür
RETURN_VALUE
10:
LOAD_CONST 3 ('Küçük') # 10. offset: 'Küçük' yükle ve döndür
RETURN_VALUE
Gördüğünüz gibi high-level yazdığımız koşul ifadesi, işlemci seviyesine yakın
atlama (jump) ve yığın (stack) operasyonlarına dönüştürülür.
--------------------------------------------------------------------------------
2. Fonksiyonlar, Kapsam (Scope) ve LEGB Kuralı 🏛️
--------------------------------------------------------------------------------
Python'da bir değişken çağrıldığında, PVM bu değişkeni 4 farklı katmanda
sırasıyla arar. Buna LEGB kuralı denir:
1. L (Local): Fonksiyonun kendi içindeki yerel alan.
2. E (Enclosing): İç içe (nested) fonksiyonlarda dıştaki fonksiyonun alanı.
3. G (Global): Modül/Dosya seviyesindeki alan.
4. B (Built-in): Python'ın varsayılan fonksiyonları (print, len vb.).
Arama Sırası: Local ➔ Enclosing ➔ Global ➔ Built-in
Teorik Kod Örneği & Karartma İncelemesi:
x = "GLOBAL" # G (Global)
def dis_fonksiyon():
x = "ENCLOSING" # E (Enclosing)
def ic_fonksiyon():
# x = "LOCAL" # L (Local - Yorum satırı yaparsak E'dekini alır)
print(x) # LEGB sırasına göre bulduğu ilk x'i yazdırır.
ic_fonksiyon()
dis_fonksiyon() # Ekrana "ENCLOSING" basar.
global ve nonlocal Anahtar Kelimeleri:
- global x: Yerel kapsamda yapılan değişikliği dosya geneline (Global) taşır.
- nonlocal x: İç içe fonksiyonlarda bir üstteki (Enclosing) kapsama erişim sağlar.
--------------------------------------------------------------------------------
3. Garbage Collection (GC) Mimarisi ve Reference Counting 🧹
--------------------------------------------------------------------------------
CPython belleği temizlemek için iki ana mekanizma kullanır:
A) Reference Counting (Referans Sayımı):
Her nesnenin (PyObject) başlığında ob_refcnt adında bir sayaç bulunur.
- Bir nesneye yeni bir değişken atandığında sayaç +1 artar.
- Bir değişken silindiğinde (del) veya kapsam dışına çıktığında -1 azalır.
- Sayaç 0 olduğu an bellek SIFIRLANIR ve serbest bırakılır.
import sys
a = [1, 2, 3]
print(sys.getrefcount(a) - 1) # Referans sayısını verir (getrefcount kendisi de +1 ekler)
b = a # Referans sayısı 2 oldu
print(sys.getrefcount(a) - 1)
del b # Referans sayısı 1'e düştü
B) Generational Garbage Collector (Döngüsel İzolasyon Tespiti):
Referans sayımı mükemmeldir ancak Cyclic Reference (Döngüsel Referans)
durumunda patlar:
x = []
y = []
x.append(y) # x, y'ye işaret ediyor
y.append(x) # y, x'e işaret ediyor
del x
del y
# Referans sayıları 0 OLMAZ (1 kalır), bellek sızıntısı (Memory Leak) oluşur!
İşte bu noktada Python'ın gc modülü devreye girer. Nesneleri yaşlarına göre 3
farklı jenerasyona (Generation 0, 1, 2) ayırır ve arka planda dairesel
bağlantıları tespit edip temizler.
--------------------------------------------------------------------------------
4. Bölüm Özeti ve Gelecek Adım 📌
--------------------------------------------------------------------------------
Bu bölümde bytecode seviyesinde akış kontrolünü, LEGB kapsam kurallarını ve
CPython'ın gelişmiş bellek temizleme mekanizmalarını inceledik.
Devam etmek için forum başlığı altına "DEVAM" yazmanız yeterlidir!
Bir sonraki bölümde (Bölüm 3):
- OOP (Nesne Yönelimli Programlama) ve MRO (Method Resolution Order)
- Magic/Dunder Metotların Derinlikleri (__new__ vs __init__)
- Metasınıflar (Metaclasses) ve Class Decorator'lar
Yorumlarınızı ve sorularınızı aşağıda bekliyorum! 🚀✨
================================================
================================
🐍 SIFIRDAN İLERİ SEVİYEYE PYTHON EĞİTİM SERİSİ - BÖLÜM 2
================================================================================
Selamlar Tekrar Değerli Forum Sakinleri! 🚀🔥
Serimizin ilk bölümünde Python'ın bellek modeline, CPython mimarisine ve
referans mantığına değinmiştik. Hiç vakit kaybetmeden Bölüm 2 ile
derinlere inmeye devam ediyoruz! ☕💻
Bu bölümde:
1. Akış Kontrolleri ve Bytecode Analizi (dis Modülü)
2. Kapsam (Scope) Yönetimi ve LEGB Kuralı
3. CPython Garbage Collection (Çöp Toplayıcı) & Reference Counting
--------------------------------------------------------------------------------
1. Koşul Yapıları ve Döngülerin Bytecode Analizi ⚙️
--------------------------------------------------------------------------------
Python'da bir if bloğu veya for döngüsü yazdığımızda, CPython Sanal
Makinesi (PVM) arka planda bunları yığın (stack) bazlı komutlara dönüştürür.
Dahili dis (disassembler) modülünü kullanarak bir Python kodunun bytecode
karşılığını inceleyelim:
import dis
def kontrol(x):
if x > 5:
return "Büyük"
return "Küçük"
# Fonksiyonun bytecode talimatlarını ekrana basalım:
dis.dis(kontrol)
Çıktı Analizi (PVM Komutları):
LOAD_FAST 0 (x) # 'x' değişkenini yığına yükle
LOAD_CONST 1 (5) # '5' sabitini yığına yükle
COMPARE_OP 6 (>) # Karşılaştırma yap (x > 5)
POP_JUMP_IF_FALSE 10 # Yanlışsa 10. offset'e atla!
LOAD_CONST 2 ('Büyük') # Doğruysa 'Büyük' yükle ve döndür
RETURN_VALUE
10:
LOAD_CONST 3 ('Küçük') # 10. offset: 'Küçük' yükle ve döndür
RETURN_VALUE
Gördüğünüz gibi high-level yazdığımız koşul ifadesi, işlemci seviyesine yakın
atlama (jump) ve yığın (stack) operasyonlarına dönüştürülür.
--------------------------------------------------------------------------------
2. Fonksiyonlar, Kapsam (Scope) ve LEGB Kuralı 🏛️
--------------------------------------------------------------------------------
Python'da bir değişken çağrıldığında, PVM bu değişkeni 4 farklı katmanda
sırasıyla arar. Buna LEGB kuralı denir:
1. L (Local): Fonksiyonun kendi içindeki yerel alan.
2. E (Enclosing): İç içe (nested) fonksiyonlarda dıştaki fonksiyonun alanı.
3. G (Global): Modül/Dosya seviyesindeki alan.
4. B (Built-in): Python'ın varsayılan fonksiyonları (print, len vb.).
Arama Sırası: Local ➔ Enclosing ➔ Global ➔ Built-in
Teorik Kod Örneği & Karartma İncelemesi:
x = "GLOBAL" # G (Global)
def dis_fonksiyon():
x = "ENCLOSING" # E (Enclosing)
def ic_fonksiyon():
# x = "LOCAL" # L (Local - Yorum satırı yaparsak E'dekini alır)
print(x) # LEGB sırasına göre bulduğu ilk x'i yazdırır.
ic_fonksiyon()
dis_fonksiyon() # Ekrana "ENCLOSING" basar.
global ve nonlocal Anahtar Kelimeleri:
- global x: Yerel kapsamda yapılan değişikliği dosya geneline (Global) taşır.
- nonlocal x: İç içe fonksiyonlarda bir üstteki (Enclosing) kapsama erişim sağlar.
--------------------------------------------------------------------------------
3. Garbage Collection (GC) Mimarisi ve Reference Counting 🧹
--------------------------------------------------------------------------------
CPython belleği temizlemek için iki ana mekanizma kullanır:
A) Reference Counting (Referans Sayımı):
Her nesnenin (PyObject) başlığında ob_refcnt adında bir sayaç bulunur.
- Bir nesneye yeni bir değişken atandığında sayaç +1 artar.
- Bir değişken silindiğinde (del) veya kapsam dışına çıktığında -1 azalır.
- Sayaç 0 olduğu an bellek SIFIRLANIR ve serbest bırakılır.
import sys
a = [1, 2, 3]
print(sys.getrefcount(a) - 1) # Referans sayısını verir (getrefcount kendisi de +1 ekler)
b = a # Referans sayısı 2 oldu
print(sys.getrefcount(a) - 1)
del b # Referans sayısı 1'e düştü
B) Generational Garbage Collector (Döngüsel İzolasyon Tespiti):
Referans sayımı mükemmeldir ancak Cyclic Reference (Döngüsel Referans)
durumunda patlar:
x = []
y = []
x.append(y) # x, y'ye işaret ediyor
y.append(x) # y, x'e işaret ediyor
del x
del y
# Referans sayıları 0 OLMAZ (1 kalır), bellek sızıntısı (Memory Leak) oluşur!
İşte bu noktada Python'ın gc modülü devreye girer. Nesneleri yaşlarına göre 3
farklı jenerasyona (Generation 0, 1, 2) ayırır ve arka planda dairesel
bağlantıları tespit edip temizler.
--------------------------------------------------------------------------------
4. Bölüm Özeti ve Gelecek Adım 📌
--------------------------------------------------------------------------------
Bu bölümde bytecode seviyesinde akış kontrolünü, LEGB kapsam kurallarını ve
CPython'ın gelişmiş bellek temizleme mekanizmalarını inceledik.
Devam etmek için forum başlığı altına "DEVAM" yazmanız yeterlidir!
Bir sonraki bölümde (Bölüm 3):
- OOP (Nesne Yönelimli Programlama) ve MRO (Method Resolution Order)
- Magic/Dunder Metotların Derinlikleri (__new__ vs __init__)
- Metasınıflar (Metaclasses) ve Class Decorator'lar
Yorumlarınızı ve sorularınızı aşağıda bekliyorum! 🚀✨
================================================
================================
🔒 Bu içeriği görmek için giriş yapın