Python Jeneratörleri ve Verim Açıklaması: Gerçek Örneklerle Bellekten Tasarruf Edin

  1. Ana sayfa
  2. Blog
  3. Yazılım Geliştirme

Yazılım Geliştirme

Python Jeneratörleri ve Getiri Açıklaması: Gerçek Örneklerle Bellekten Tasarruf Edin

Jeneratörler hafızada bir liste oluşturmak yerine değerleri teker teker üretir. Verimin bir işlevi nasıl duraklattığını tam olarak izleyin, ölçtüğümüz bellek farkını görün ve küçük bir veri hattı oluşturun.

9 dk okuma
Python oluşturucuları ve getirisi açıklandı: gerçek örneklerle hafızadan tasarruf edin

Önemli noktalar

  • yield içeren bir işlev, bir oluşturucu döndürür ve siz bir değer isteyene kadar gövdesi çalışmaz.
  • yield işlevi duraklatır ve bir sonraki isteğe kadar yerel durumunu korur.
  • Jeneratörler, ne kadar çok değer üretirse üretsin, küçük ve sabit miktarda bellek kullanır.
  • Bir jeneratör yalnızca bir kez tüketilebilir ve bu en yaygın tuzaktır.

Sadece hataları bulmak için 10 GB’lık bir günlük dosyasını bir listeye yüklediğinizi düşünün. Programınızın belleği bulamadan tükenebilir. Python oluşturucuları, talep üzerine değerleri birer birer üreterek bu sorunu çözer; böylece neredeyse hiç bellek olmadan çok büyük, hatta sonsuz veriler üzerinde çalışabilirsiniz.

Bu kılavuz, bir jeneratör çalıştığında gerçekte ne olduğunu adım adım gösterir. Her örneği Python 3.13’te çalıştırdık ve çıktı bu çalıştırmadan geliyor. Yeni başlayanlar için Python eğitimimizin kapsadığı işlevler ve döngüler konusunda zaten rahat olmanıza yardımcı olur.

Jeneratör nedir?

Jeneratör, yield kullanarak bir fonksiyon yazarak oluşturduğunuz özel bir yineleyici türüdür. İçinde yield bulunan herhangi bir işlev otomatik olarak bir jeneratör işlevi haline gelir ve onu çağırmak, kodu çalıştırmak yerine size bir jeneratör nesnesi verir.

def count_up(limit):
    print("starting")
    n = 1
    while n <= limit:
        yield n
        n += 1
    print("finished")

gen = count_up(2)
print(gen)

# <generator object count_up at 0x...>

“Başlangıç” ifadesinin yazdırılmadığına dikkat edin. Fonksiyonun çağrılması yalnızca jeneratörü yarattı. İçeride henüz hiçbir şey çalışmadı.

Getiri adım adım nasıl çalışır?

next()‘e yapılan her çağrı, yield‘ye ulaşana kadar işlevi çalıştırır, bu değeri geri verir ve yerinde donar. Bir sonraki çağrı, tüm yerel değişkenler bozulmadan bu satırdan hemen sonra devam eder.

print(next(gen))
# starting
# 1

print(next(gen))
# 2

next(gen)
# finished
# StopIteration

Çıktıyı dikkatlice takip edin. “başlıyor” yalnızca ilk next()‘de görünür. İkincisinde, yürütme kaldığı yerden devam eder, yani n hala kullanılabilir durumdadır ve 2 olur. Üçüncüsünde, döngü biter, “bitti” yazdırılır, işlev sondan düşer ve Python hiçbir şeyin kalmadığının sinyalini vermek için StopIteration‘ü yükseltir.

Nadiren kendiniz next()‘i ararsınız. Bir for döngüsü bunu sizin için yapar ve StopIteration‘ü sessizce işler; aynı şekilde list(), sum() ve benzer işlevler de bunu yapar:

print(list(count_up(3)))

# starting
# finished
# [1, 2, 3]

