Yazar: Hatice Özbolat

  • Netflix İzleme Geçmişi Panosu 2: Streamlit ile Panoya Dönüştürmek

    Netflix İzleme Geçmişi Panosu 2: Streamlit ile Panoya Dönüştürmek

    İlk bölümde Netflix izleme geçmişimi indirip temizledim ve not defterinde ona sorular sordum: En çok hangi diziyi izlemişim, hangi günler daha çok izliyorum, maraton günüm hangisi? Ama not defteri, cevabı görmek için her seferinde kod çalıştırmayı gerektiriyor. Bu bölümde aynı kodu, tıklayıp filtreleyebileceğin bir web panosuna çeviriyoruz. Hem de HTML ya da JavaScript bilmeden, sadece Python ile.

    Uygulamanın tüm kodu GitHub’da: pop-kultur-kodluyorum / netflix-pano.

    Streamlit nedir?

    Streamlit, Python koduyla web uygulaması yapmayı sağlayan açık kaynak bir kütüphane. Veri bilimcilerin en sevdiği araçlardan biri, çünkü mantığı çok basit: Bir Python dosyası yazıyorsun, st.title("Merhaba") dersen sayfada başlık, st.bar_chart(veri) dersen grafik çıkıyor. Biri bir düğmeye bastığında ya da bir filtreyi değiştirdiğinde Streamlit dosyayı yukarıdan aşağı yeniden çalıştırır ve sayfayı günceller.

    Bu “her etkileşimde yeniden çalıştır” fikri başta garip gelebilir, ama işi çok kolaylaştırıyor: Kodu not defterinde yazar gibi yukarıdan aşağı yazıyorsun, gerisini Streamlit hallediyor.

    Kurulum

    Streamlit kendi bilgisayarında çalışır (Colab’da doğrudan çalışmaz). Terminalde:

    pip install streamlit pandas altair

    Kurulumu denemek için streamlit hello yazabilirsin; tarayıcında bir örnek uygulama açılır.

    Uygulamanın parçaları

    Uygulama tek bir dosya: app.py. Altı bölümden oluşuyor. Tamamı GitHub’da; burada her bölümün önemli satırlarını anlatıyorum.

    1. Temizleme fonksiyonları: ilk bölümden aynen

    Tarihleri çözen tarihi_coz ve diziyi filmden ayıran ayir fonksiyonlarını ilk bölümden hiç değiştirmeden taşıdım. Hepsini tek bir fonksiyonda topladım:

    @st.cache_data
    def veriyi_hazirla(ham):
    df = ham.rename(columns={"Title": "baslik", "Date": "tarih"})
    df["tarih"] = tarihi_coz(df["tarih"])
    df = df.dropna(subset=["tarih"])
    df[["isim", "tur"]] = df["baslik"].apply(lambda b: pd.Series(ayir(b)))
    # ... ikinci adım: tekrar eden ön ekleri dizi say
    return df

    @st.cache_data satırı bir dekoratör: fonksiyonun üstüne yapışan bir etiket gibi düşün. Streamlit’e “bu fonksiyonu aynı veriyle tekrar çağırırlarsa baştan hesaplama, önceki sonucu ver” diyor. Her filtre değişikliğinde dosya yeniden çalıştığı için bu önemli; yoksa binlerce satırı her tıklamada yeniden temizlerdik.

    2. Dosyayı almak

    dosya = st.file_uploader("NetflixViewingHistory.csv dosyanı yükle", type="csv")
    if dosya is None:
    st.info("Henüz dosya yüklemedin. Aşağıda hayali bir örnek veriyle gösteriyorum.")
    df = veriyi_hazirla(ornek_veri())
    else:
    df = veriyi_hazirla(pd.read_csv(dosya))

    st.file_uploader sayfaya bir dosya yükleme kutusu koyar. Kullanıcı henüz dosya seçmediyse None döner; o zaman pano boş kalmasın diye hayali bir örnek veri gösteriyoruz. Bu örnek veri tamamen uydurma dizi isimlerinden oluşuyor.

    3. Filtreler: kenar çubuğu

    with st.sidebar:
    yillar = sorted(df["tarih"].dt.year.unique())
    secilen_yillar = st.multiselect("Yıl", yillar, default=yillar)
    tur = st.radio("Tür", ["Hepsi", "Dizi", "Film"], horizontal=True)
    f = df[df["tarih"].dt.year.isin(secilen_yillar)]
    if tur != "Hepsi":
    f = f[f["tur"] == tur]

    with st.sidebar: bloğunun içine yazılan her şey sol taraftaki kenar çubuğuna gider. st.multiselect birden fazla yıl seçmeye, st.radio türlerden birini seçmeye yarıyor. Seçimler sıradan Python değişkenlerine düşüyor; sonra pandas ile tabloyu filtreliyoruz. Sayfanın geri kalanı hep bu filtrelenmiş f tablosunu kullanıyor, böylece bir filtre değişince tüm pano birlikte değişiyor.

    4. Özet kartları

    k1, k2, k3, k4 = st.columns(4)
    k1.metric("Toplam kayıt", len(f))
    k2.metric("Farklı dizi", f.loc[f["tur"] == "Dizi", "isim"].nunique())
    k3.metric("Film", int((f["tur"] == "Film").sum()))
    k4.metric("Maraton günü", f"{gunluk.max()} kayıt")

    st.columns(4) sayfayı dört eşit sütuna böler, metric da her sütuna büyük bir sayı koyar. Panonun en üstündeki özet buradan geliyor.

    5. Grafikler

    Streamlit’in kendi st.bar_chart fonksiyonu hızlı ama günlerin sırasını alfabetik yapıyor (Cuma, Cumartesi, Çarşamba…). Haftanın günlerini doğru sırada göstermek ve renkleri seçmek için Streamlit’le birlikte gelen Altair kütüphanesini kullandım. Aynı çubuk grafiği üç yerde kullanacağım için küçük bir fonksiyon yazdım:

    def cubuk(veri, x, y, renk=BOGURTLEN, sira=None, x_baslik="", y_baslik="Kayıt"):
    return (
    alt.Chart(veri)
    .mark_bar(color=renk, cornerRadiusEnd=4)
    .encode(
    x=alt.X(x, sort=sira, title=x_baslik),
    y=alt.Y(y, title=y_baslik),
    tooltip=[x, y],
    )
    )

    sort=sira parametresine ["Pazartesi", "Salı", ...] listesini verince günler doğru sıraya diziliyor. tooltip da fareyle çubuğun üzerine gelince sayıyı gösteriyor. Grafiği sayfaya koymak için st.altair_chart(grafik) yeterli. (GitHub’daki tam sürümde eksen biçimleri için birkaç ayar daha var.)

    En çok izlenen 10 dizi ise grafik değil tablo: st.dataframe(ilk10, hide_index=True). Uzun dizi isimleri tabloda daha rahat okunuyor.

    6. Bir diziye yakından bak

    diziler = f.loc[f["tur"] == "Dizi", "isim"].value_counts().index.tolist()
    secilen = st.selectbox("Dizi seç", diziler)
    d = f[f["isim"] == secilen]

    st.selectbox bir açılır menü koyar. Liste en çok izlenenden en aza doğru sıralı. Bir dizi seçince ilk ve son izleme tarihini ve o dizinin aylara göre grafiğini gösteriyoruz. Bir diziyi birkaç haftada bitirip bitirmediğini ya da yıllara yayıp yaymadığını bu grafikte görebiliyorsun.

    Çalıştırmak

    1. GitHub’dan netflix-pano klasörünü indir (ya da depoyu klonla).
    2. Terminalde o klasöre gir ve pip install -r requirements.txt yaz.
    3. streamlit run app.py yaz. Tarayıcında pano açılır.
    4. Netflix’ten indirdiğin NetflixViewingHistory.csv dosyasını yükleme kutusuna sürükle.

    Dosyayı Netflix’ten nasıl indireceğini ilk bölümde adım adım anlattım.

    Panoyu internete koymak

    Panoyu arkadaşlarınla paylaşmak istersen Streamlit Community Cloud’u kullanabilirsin: GitHub hesabınla giriş yapıp deponu ve app.py dosyasını seçiyorsun, uygulama birkaç dakika içinde bir web adresinde yayına giriyor. Uygulama kimsenin verisini kendi içinde taşımıyor; her ziyaretçi kendi dosyasını yüklüyor.

    Gizlilik notu: Uygulama yüklenen dosyayı hiçbir yere kaydetmiyor, sadece açık olan oturumda işliyor. Yine de ham CSV dosyanı GitHub gibi herkese açık bir yere koyma. İzleme geçmişi, ne zaman uyanık olduğuna kadar çok şey anlatır. Paylaşırken sadece toplamları ve grafikleri paylaş; ben de bu yazıda öyle yaptım.

    Panoda ne gördüm?

    Kendi verimi yükleyince pano şunları gösterdi:

    • Ağustos 2019’dan bu yana toplam 4.986 kayıt, 487 farklı dizi ve 350 film.
    • Haftanın en çok izlediğim günü Pazar, ikinci sırada Pazartesi. Hafta içinin diğer günleri birbirine çok yakın.
    • Maraton günümde 36 kayıt var.

    Kendin dene

    • Kenar çubuğuna bir saat filtresi ekleyemezsin, çünkü Netflix dosyasında saat yok. Ama bir ay filtresi ekleyebilirsin: st.slider ile 1-12 arası seçim yap.
    • “En çok izlenen 10 dizi” yerine kullanıcının kaç dizi görmek istediğini seçmesini sağla: st.number_input("Kaç dizi?", 5, 30, 10).
    • Bir arkadaşınla karşılaştır: İki dosya yükletip iki kişinin haftalık çubuklarını yan yana göster.

    Bir sonraki pop kültür projesinde Netflix verisini bir adım daha ileri taşıyıp basit bir öneri sistemi yazacağız: “Netflix’te Ne İzlesem?”

  • Bilgisayar Mühendisliği Nedir, Ne Değildir?

    Bilgisayar Mühendisliği Nedir, Ne Değildir?

    “Bilgisayar mühendisi misin? O zaman şu laptopuma bir bakıversene.” Bu bölümü okuyan ya da bitiren hemen herkes bu cümleyi en az bir kez duymuştur. Bilgisayar mühendisliği popüler bir bölüm ama ne olduğu hakkında yanlış bilinen çok şey var. Tercih döneminde bu bölümü düşünen biri, başka bir alandan geçmek isteyen biri ya da sadece merak eden biri için bu yazıda bölümü biraz yakından anlatmak istiyorum.

    Bu konuyu videoda da anlattım. İzleyerek öğrenmeyi seviyorsan buradan başlayabilirsin 👇

    Kısa tanım

    Bilgisayar mühendisliği, bilgisayar sistemlerinin nasıl tasarlandığını, nasıl çalıştığını ve bu sistemler üzerinde çalışan yazılımların nasıl geliştirildiğini inceleyen mühendislik dalı. Bir yanında donanım (işlemci, bellek, devreler), öbür yanında yazılım (algoritmalar, programlama, veritabanları, ağlar) var. Ortada da ikisini birbirine bağlayan teori: matematik ve problem çözme.

    Ne değildir?

    Bilgisayar tamirciliği değildir. Bir bilgisayar mühendisi bozuk bir laptopu tamir edebilir de, edemeyebilir de. Okulda bilgisayarın içini söküp takmayı değil, işlemcinin bir komutu nasıl çalıştırdığını öğreniyorsun. Teknik servis başka bir uzmanlık.

    Sadece kod yazmak değildir. Kod yazmak işin önemli bir parçası ama tamamı değil. Bir problemi parçalara ayırmak, doğru algoritmayı seçmek, sistemi tasarlamak, başkalarıyla birlikte çalışmak, hatayı bulmak… Kodu yazmak çoğu zaman bu düşünme sürecinin son adımı.

    Matematik dehası olmayı gerektirmez. Matematik dersleri var ve kolay değil: kalkülüs, lineer cebir, ayrık matematik, olasılık. Ama amaç matematikçi olmak değil, mantıklı düşünmeyi ve problemi modellemeyi öğrenmek. Düzenli çalışan biri bu derslerden geçebilir.

    Oyun oynamayı sevmek yetmez. Oyunlar birçok kişinin bilgisayara ilgisini başlatan şey ama oyun oynamak ile oyun geliştirmek çok farklı işler. Oyun geliştirme de bu bölümün ana konusu değil; kariyer yollarından sadece biri.

    “Bilgisayarı iyi kullanıyorum” demek yeterli bir sebep değildir. Bir arabayı iyi kullanmak, motorun nasıl tasarlandığını bilmek demek değil. Bölüm, bilgisayarı kullanmaktan çok onun arkasındaki mantığı anlamakla ilgili.

    Dört yılda neler öğreniliyor?

    Ders programları üniversiteden üniversiteye değişiyor ama genel akış çoğu yerde benzer:

    DönemTipik dersler
    1. yılProgramlamaya giriş, kalkülüs, fizik, ayrık matematik
    2. yılVeri yapıları, nesne yönelimli programlama, mantık devreleri, lineer cebir, olasılık
    3. yılAlgoritma analizi, işletim sistemleri, veritabanları, bilgisayar ağları, bilgisayar mimarisi, yazılım mühendisliği
    4. yılSeçmeli dersler (yapay zekâ, görüntü işleme, siber güvenlik, mobil programlama gibi) ve bitirme projesi

    Ara dönemlerde çoğu üniversitede staj zorunluluğu var. Staj, okulda öğrendiklerinin iş dünyasında nasıl kullanıldığını görmenin ilk fırsatı.

    İlk iki yıl genelde en zorlayıcı dönem: Matematik ağırlıklı dersler ve programlamaya yeni başlamanın verdiği bocalama bir araya geliyor. Bu dönemi atlatanlar için 3. ve 4. yılda dersler daha uygulamalı ve daha “bilgisayar” hissettiren konulara geliyor.

    Yazılım mühendisliğinden farkı ne?

    Tercih döneminin en çok sorulan sorularından biri. Kısaca:

    • Bilgisayar mühendisliği daha geniş: Donanım tarafını (devreler, mimari) ve teoriyi de kapsar.
    • Yazılım mühendisliği yazılımın yaşam döngüsüne odaklanır: gereksinim analizi, tasarım, test, proje yönetimi.

    Ama pratikte iki bölümün ders programları büyük ölçüde örtüşüyor ve mezunları çoğu zaman aynı işlere başvuruyor. İkisi arasında kararsızsan, bölüm adından çok üniversitenin ders programına, laboratuvarlarına ve staj imkanlarına bakmak daha faydalı.

    Mezun olunca neler yapılır?

    Bilgisayar mühendisliğinin en güzel tarafı kapıların çok olması. Bazı yollar:

    • Yazılım geliştirme: web (ön yüz, arka yüz), mobil uygulama, masaüstü yazılımları.
    • Veri ve yapay zekâ: veri analisti, veri bilimci, makine öğrenmesi mühendisi.
    • Altyapı ve bulut: sistem yöneticisi, DevOps, bulut mühendisi.
    • Siber güvenlik: güvenlik analisti, sızma testi uzmanı.
    • Gömülü sistemler: otomotivden akıllı cihazlara kadar donanımla iç içe yazılım.
    • Oyun geliştirme.
    • Kamu: bakanlıkların ve kurumların bilişim birimleri.
    • Akademi: yüksek lisans, doktora ve araştırma.
    • Teknik olmayan ama teknik bilgi isteyen roller: ürün yöneticisi, iş analisti, danışmanlık.

    Bu yolların ikisini daha önce ayrı yazılarda anlattım: veri analisti olmak için yol haritası ve kamuya girmek isteyenler için KPSS rehberi.

    Bu bölüm kimler için uygun?

    Puanından çok şu sorulara verdiğin cevaplar önemli:

    • Bir şeyin nasıl çalıştığını merak eder misin?
    • Bir problemle saatlerce uğraşıp sonunda çözdüğünde keyif alır mısın, yoksa bu seni yorar mı?
    • Hata yapmayı kaldırabilir misin? Programlama, sürekli hata alıp düzeltmekten oluşan bir iş.
    • Ders bittikten sonra da öğrenmeye devam etmeye hazır mısın? Teknoloji çok hızlı değişiyor; okulda öğrendiklerin bir başlangıç.

    Bu sorulara çoğunlukla “evet” diyorsan, matematikten korksan bile bu bölümde mutlu olma ihtimalin yüksek.

    Başlamadan önce ne yapabilirsin?

    En iyi test, biraz kod yazmayı denemek. Bunun için bilgisayarına bir şey kurman bile gerekmiyor: Bu blogdaki Python dersleri tamamen tarayıcıda, Google Colab üzerinde ilerliyor. İlk birkaç dersi bitirdiğinde “bu bana keyif veriyor mu?” sorusunun cevabını büyük ölçüde almış olursun.

    Benim için bilgisayar mühendisliği

    Benim için bilgisayar mühendisliği, dijital dünyada her şeyi yapabilen ve üretebilen tarafta yer almak demek.

    Ama dürüst olayım, bu taraf aynı zamanda kaygısı bol bir taraf. Bilgiye herkesin ulaşabildiği, birkaç aylık bir kursla ya da bir yapay zekâ aracıyla herkesin “yazılımcı” olabildiği bir dünyada bazen insanın içi sıkılıyor. “Ben neden bu kadar uğraştım?” sorusunu düşünmeden devam edebilmek kimi zaman gerçekten zor.

    Ama devam edince karşına uçsuz bucaksız bir evren çıkıyor. Oyun yapmak istersen yaparsın, bir mobil uygulama geliştirmek istersen geliştirirsin, veriden hikâye çıkarmak istersen çıkarırsın. Bu blogdaki her yazı, her proje de o evrende atılmış küçük bir adım.

    Bu bölümü düşünen birine tek bir tavsiyem olsun: Kaygıları duy ama onların seni durdurmasına izin verme. Üretmeye başladığın an, bu alanın ne kadar geniş olduğunu kendin göreceksin.

  • Değişim Günlüğü, 4. Gün: Şikâyet etmemenin bedeli

    1. günden merhaba,

    Açık konuşayım, bugünü pek yapamadım. Görevimiz gün içindeki şikâyetlerimizi yakalamaktı. İlk okuduğumda “Bu bana göre değil” dedim, çünkü ben hayattan pek şikâyet etmem. Hayatı olduğu gibi yaşarım. Ne gelirse kabul ederim, sorunlara çözüm bulur ve yoluma devam ederim. Yıllar içinde şunu öğrendim: Değiştiremeyeceğim şeylerin üzerine hayatımı kurmuyorum.

    Ama bugün bu görev bana bambaşka bir soruyu sordurdu: Acaba bu “şikâyet etmeme” hâli, bazen durumumu iyileştirmek için çaba harcamamı da engelliyor mu?

    Aklıma hemen bir gün geldi. Otogardan eve dönecektim. Yol uzun ama genelde ya yürürüm ya otobüse binerim. Sabah çok erkendi, otobüs bulamadım. “O zaman yürürüm” dedim. Valiz çok ağırdı ama yürüdüm. Eve vardım, evet. Ama sonraki üç gün yorgunluğum geçmedi.

    Bence başka biri olsa o sabah hiç düşünmeden taksiye binerdi. Ben ise “Şikâyet etme, bir çözüm bul, devam et” dedim ve kendimi zorladım. Sorunu çözdüm ama en zor yoldan.

    Bugün fark ettiğim şey şu: Şikâyet etmediğim için bazen içinde bulunduğum durumu göremiyorum. Ağır valizi “taşınabilir” sayıyorum, yorgunluğu “geçer” sayıyorum. Kabullenmek ile katlanmak arasındaki çizgi bazen bulanıklaşıyor. Kabullenmek, değiştiremeyeceğim şeyle barışmak. Katlanmak ise değiştirebileceğim bir şeyi değiştirmemek. O sabah taksi bir seçenekti; ben onu hiç masaya koymadım.

    Belki benim için asıl görev şikâyetlerimi yakalamak değil, kendime “Bunu daha kolay yapmanın bir yolu var mı?” diye sormak. Hatırlarsan her sabah evrene de tam olarak bunu söylüyorum: “Bana hayatın daha kolay olabileceğine dair kanıt göster.” Belki de kanıt hep oradaydı, ben taksiye binmiyordum.

    Son iki gün

    Son iki gün istediğim gibi geçmedi, bunu da saklamayacağım. Ama küçük bir not düşmem lazım: Sadece bin kere estağfurullah çekmek bile o günlerde çok iyi geldi. Her şey yolunda gitmediğinde bile tutunabileceğin küçük bir alışkanlığın olması büyük fark yaratıyor.

    Bugünün notu

    Şikâyet etmemek bir güç. Ama kendine kolaylık tanımamak bir erdem değil.

    Yarın görüşmek üzere. 4. gün de tamam, yarım ama dürüst. 🌱

  • Kod Kartı: Liste Üreteciyle Tek Satırda Filtre

    Kod Kartı: Liste Üreteciyle Tek Satırda Filtre

    Bir listeden şarta uyan elemanları seçip yeni bir liste yapmak için dört satır yazıyorduk: boş liste, for, if, append. Liste üreteci (list comprehension) aynı işi tek satırda yapıyor.

    İtiraf edeyim, Python öğrenirken bana en zor gelen konulardan biri buydu. İlk gördüğümde satırın nereden başlayıp nerede bittiğini çözemiyordum. Aşağıdaki okuma yöntemini öğrenince her şey yerine oturdu.

    Kod

    notlar = [70, 85, 40, 90, 45]
    # Dört satırlık hali
    gecenler = []
    for n in notlar:
    if n >= 50:
    gecenler.append(n)
    # Tek satırlık hali
    gecenler = [n for n in notlar if n >= 50]
    print(gecenler) # [70, 85, 90]

    Bu satır nasıl okunur?

    [n for n in notlar if n >= 50] satırını soldan sağa şöyle oku: “Listeye n‘yi koy, notlar içindeki her n için, eğer n 50 veya üstüyse.” Yani dört satırlık kodun parçaları aynı, sadece yerleri değişmiş: listeye eklenecek şey en başa, for ortaya, if sona geliyor. Köşeli parantezler de “sonuç bir liste” demek.

    Filtrelemenin yanında dönüştürme

    Baştaki kısımda sadece n yazmak zorunda değilsin; her elemanı değiştirebilirsin:

    print([n + 5 for n in notlar])
    # [75, 90, 45, 95, 50] herkese 5 puan
    print([n + 5 for n in notlar if n < 50])
    # [45, 50] sadece kalanlara 5 puan, sadece onları listele
    isimler = ["ayşe", "mert", "zeynep"]
    print([i.capitalize() for i in isimler])
    # ['Ayşe', 'Mert', 'Zeynep']

    _ ne demek?

    Matrix yağmuru yazısındaki şu satırı hatırla:

    damlalar = [random.randint(-yukseklik, 0) for _ in range(genislik)]

    Burada döngü değişkenini hiç kullanmıyoruz; sadece genislik kadar rastgele sayı üretmek istiyoruz. Python’da kullanılmayan değişkene genelde _ adı verilir. Bu, okuyana “bu değere ihtiyacım yok, sadece tekrar sayısı önemli” der.

    Dikkat

    Liste üreteci kısa ve okunaklı olduğunda güzel. Ama içine çok şey sıkıştırırsan okunmaz hale gelir:

    # Okuması zor
    [n * 2 if n > 60 else n for n in notlar if n % 5 == 0 and n != 45]

    Bir satırı okumak için birkaç kez durman gerekiyorsa dört satırlık for döngüsüne geri dön. Kodu kısa yazmak değil, anlaşılır yazmak amaç.

    Listeleri Python Dersi 7’de, for ve if‘i Python Dersi 5 ve 6’da anlattım.

  • Açık Kaynak Nedir?

    Açık Kaynak Nedir?

    Python derslerinde kullandığımız Python’un kendisi, telefonların çoğunda çalışan Android’in temelindeki Linux, Firefox tarayıcısı… Hepsinin ortak bir özelliği var: Kodlarını herkes okuyabilir. Bunlara açık kaynak yazılım deniyor.

    Kısa tanım

    Açık kaynak, bir yazılımın kaynak kodunun herkese açık olması ve bir lisansla insanlara bu kodu kullanma, inceleme, değiştirme ve paylaşma izni verilmesi demek. Kaynak kod, bir programın insanların okuyabildiği, programlama diliyle yazılmış hali.

    Karşıtı kapalı kaynak (ya da mülk) yazılım: Programı kullanırsın ama kodunu göremez, değiştiremezsin.

    Bir benzetme: yemek tarifi

    Bir restoranda harika bir yemek yedin. Kapalı kaynak, o yemeği sadece restoranda yiyebilmek gibi: Tadına bakarsın ama tarifi sır. Açık kaynak ise tarifin kapıya asılması gibi: İstersen evde yaparsın, tuzunu azaltırsın, kendi versiyonunu arkadaşına verirsin. Biri tarifte bir hata bulursa herkes düzeltmesinden faydalanır.

    Kendin dene: Python’un içine bak

    Python açık kaynak olduğu için, kullandığın hazır fonksiyonların kodunu bilgisayarından okuyabilirsin. Mesela medyanı (ortanca değeri) hesaplayan fonksiyonun içine bakalım:

    import inspect
    import statistics
    print(inspect.getsource(statistics.median))

    Çıktının son kısmı şöyle:

        data = sorted(data)
        n = len(data)
        if n == 0:
            raise StatisticsError("no median for empty data")
        if n % 2 == 1:
            return data[n // 2]
        else:
            i = n // 2
            return (data[i - 1] + data[i]) / 2

    Tanıdık geldi mi? sorted ve len Python Dersi 7’den, if/else Python Dersi 5’ten. Python’u yazan geliştiriciler de bizim derslerde öğrendiğimiz araçlarla kod yazıyor. Açık kaynağın en güzel tarafı bu: “Bu nasıl çalışıyor?” diye merak ettiğinde cevabı kendin okuyabiliyorsun.

    Açık kaynak bedava mı demek?

    Çoğu zaman evet ama asıl mesele bu değil. Açık kaynak dünyasında sık kullanılan bir söz var: “Bedava bira gibi değil, özgür konuşma gibi özgür.” Yani önemli olan fiyat değil, kodla ne yapabileceğin. Ücretsiz olup kodu kapalı olan birçok uygulama var; bunlar açık kaynak değil.

    Açık kaynak kod kullanan şirketler de para kazanabilir: destek hizmeti satarak, bulutta barındırarak ya da açık kaynak bir projenin üstüne kendi ürününü kurarak.

    Lisanslar: “Şu şartlarla kullanabilirsin”

    Kodun herkese görünür olması tek başına yetmez; neye izin verildiğini lisans belirler. En sık karşılaşacağın üç lisans:

    LisansKısaca
    MITÇok serbest. Kodu istediğin gibi kullan, sadece lisans metnini ve telif notunu koru.
    Apache 2.0MIT’e benzer serbestlik, ek olarak patent haklarıyla ilgili maddeler içerir.
    GPLKodu değiştirip dağıtırsan, senin sürümün de aynı şekilde açık kaynak olmak zorunda.

    GitHub’da bir projenin lisansını görmek için depodaki LICENSE dosyasına bakman yeterli. Lisansı olmayan bir kod, herkese açık görünse bile hukuken açık kaynak sayılmaz; sahibi izin vermedikçe kullanım hakları belirsiz kalır.

    Neden önemli?

    • Öğrenmek için: Gerçek projelerin kodunu okumak, ders kitabından sonra gelen en iyi okul.
    • Güven için: Kod herkese açık olduğu için başkaları da inceleyip hataları ve güvenlik açıklarını bulabiliyor.
    • Hız için: Herkes tekerleği yeniden icat etmiyor. Veri biliminde kullandığımız pandas, NumPy, scikit-learn gibi kütüphanelerin hepsi açık kaynak.
    • Kariyer için: Açık kaynak bir projeye yaptığın katkılar herkese açık bir portfolyo gibi çalışır.

    Nasıl katkı verilir?

    Açık kaynak projeye katkı vermek için usta bir yazılımcı olman gerekmiyor. Başlamak için birkaç kolay yol:

    • Kullandığın bir projede hata bulursan, projenin GitHub sayfasında “issue” açarak bildir.
    • Belgelerdeki yazım hatalarını düzelt ya da eksik bir örneği ekle.
    • Belgelerin Türkçe çevirisine yardım et.
    • GitHub’da “good first issue” etiketli işlere bak; bunlar yeni başlayanlar için ayrılmış küçük görevler.

    Bir cümlede

    Açık kaynak, bir yazılımın tarifini herkese açmak demek: Herkes okuyabilir, değiştirebilir, paylaşabilir; kuralları da lisans belirler.

  • Matrix Yağmurunu Terminalde Kodlamak

    Matrix Yağmurunu Terminalde Kodlamak

    Siyah ekran, yukarıdan aşağıya akan yeşil karakterler, her sütunun başında parlayan bir harf. 1999’da vizyona giren The Matrix’in bu “dijital yağmur” sahnesi, bilgisayar dünyasının en tanınan görüntülerinden biri oldu. Bu yazıda aynı efekti 50 satırlık bir Python koduyla kendi terminalinde yaratıyoruz. Hiçbir kütüphane kurmadan, sadece Python’un kendi araçlarıyla.

    Kodlar hazır bir not defterinde: Colab’da Aç. Not defterinde Colab’da çalışan bir sürüm de var.

    Efekt aslında nasıl çalışıyor?

    Görüntü karmaşık ama arkasındaki fikir basit. Ekranı sütunlara böl ve her sütunda bir “damla” düşün:

    1. Her sütunun bir damlası var ve damlanın başı belirli bir satırda duruyor.
    2. Her karede damla bir satır aşağı iniyor. Yeni yerine parlak beyaz rastgele bir karakter yazılıyor; bir önceki yer yeşile dönüyor.
    3. Damlanın belirli bir uzunlukta kuyruğu var. Kuyruğun ucundaki karakter silinerek boşluk bırakılıyor.
    4. Damla ekranın altından çıkınca, rastgele bir yükseklikten yeniden başlıyor.

    Bütün sütunlar aynı kuralı izliyor; farklı yüksekliklerden başladıkları için de yağmur rastgele ve canlı görünüyor. Yani ekranda gördüğün “sihir”, Python Dersi 6’daki döngüler ve Python Dersi 7’deki listelerle yapılan küçük bir simülasyon.

    Terminale renk ve konum söylemek: ANSI kaçış kodları

    Normalde print yazıyı imlecin olduğu yere, sırayla yazar. Biz ise ekranın istediğimiz noktasına, istediğimiz renkte yazmak istiyoruz. Bunun için terminallerin anladığı özel komutlar var: ANSI kaçış kodları.

    Hepsi \033[ ile başlar (çoğu yerde “ESC [” diye yazılır). Terminal bunları ekrana yazmaz, komut olarak uygular:

    KodNe yapar?
    \033[32mYazı rengini yeşil yapar
    \033[97mYazı rengini parlak beyaz yapar
    \033[0mRenkleri sıfırlar
    \033[2JEkranı temizler
    \033[5;10Hİmleci 5. satır, 10. sütuna götürür
    \033[?25l / \033[?25hİmleci gizler / gösterir

    Kendin denemek için terminalde şunu çalıştır:

    print("\033[32mBu yazı yeşil\033[0m, bu yazı normal.")

    Kod

    import os
    import random
    import sys
    import time
    KARAKTERLER = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモ0123456789"
    YESIL = "\033[32m" # yazı rengi: yeşil
    BEYAZ = "\033[97m" # yazı rengi: parlak beyaz
    SIFIRLA = "\033[0m" # renkleri sıfırla
    TEMIZLE = "\033[2J" # ekranı temizle
    IMLEC_GIZLE = "\033[?25l"
    IMLEC_GOSTER = "\033[?25h"
    def yaz(satir, sutun, metin):
    """İmleci (satir, sutun) konumuna götürüp metni oraya yazar."""
    sys.stdout.write(f"\033[{satir};{sutun}H{metin}")
    def yagmur(hiz=0.05, kuyruk=12):
    genislik, yukseklik = os.get_terminal_size()
    yukseklik -= 1 # en alt satıra yazıp ekranı kaydırmayalım
    damlalar = [random.randint(-yukseklik, 0) for _ in range(genislik)]
    sys.stdout.write(TEMIZLE + IMLEC_GIZLE)
    try:
    while True:
    for x in range(genislik):
    y = damlalar[x] # bu sütundaki damlanın başı
    if 1 <= y <= yukseklik:
    yaz(y, x + 1, BEYAZ + random.choice(KARAKTERLER))
    if 1 <= y - 1 <= yukseklik:
    yaz(y - 1, x + 1, YESIL + random.choice(KARAKTERLER))
    if 1 <= y - kuyruk <= yukseklik:
    yaz(y - kuyruk, x + 1, " ") # kuyruğun ucunu sil
    damlalar[x] += 1
    if y - kuyruk > yukseklik: # damla ekranın altından çıktı
    damlalar[x] = random.randint(-yukseklik, 0)
    sys.stdout.flush()
    time.sleep(hiz)
    except KeyboardInterrupt: # Ctrl+C ile çıkış
    pass
    finally:
    sys.stdout.write(SIFIRLA + IMLEC_GOSTER + TEMIZLE + "\033[H")
    if __name__ == "__main__":
    yagmur()

    Kod adım adım

    Karakterler. Filmdeki yağmur, Japon katakana alfabesine benzeyen karakterler ve rakamlardan oluşuyor. Biz de KARAKTERLER metnine yarım genişlikteki katakana harflerini ve rakamları koyduk. “Yarım genişlik” önemli: bu harfler terminalde tam bir sütun kaplar, böylece sütunlar kaymaz. random.choice(KARAKTERLER) her seferinde bu metinden rastgele bir karakter seçiyor.

    Ekran boyutu. os.get_terminal_size() terminal penceresinin kaç sütun genişliğinde ve kaç satır yüksekliğinde olduğunu verir. Yağmur pencereni büyütürsen daha geniş yağar.

    Damlalar listesi. damlalar her sütun için tek bir sayı tutan bir liste: o sütundaki damlanın başı hangi satırda? Başlangıçta hepsi ekranın üstünde, eksi sayılarda; böylece her damla farklı zamanda ekrana girer. Bu tek satırlık liste kurma yazımını (liste üreteci) yarınki kod kartında ayrıntılı anlatacağım.

    Ana döngü. while True sonsuza kadar döner. Her turda tüm sütunlar gezilir ve her sütun için üç iş yapılır: başa beyaz karakter, bir üstüne yeşil karakter, kuyruğun ucuna boşluk. if 1 <= y <= yukseklik kontrolleri, ekranın dışına yazmaya kalkışmamak için.

    Her seferinde tüm ekranı çizmiyoruz. Sadece değişen üç hücreyi güncelliyoruz. Bu yüzden kod geniş bir pencerede bile akıcı çalışıyor. sys.stdout.write ise print gibi, ama sona otomatik satır atlama eklemiyor; flush() da biriken yazıları tek seferde ekrana gönderiyor.

    Temiz çıkış. Ctrl+C’ye basınca Python KeyboardInterrupt hatası fırlatır. try / except bu hatayı yakalıyor, finally bloğu da ne olursa olsun çalışıp renkleri sıfırlıyor, imleci geri getiriyor ve ekranı temizliyor. Bunu yapmasaydık, programdan çıktıktan sonra terminal yeşil ve imleçsiz kalırdı. Hata yönetimini ileride Python Dersi 13’te ayrıntılı göreceğiz.

    Çalıştırmak

    1. Kodu kopyala ve matrix.py adıyla kaydet.
    2. Terminali aç, dosyanın olduğu klasöre git ve python matrix.py yaz (bazı sistemlerde python3 matrix.py).
    3. Yağmuru durdurmak için Ctrl+C.

    Mac ve Linux terminallerinde, Windows’ta da Windows Terminal’de çalışır. Eski Windows komut isteminde (cmd) renkler görünmeyebilir; o zaman Windows Terminal’i dene.

    Colab’da çalıştırmak

    Colab’ın çıktı alanı gerçek bir terminal değil; renkleri gösterir ama imleci istediğimiz yere götüremez. Bu yüzden not defterinde farklı bir yöntem kullandım: Ekranı iç içe bir liste olarak tutuyoruz (her satır bir liste, ekran da satırların listesi) ve her karede ekranı silip baştan yazdırıyoruz:

    izgara = [[" "] * genislik for _ in range(yukseklik)]
    izgara[y][x] = random.choice(KARAKTERLER) # y. satırın x. hücresi

    Sonuç terminaldeki kadar akıcı olmasa da aynı fikir. İki yöntemi karşılaştırmak da bir ders: Aynı görüntüyü “sadece değişeni güncelle” ya da “her şeyi baştan çiz” diye iki farklı algoritmayla üretebiliyoruz.

    Kendin dene

    • yagmur(hiz=0.1) ile yavaş, yagmur(hiz=0.02) ile hızlı bir yağmur.
    • kuyruk=25 ile uzun kuyruklu damlalar.
    • KARAKTERLER metnine kendi adının harflerini ekle.
    • Yeşil yerine mavi bir yağmur için YESIL = "\033[34m".
    • Zor olan: Ekranın ortasında sabit duran bir yazı göster, yağmur onun etrafından aksın.

    Son söz

    Matrix’i ilk izlediğimde lisedeydim. O akan yeşil ekrana hayran kalmıştım. Belki de bilgisayar mühendisliği bana ilk o zaman bu kadar havalı gelmişti. Yıllar sonra aynı yağmuru kendi yazdığım birkaç satır kodla kendi terminalimde görmek ise bambaşka bir duyguydu: O zaman ekranın arkasında bir sihir olduğunu düşünüyordum, şimdi o sihrin döngülerden ve listelerden oluştuğunu biliyorum.

    Bir de tavsiye: Hem görsel olarak hem de sorduğu sorularla çok güzel, felsefi bir film serisi. İzlemediysen mutlaka izle; izlediysen bu yazıdan sonra bir kez daha izlemek isteyebilirsin.

  • Sözlükler ve Demetler (Python Dersi 8)

    Sözlükler ve Demetler (Python Dersi 8)

    Geçen derste notları bir listede topladık: [85, 70, 92]. Peki 92 kimin notu? Listede notlar duruyor ama sahipleri yok. İsimleri ayrı bir listede tutup sıraların karışmamasını umabilirsin, ama daha iyi bir yolu var: her değeri bir isimle eşleştiren sözlük. Bu derste sözlüklerin yanında, değiştirilemeyen küçük kutular olan demetleri de öğreniyoruz.

    Bu dersin kodları ve alıştırmaları hazır bir not defterinde: Colab’da Aç.

    Sözlük ne demek?

    Adı üstünde: gerçek bir sözlükte bir kelimeyi bulursun, karşısında anlamı yazar. Python sözlüğü de böyle çalışır: bir anahtar (key) ve ona bağlı bir değer (value).

    ogrenci = {"ad": "Ayşe", "yas": 21, "bolum": "Bilgisayar"}

    Sözlük süslü parantezle { } kurulur. Her eleman anahtar: değer çiftidir ve çiftler virgülle ayrılır. Listede elemana sıra numarasıyla ulaşıyorduk; sözlükte anahtarın kendisiyle ulaşıyoruz.

    Değere ulaşmak

    print(ogrenci["ad"]) # Ayşe

    Olmayan bir anahtarı istersen hata alırsın:

    print(ogrenci["sehir"]) # KeyError: 'sehir'

    Anahtarın olup olmadığından emin değilsen get kullan. Anahtar yoksa hata yerine None ya da senin verdiğin varsayılan değeri döndürür:

    print(ogrenci.get("sehir")) # None
    print(ogrenci.get("sehir", "bilinmiyor")) # bilinmiyor

    Eklemek, değiştirmek, silmek

    Sözlükte ekleme ile değiştirme aynı yazılır. Anahtar yoksa eklenir, varsa değeri güncellenir:

    ogrenci["sehir"] = "Adana" # yeni anahtar: eklendi
    ogrenci["yas"] = 22 # var olan anahtar: güncellendi
    print(ogrenci)
    # {'ad': 'Ayşe', 'yas': 22, 'bolum': 'Bilgisayar', 'sehir': 'Adana'}
    del ogrenci["bolum"] # sil
    print(ogrenci)
    # {'ad': 'Ayşe', 'yas': 22, 'sehir': 'Adana'}

    in sözlükte anahtarlara bakar, değerlere değil:

    print("ad" in ogrenci) # True
    print("Ayşe" in ogrenci) # False, çünkü "Ayşe" bir anahtar değil

    Sözlüğü döngüyle gezmek

    notlar = {"Ayşe": 85, "Mert": 45, "Zeynep": 92}
    for isim in notlar:
    print(isim)
    # Ayşe
    # Mert
    # Zeynep

    Sözlüğü doğrudan gezersen sadece anahtarları alırsın. Anahtar ve değeri birlikte istiyorsan items() kullan:

    for isim, puan in notlar.items():
    print(f"{isim}: {puan}")
    # Ayşe: 85
    # Mert: 45
    # Zeynep: 92

    for isim, puan in ... yazımı, zip ve enumerate kod kartlarındaki gibi her çifti iki değişkene dağıtır. Sadece anahtarlar ya da sadece değerler lazımsa keys() ve values() var:

    print(list(notlar.keys())) # ['Ayşe', 'Mert', 'Zeynep']
    print(list(notlar.values())) # [85, 45, 92]
    print(sum(notlar.values())) # 222

    Klasik bir sözlük işi: kelime saymak

    Bir metinde her kelimenin kaç kez geçtiğini bulmak, sözlüklerin en bilinen kullanımlarından biri:

    metin = "bir elma bir armut bir muz"
    sayac = {}
    for kelime in metin.split():
    sayac[kelime] = sayac.get(kelime, 0) + 1
    print(sayac)
    # {'bir': 3, 'elma': 1, 'armut': 1, 'muz': 1}

    metin.split() metni boşluklardan bölüp kelime listesi yapar. Asıl sihir sayac.get(kelime, 0) + 1 satırında: Kelime sözlükte yoksa 0’dan başlar, varsa mevcut sayıya 1 eklenir. Geçen dersteki “kumbara” mantığının sözlüktekini düşün: her kelimenin kendi kumbarası var.

    Demetler: değişmeyen listeler

    Demet (tuple), listeye benzer ama bir kez kurulduktan sonra değiştirilemez. Köşeli parantez yerine normal parantezle yazılır:

    konum = (36.99, 35.33) # enlem, boylam
    print(konum[0]) # 36.99
    konum[0] = 1 # TypeError: 'tuple' object does not support item assignment

    Neden değişmeyen bir şey isteyelim? Çünkü bazı veriler zaten değişmemeli: bir şehrin koordinatları, bir rengin RGB değerleri, bir tarihin yıl-ay-günü. Demet kullanmak hem okuyana “bu sabit” mesajı verir hem de kazara değişmesini engeller.

    Demetleri aslında daha önce de kullandın. Takas kod kartındaki a, b = b, a yazımı ve enumerate’in verdiği (0, "Kalem") çiftleri birer demet. Paket açma burada da çalışır:

    enlem, boylam = konum
    print(enlem, boylam) # 36.99 35.33

    Bir demet sözlükte anahtar da olabilir; liste olamaz. İki şehir arası mesafeyi tutmak için:

    mesafeler = {("Adana", "Mersin"): 70}
    print(mesafeler[("Adana", "Mersin")]) # 70

    Mini program: sınıf defteri

    Geçen dersin not programını büyütelim. Bu sefer her notu sahibinin adıyla saklayacağız:

    sinif = {}
    while True:
    isim = input("Öğrenci adı (bitirmek için 'bitti'): ")
    if isim == "bitti":
    break
    puan = float(input(f"{isim} notu: "))
    sinif[isim] = puan
    print()
    for isim, puan in sinif.items():
    if puan >= 50:
    print(f"{isim}: {puan} (Geçti)")
    else:
    print(f"{isim}: {puan} (Kaldı)")
    en_iyi = max(sinif, key=sinif.get)
    print(f"Sınıf birincisi: {en_iyi} ({sinif[en_iyi]})")
    print(f"Sınıf ortalaması: {sum(sinif.values()) / len(sinif):.1f}")

    Örnek çalışma:

    Öğrenci adı (bitirmek için 'bitti'): Ayşe
    Ayşe notu: 85
    Öğrenci adı (bitirmek için 'bitti'): Mert
    Mert notu: 45
    Öğrenci adı (bitirmek için 'bitti'): Zeynep
    Zeynep notu: 92
    Öğrenci adı (bitirmek için 'bitti'): bitti
    Ayşe: 85.0 (Geçti)
    Mert: 45.0 (Kaldı)
    Zeynep: 92.0 (Geçti)
    Sınıf birincisi: Zeynep (92.0)
    Sınıf ortalaması: 74.0

    Yeni olan tek satır max(sinif, key=sinif.get). max(sinif) tek başına anahtarları alfabetik olarak karşılaştırırdı ve “Zeynep”i alfabede en sonda olduğu için seçerdi. key=sinif.get ise “karşılaştırırken her ismin notuna bak” demek. Sonuç yine Zeynep ama doğru sebepten.

    Sık karşılaşılan hatalar

    Olmayan anahtarı köşeli parantezle istemek. ogrenci["sehir"] anahtar yoksa KeyError verir. Emin değilsen ogrenci.get("sehir") kullan.

    in‘in değerlere baktığını sanmak. "Ayşe" in ogrenci False döner, çünkü “Ayşe” bir değer. Değerlerde aramak için "Ayşe" in ogrenci.values() yaz.

    Tek elemanlı demeti virgülsüz yazmak. (5) bir demet değil, sadece parantez içinde 5 sayısı. Tek elemanlı demet için virgül gerekir: (5,).

    Aynı anahtarı iki kez yazmak. {"a": 1, "a": 2} hata vermez ama sonuncusu kazanır ve sözlükte tek "a": 2 kalır. Bir sözlükte her anahtar benzersizdir.

    Bu derste öğrendiklerin

    • Sözlük {anahtar: değer} çiftlerinden oluşur; değere anahtarla ulaşılır.
    • get(anahtar, varsayılan) anahtar yoksa hata yerine varsayılanı verir.
    • sözlük[anahtar] = değer hem ekler hem günceller; del siler.
    • items() anahtar-değer çiftlerini, keys() ve values() ayrı ayrı verir.
    • Demet ( ) ile kurulur ve değiştirilemez; sabit kalması gereken veriler için kullanılır.

    Alıştırmalar

    1. meyveler = {"elma": 30, "muz": 45} sözlüğüne "armut": 25 ekle, elmanın fiyatını 35 yap ve tüm fiyatların toplamını yazdır.
    2. Üç ülkeyi başkentiyle eşleştiren bir sözlük kur ve döngüyle “Türkiye → Ankara” biçiminde yazdır.
    3. renk = (255, 128, 0) demetini paket açmayla r, g, b değişkenlerine dağıt ve yazdır.
    4. "python python veri bilim veri python" cümlesinde her kelimenin kaç kez geçtiğini bul, sonra en sık geçen kelimeyi yazdır.

    Cevaplar

    1. meyveler["armut"] = 25, meyveler["elma"] = 35, print(sum(meyveler.values())) sonucu 105.
    2. baskentler = {"Türkiye": "Ankara", "Japonya": "Tokyo", "İspanya": "Madrid"}, sonra for ulke, sehir in baskentler.items(): print(f"{ulke} → {sehir}").
    3. r, g, b = renk, print(r, g, b) sonucu 255 128 0.
    4. Kelime sayacı kalıbıyla {'python': 3, 'veri': 2, 'bilim': 1} elde edilir; max(sayac, key=sayac.get) sonucu 'python'.

    Sıradaki ders

    Şimdiye kadar yazdığımız kodları hep baştan sona tek parça yazdık. Not ortalamasını üç farklı yerde hesaplaman gerekse aynı satırları üç kez mi yazacaksın? Bir sonraki derste fonksiyonları öğreneceğiz: kodu bir kez yazıp istediğin kadar kullanmak.