getiri vs getiri

Görünüş dönüş verim
Ne işe yarar Fonksiyonu sonlandırır İşlevi duraklatır
Üretilen değerler Bir sonuç Bir dizi, birer birer
Yerel eyalet Atıldı Değerler arasında korunmuş
Kod çalıştırıldığında Çağrıldığında hemen Yalnızca bir değer istendiğinde
Birçok değer için hafıza Hepsini tutmak lazım Birer birer tutar

Bu gecikme, tembel değerlendirme olarak bilinir: değerler yalnızca ihtiyaç duyulduğunda hesaplanır. Jeneratörün içindeki bir düz return basitçe onu bitirir ve bu da StopIteration‘ü tetikler.

Ölçülen hafıza farkı

Bir milyon karelik listeyi eşdeğer bir oluşturucuyla sys.getsizeof kullanarak karşılaştırdık:

import sys

squares_list = [n * n for n in range(1_000_000)]
squares_gen = (n * n for n in range(1_000_000))

print(sys.getsizeof(squares_list), sys.getsizeof(squares_gen))

# 8448728 200

Listenin kendi yapısı yaklaşık 8,4 MB yer kaplarken, oluşturucu sistemimizde yalnızca 200 bayt yer kapladı. getsizeof listedeki tamsayı nesneleri saymadığı için gerçek boşluk daha da büyüktür. Jeneratörün boyutu da bir milyar öğe için aynı kalıyor çünkü sonuçları değil yalnızca mevcut durumunu saklıyor.

Yine de bir takas var. Bir liste len() ile yeniden kullanılabilir, indekslenebilir ve ölçülebilir. Bir jeneratör bunların hiçbirini sunmaz. Rastgele erişime ihtiyacınız varsa veya az miktarda veri üzerinde birkaç kez döngü yapacaksanız liste daha basittir. Bu türler hakkında daha fazla bilgi için Python list vs Tuple vs set kılavuzumuza bakın.

Jeneratör ifadeleri

Basit durumlar için bir fonksiyona ihtiyacınız yoktur. Bir oluşturucu ifadesi, kare parantezlerin yerine yuvarlak parantezlerin bulunduğu bir liste kavrama‘ya benzer:

squares = [n * n for n in range(5)]   # builds a list now
squares = (n * n for n in range(5))   # produces values on demand

print(sum(n * n for n in range(5)))

# 30

sum()‘de olduğu gibi bir fonksiyonun tek argümanı bir üreteç ifadesi olduğunda, fazladan parantezleri dışarıda bırakabilirsiniz. Bu, büyük veriler üzerindeki toplamlar için düzenli bir alışkanlıktır çünkü geçici bir liste oluşturulmaz.

Bir veri hattı oluşturun

Jeneratörlerin gerçekten parladığı yer burasıdır. Küçük jeneratörler, her bir öğenin her adımda birer birer akacağı şekilde zincirlenebilir:

def read_lines(lines):
    for line in lines:
        yield line.strip()

def only_errors(lines):
    for line in lines:
        if line.startswith("ERROR"):
            yield line

def messages(lines):
    for line in lines:
        yield line.split(" ", 1)[1]

log = ["INFO started\n", "ERROR db down\n",
       "ERROR disk full\n", "INFO stopped\n"]

print(list(messages(only_errors(read_lines(log)))))

# ['db down', 'disk full']

Her adım küçük bir iş yapar ve kendi başına test edilebilir. Gerçek kullanımda, örnek listeyi açık bir dosyayla değiştirin, çünkü Python dosya işleme kılavuzumuzun gösterdiği gibi dosya nesneleri satır satır okunabilir. Çok gigabaytlık bir günlük bile çok az bellekle iletilecektir.

İpucu: Bir şey onu tüketene kadar bir ardışık düzen hiçbir iş yapmaz. Zinciri oluşturmak anında gerçekleşir. İşleme yalnızca son oluşturucunun üzerinden döngü yaptığınızda veya onu list() gibi bir çağrıya sardığınızda gerçekleşir.

Sonsuz diziler

Bir liste sonsuz olamaz, ancak bir oluşturucu bunu yapabilir çünkü yalnızca bir sonraki değeri hesaplar. İhtiyacınız kadarını almak için itertools.islice‘i kullanın:

import itertools

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

print(list(itertools.islice(fibonacci(), 8)))

# [0, 1, 1, 2, 3, 5, 8, 13]

Ancak dikkatli olun: list(fibonacci())‘i sınırsız olarak çağırmak, hafızanız bitene kadar devam eder. Aynı model kimlik oluşturuculara, yoklama döngülerine ve sayfalandırılmış API sonuçlarına uygundur; burada bir sonraki sayfayı yalnızca mevcut sayfa bittiğinde getirirsiniz.

verim ve partiler

yield from başka bir yinelenebilire geçerek iç içe geçmiş bir döngüden tasarruf etmenizi sağlar:

def chain_all(*groups):
    for group in groups:
        yield from group

print(list(chain_all([1, 2], (3, 4))))

# [1, 2, 3, 4]

Çok pratik bir model, verileri sabit boyutlu gruplara bölmektir; örneğin bir veritabanına her seferinde bin satır eklemek için:

def batches(items, size):
    batch = []
    for item in items:
        batch.append(item)
        if len(batch) == size:
            yield batch
            batch = []
    if batch:
        yield batch

print(list(batches(range(7), 3)))

# [[0, 1, 2], [3, 4, 5], [6]]

Son if batch, daha küçük bir kalan grubun kaybolmamasını sağlar. Python 3.12 ve üzeri aynı işi yapan itertools.batched‘yi de içerir.

gönder, kapat ve temizle

Jeneratörler de değer alabilir. send() jeneratörü sürdürür ve değer, yield ifadesinin sonucu olur. İlk yield‘e ulaşmak için önce next()‘ü bir kez aramalısınız:

def running_total():
    total = 0
    while True:
        value = yield total
        total += value

t = running_total()
next(t)
print(t.send(10), t.send(5))

# 10 15

Çoğu insan buna nadiren ihtiyaç duyar. Daha yaygın bir endişe ise temizliktir. Erken durursanız, jeneratör kapatıldığında bir finally bloğu çalışmaya devam eder:

def tracked():
    try:
        yield 1
        yield 2
    finally:
        print("cleanup ran")

tr = tracked()
next(tr)
tr.close()

# cleanup ran

Pytest tam da bu fikri kullanır: pytest eğitimimizin gösterdiği gibi, yield‘li bir fikstür, temizleme işlemini daha sonra gerçekleştirir. Benzer şekilde, standart kütüphanenin contextmanager dekoratörü bir oluşturucuyu with bloğa dönüştürür.

Sınıflardaki jeneratörler

Bir __iter__ yöntemini oluşturucu olarak yazmak, kendi sınıfınızı yinelenebilir hale getirmenin en kolay yoludur. Bir bonus, her döngünün yeni bir oluşturucuya sahip olmasıdır, böylece nesne tekrar tekrar döngüye alınabilir:

class Countdown:
    def __init__(self, start):
        self.start = start

    def __iter__(self):
        n = self.start
        while n > 0:
            yield n
            n -= 1

c = Countdown(3)
print(list(c), list(c))

# [3, 2, 1] [3, 2, 1]

Jeneratör ne zaman kullanılmalı

Aşağıdaki durumlarda bir jeneratör kullanın: Aşağıdaki durumlarda bir liste kullanın:
Veriler büyük veya boyutu bilinmiyor Veriler küçüktür ve belleğe sığar
Öğeleri sırayla bir kez işlersiniz Birkaç kez döngü yapıyorsunuz
Erken durabilirsin len(), indekslemeye veya dilimlemeye ihtiyacınız var
Bir akışı veya dosyaları okuyorsunuz Verileri sıralamanız veya tersine çevirmeniz gerekiyor
Bir boru hattı inşa ediyorsunuz Sadelik hafızadan daha önemlidir

Bir jeneratör genel olarak her zaman daha hızlı değildir. Her değeri kullanırsanız, toplam iş benzer olur ve öğe başına daha az ek yüke sahip olduğundan listenin anlaşılması küçük veriler için daha hızlı olabilir. Başlıca faydaları hafıza kullanımı ve ilk sonuçların daha erken alınmasıdır.

Yaygın hatalar

Bitmiş bir jeneratörün yeniden kullanılması

Bu bir noktada neredeyse herkesi yakalar. Bir jeneratör bittiğini hatırlar:

g = count_up(2)
print(list(g), list(g))

# [1, 2] []

İkinci çağrı hiçbir hatasız boş bir liste alır. Yeni bir oluşturucu almak için işlevi tekrar çağırın veya yukarıda gösterilen sınıf yaklaşımını kullanın.

Kodun hemen çalıştırılması bekleniyor

def noisy():
    print("body runs")
    yield 1

n = noisy()        # nothing is printed
print(next(n))     # body runs, then 1

Jeneratörün tepesindeki bağımsız değişken kontrolleri ilk next()‘e kadar çalışmaz, bu nedenle hatalar, onlara neden olan çağrıdan uzakta görünebilir.

Diğer tuzaklar

  • len()‘yi çağırmak veya dizine eklemek. Jeneratörler ikisini de desteklemez ve bir TypeError‘ü yükseltir.
  • Bir dosyayı çok erken kapatmak. Bir oluşturucuyu with bloğunun içinden döndürmek, dosyanın herhangi bir satır okunmadan kapanması anlamına gelebilir. yield‘ü with bloğunun içine yerleştirin.
  • Her şeyi list()‘ye sarmak. Bu, hafıza avantajını ortadan kaldırır.
  • Küçük veriler için bir tane kullanmak. Düz bir liste genellikle daha anlaşılırdır.

Son sözler

Jeneratör duraklatabilen bir fonksiyondur. Bu fikir size düşük bellek kullanımı, sonsuz diziler ve temiz işlem hatları sağlar. Bunu uygulamaya koymak için, kodunuzda yalnızca bir kez döngü oluşturacak büyük bir liste oluşturan bir yer bulun ve bunu bir oluşturucuya dönüştürün. Daha sonra iki küçük jeneratörü gerçek bir günlük dosyası üzerinde birbirine zincirlemeyi deneyin.

Sık sorulan sorular

Python’da verim ne işe yarar?

verim bir değer üretir ve yerel değişkenlerini koruyarak işlevi duraklatır. Bir sonraki değer istendiğinde fonksiyon aynı noktadan devam eder.

Jeneratör ile liste arasındaki fark nedir?

Bir liste, tüm değerlerini aynı anda hafızada saklar. Bir jeneratör her değeri talep üzerine hesaplar, çok az bellek kullanır ve genellikle yalnızca bir kez tüketilebilir.

Yineleyici ve jeneratör arasındaki fark nedir?

Her jeneratör bir yineleyicidir. Python sizin için __iter__ ve __next__ yöntemlerini oluşturduğundan, jeneratör yazmanın en kolay yoludur.

Bir jeneratörün üzerinden iki kez geçebilir misiniz?

Hayır. Bir kez tükendiğinde, hata yaratmadan başka hiçbir şey vermez. İşlevi tekrar çağırarak yeni bir oluşturucu oluşturun veya sonuçları bir listede saklayın.

Jeneratörler listelerden daha mı hızlı?

Her zaman değil. Çok daha az bellek kullanırlar ve ilk sonucu daha çabuk verirler, ancak küçük miktarda veriyi tamamen tükettiğinizde listenin anlaşılması biraz daha hızlı olabilir.

Öğrenmeye devam et

Stack Quora ile çalışın

Test, WordPress veya SEO konusunda yardıma mı ihtiyacınız var?

Ekiplerin daha iyi yazılımlar sunmasına ve sitelerini büyütmesine yardımcı oluyoruz. Bize ne üzerinde çalıştığınızı söyleyin, biz de bir sonraki adım için net bir öneride bulunalım.

Okumaya devam et

Daha fazla kılavuz test, yapay zeka ve modern geliştirme

Bu makaleyi beğendiniz mi? Bir konu seçin ve doğrudan en yeni eğitimlerimize geçin.

Yapay zekâ

Yapay Zeka Halüsinasyonları Açıklandı: Dil Modelleri Neden İşleri Düzeltiyor ve Nasıl Azaltılabilir?

Yapay zeka halüsinasyonları açıkladı: ne olduklarını, dil modellerinin bunları neden ürettiğini, yaygın türlerini, temellendirme ve yönlendirmelerle…

Makaleyi okuyun →
DevOps

Açıklanan Ortam Değişkenleri: .env Dosyaları, Sırlar ve Yapılandırma Doğru Yapıldı

Çalıştırdığımız Python örnekleriyle açıklanan ortam değişkenleri: bunları okumak ve ayarlamak, neden her değerin bir dize olduğu, .env dosyaları, sü…

Makaleyi okuyun →
Yazılım geliştirme

API Hız Sınırlamasının Açıklaması: Algoritmalar, Başlıklar ve 429 Hatalarının Ele Alınması

API hızı sınırlaması, çalıştırdığımız bir simülasyonla açıklanmıştır: belirteç kümesi, sabit pencere, kayan pencere, 429 yanıt, hız sınırı başlıklar…

Makaleyi okuyun →
Test otomasyonu

Python'da alay etme: Unittest.mock, patch ve Testleri Yalan Yapan Hatalar

Unittest.mock ile Python'da alay etme, test edildi: Sahte ve dönüş_değeri, yan_etki, bir adın kullanıldığı yerde yama uygulama, spesifikasyon ve oto…

Makaleyi okuyun →
Yazılım testi

Kod Kapsamının Açıklaması: Hat ve Şube Kapsamı ve %100'ün Gerçek Anlamı

Kod kapsamı gerçek bir kapsama.py çalışmasıyla açıklanmıştır: hat, şube ve durum kapsamı, bir raporun okunması, %100 kapsamın neden hâlâ hataları ka…

Makaleyi okuyun →
Veritabanları ve SQL

SQL'de DELETE vs TRUNCATE vs DROP: Farklılıklar, Geri Alma ve Her Biri Ne Zaman Kullanılmalı

DELETE vs TRUNCATE vs DROP test edilmiş SQL ile açıklandı: her birinin neyi kaldırdığı, geri aldığı, tetiklediği, kimlik sıfırlaması, hızı ve Postgr…

Makaleyi okuyun →
Veritabanları ve SQL

Açıklanan SQL Görünümleri: Örneklerle Tuzakları Oluşturun, Kullanın ve Önleyin

Çalıştırdığımız sorgularla açıklanan SQL görünümleri: görünüm oluşturma, canlı sonuçlar, sütunları gizleme, performans, güncellenebilir ve gerçekleş…

Makaleyi okuyun →
Yazılım geliştirme

TypeScript Arayüzü ve Tür: Gerçek Farklılıklar, Derleyiciyle Test Edildi

TypeScript arayüzü ve türü, gerçek derleyiciyle kontrol edildi: her ikisinin de yapabileceği, yalnızca birinin yapabileceği, bildirim birleştirme, g…

Makaleyi okuyun →
Yazılım geliştirme

Python *args ve **kwargs'ın Açıklaması: Açık Örneklerle Esnek Fonksiyonlar

Python *args ve **kwargs çalıştırdığımız kodla açıklanmıştır: paketleme ve paketten çıkarma, parametre sırası, yalnızca anahtar kelime ve yalnızca k…

Makaleyi okuyun →
Yazılım geliştirme

Python Lambda İşlevleri: Söz Dizimi, Gerçek Kullanımlar ve Ne Zaman Kullanılmaması Gerektiği

Çalıştırdığımız kodla açıklanan Python lambda işlevleri: sözdizimi, anahtarla sıralama, harita ve filtre, kapatmalar, geç bağlama tuzağı ve normal b…

Makaleyi okuyun →
Yapay zekâ

Yapay Zeka Ajanları Nelerdir? Çalıştırabileceğiniz Basit Bir Aracı Döngüsüyle Nasıl Çalışırlar?

Yapay zeka ajanları nedir? Aracı döngüsüne, araçlara, belleğe ve korkuluklara ilişkin basit bir kılavuz, çalıştırdığımız küçük bir Python döngüsü, g…

Makaleyi okuyun →
DevOps

İzleme ve Gözlemlenebilirlik: Günlükler, Metrikler ve İzlerle Gerçek Fark

İzleme ve gözlemlenebilirliğin açıklanması: bilinen ve bilinmeyen arızalar, günlükler, ölçümler ve izler, ödeme olayının gözden geçirilmesi, altın s…

Makaleyi okuyun →
DevOps

Docker Birimleri ve Bağlama Bağlantıları: Konteyner Verilerini Doğru Şekilde Kalıcılaştırın

Docker birimleri ile bağlama bağlamaları arasındaki karşılaştırma açıklandı: kapsayıcı verilerinin neden kaybolduğu, adlandırılmış birimler, bağlama…

Makaleyi okuyun →
Test otomasyonu

TDD ve BDD: Temel Farklılıklar, Her İki Şekilde Geliştirilmiş Bir Özellik ve Her Birinin Ne Zaman Kullanılacağı

TDD ve BDD, her iki yönde de oluşturulmuş bir indirim özelliğiyle açıklandı: çalıştırdığımız kodla kırmızı-yeşil-refactor, Verilen-Ne Zaman-O Zaman …

Makaleyi okuyun →
Yazılım testi

Kullanıcı Kabul Testi (UAT): Süreç, Kontrol Listesi ve Gerçek Örnekler

Kullanıcı kabul testi açıklandı: bunu kimin yürüttüğü, QA'dan farkı, yedi adımlı bir süreç, bir UAT test senaryosu şablonu, bir kontrol listesi, otu…

Makaleyi okuyun →
Veritabanları ve SQL

Açıklanan SQL NULL Değerleri: IS NULL, COALESCE, NULLIF ve Kaçınılması Gereken Tuzaklar

SQL NULL değerleri, çalıştırdığımız sorgularla açıklandı: üç değerli mantık, IS NULL, COALESCE, NULLIF, toplamaların, birleştirmelerin ve sıralamanı…

Makaleyi okuyun →
Veritabanları ve SQL

SQL CASE WHEN İfadesi: Sözdizimi, Gerçek Örnekler ve Yaygın Hatalar

SQL CASE WHEN çalıştırdığımız sorgularla açıkladı: basit ve aranmış formlar, koşul sırası, SUM'lu pivotlar, COUNT hileleri, özel sıralama, güncellem…

Makaleyi okuyun →
Yazılım geliştirme

JWT Nedir? JSON Web Belirteçleri Bir Çalışma Örneğiyle Açıklanıyor

JWT nedir? JSON Web Tokens açıkladı: üç bölüm, çalıştırdığımız kodda oluşturulan ve üzerinde değişiklik yapılan bir token, JWT ile oturumlar, depola…

Makaleyi okuyun →
Yazılım geliştirme

JavaScript Olay Döngüsü Açıklaması: Örneklerle Çağrı Yığını, Mikro Görevler ve Zamanlayıcılar

JavaScript olay döngüsü çalıştırdığımız kodla açıklandı: çağrı yığını, görev ve mikro görev kuyrukları, setTimeout 0'ın neden anında olmadığı, engel…

Makaleyi okuyun →
Yazılım geliştirme

Python Jeneratörleri ve Verim Açıklaması: Gerçek Örneklerle Bellekten Tasarruf Edin

Python üreteçleri ve verim, çalıştırdığımız kodla açıklandı: nasıl duraklatılır ve devam ettirilir, ölçülen bellek tasarrufları, işlem hatları, sons…

Makaleyi okuyun →
Yapay zekâ

Gömmeler Nelerdir? Vektörler ve Kosinüs Benzerliği Basitçe Açıklandı

Gömmeler nedir? Vektörler, kosinüs benzerliği ve anlamsal aramaya ilişkin sade dilli bir kılavuz; çalıştırdığımız küçük bir örnek, yaygın kullanımla…

Makaleyi okuyun →
DevOps

Mavi-Yeşil ve Kanarya Konuşlandırılması: Farklılıklar, Takaslar ve Nasıl Seçilir

Mavi-yeşil ve kanarya konuşlandırması açıklandı: her birinin nasıl çalıştığı, maliyet, risk ve geri alma, test ettiğimiz istikrarlı kullanıcı grubu,…

Makaleyi okuyun →
Test otomasyonu

Kesintili Testler: Bunların Sebepleri ve Nasıl Düzeltileceği

Yaptığımız demolarla açıklanan hatalı testler: ana nedenler, birinin nasıl doğrulanacağı ve teşhis edileceği, zamanlama için uygun düzeltmeler, payl…

Makaleyi okuyun →
Yazılım testi

Yük Testi ve Stres Testi: Farklılıklar, Metrikler ve k6 Örnekleri

Yük testi ve stres testinin açıklaması: her birinin neyi kanıtladığı, ani yükselme ve soğuma testleri, önemli ölçümler, ortalamaların neden yanıltıc…

Makaleyi okuyun →
Yazılım testi

Test Senaryosu ve Test Senaryosu: Temel Farklılıklar, Örnekler ve Her Biri Ne Zaman Kullanılmalı?

Test senaryosu ve test senaryosunun açıklaması: net tanımlar, yan yana tablo, senaryolardan vakalara, şablonlara ve her birinin ne zaman kullanılaca…

Makaleyi okuyun →
Veritabanları ve SQL

SQL Sorgu Optimizasyonu: Zamanlamalarla Yürütme Planlarını Okuyun ve Yavaş Sorguları Düzeltin

SQL sorgu optimizasyonu bir milyon satırda test edilmiştir: yürütme planlarını okuyun, doğru dizinleri ekleyin, değiştirilemeyen filtreleri düzeltin…

Makaleyi okuyun →
Veritabanları ve SQL

SQL UNION ve UNION ALL: Farklılıklar, Örnekler ve Test Edilmiş Performans

SQL UNION ve UNION ALL, yürüttüğümüz sorgularla açıklandı: kopyalar, her ikisinin de takip ettiği kurallar, gerçek bir veri hatası, ölçülen performa…

Makaleyi okuyun →
Yazılım geliştirme

JavaScript Fetch API Eğitimi: GET, POST, Hata İşleme ve Zaman Aşımları

Yerel bir sunucuya karşı test edilen bir JavaScript Fetch API öğreticisi: GET ve POST, 404'ün neden atmadığı, yeniden kullanılabilir bir yardımcı, s…

Makaleyi okuyun →
Yazılım geliştirme

Python Dosya İşleme: Örneklerle Okuma, Yazma, CSV, JSON ve pathlib

Python dosya işleme, çalıştırdığımız kodla açıklanmıştır: açık modlar, büyük dosyaları okuma, CSV, JSON, pathlib, ikili dosyalar, güvenli yazma, hat…

Makaleyi okuyun →
Yazılım geliştirme

Python Sınıfları ve Nesneleri: Gerçek Örneklerle OOP Eğitimi

Çalıştırdığımız kodla açıklanan Python sınıfları ve nesneleri: __init__, yöntemler, sınıf ve örnek nitelikleri, kalıtım, özellikler, dunder yöntemle…

Makaleyi okuyun →
Yapay zekâ

Büyük Dil Modeli Nedir? Yüksek Lisans'ların Nasıl Çalıştığı, Abartmadan Açıklanıyor

Büyük dil modeli nedir? LLM'ler sade bir dille açıklandı: belirteçler, yerleştirmeler, dikkat, eğitim, sıcaklık ve bağlam pencereleri, küçük bir son…

Makaleyi okuyun →
DevOps

Yeni Başlayanlar İçin Linux Komutları: Örneklerle Temel Terminal Kılavuzu

Yeni başlayanlar için göreve göre gruplandırılmış Linux komutları: pratik bir günlük analizi örneğiyle gezinme, dosyalar, günlükleri görüntüleme, gr…

Makaleyi okuyun →
Test otomasyonu

Selenyum ve Oyun Yazarı: Temel Farklılıklar, Karşılaştırılan Kod ve Hangisinin Seçileceği

Selenium ve Playwright karşılaştırması: mimari, bekleme, tarayıcı ve dil desteği, hata ayıklama, her iki araçta da aynı test, geçiş tavsiyesi ve nas…

Makaleyi okuyun →
Yazılım testi

Eşdeğerlik Bölümleme: Test Tasarımı Tekniğinin Çalışılmış Örneklerle Açıklanması

Eşdeğerlik bölümlemenin açıklaması: geçerli ve geçersiz bölümlerin nasıl bulunacağı, yaşlara yönelik çalışılmış örnekler, şifreler ve kuponlar, yürü…

Makaleyi okuyun →
Yazılım testi

Yazılım Testinde Şiddet ve Öncelik: Farklılıklar, Matris ve Gerçek Örnekler

Yazılım testinde önem ve önceliğin açıklanması: net tanımlar, örnekler içeren dört yönlü bir matris, seviye ölçekleri, her birini kimin belirlediği …

Makaleyi okuyun →
Veritabanları ve SQL

SQL Alt Sorguları Eğitimi: Türler, İlişkili Alt Sorgular ve Örneklerle EXISTS

Çalıştırdığımız sorguları içeren bir SQL alt sorgu eğitimi: skaler, IN, FROM ve SELECT alt sorguları, ilişkili alt sorgular, EXISTS, NOT IN NULL tuz…

Makaleyi okuyun →
Veritabanları ve SQL

SQL İşlemleri ve ACID Açıklaması: COMMIT, ROLLBACK ve İzolasyon Seviyeleri

SQL işlemleri ve ACID, yürüttüğümüz bir banka transferiyle açıklandı: COMMIT, ROLLBACK, kayıt noktaları, kilitler, izolasyon seviyeleri, kirli okuma…

Makaleyi okuyun →
Yazılım geliştirme

Git merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır

Git merge vs rebase; gerçek log çıktısı, karşılaştırma tablosu, rebase'in altın kuralı ve güvenli bir ekip iş akışıyla anlatılıyor.

Makaleyi okuyun →
Yazılım geliştirme

Python Liste Üreteci (List Comprehension): Sözdizimi, Örnekler ve Kaçınılacak Durumlar

Python list comprehension anlatımı: sözdizimi, filtreleme, if-else, iç içe döngüler, ölçülmüş süreler ve düz for döngüsünün daha iyi olduğu durumlar.

Makaleyi okuyun →
Veritabanları ve SQL

SQL JOIN Örneklerle Açıklama (Inner, Left, Right, Full)

SQL JOIN'leri örnek tablolar ve sorgularla adım adım öğrenin: INNER, LEFT, RIGHT, FULL, CROSS ve SELF; yaygın hatalar ve performans ipuçları.

Makaleyi okuyun →