Küçük ama gerçek bir program
Bir program, birbiri ardına çalışan satırlardan oluşur. Bu derste üç temel yapı taşını öğreneceksin: ekrana yazmak (print), kodu açıklamak (yorum) ve dışarıdan veri almak (input). Sonunda da her programcının günlük ekmeği olan hata mesajını okumayı. Senaryo: Ilgaz Bank'ın şubesinde çalışan bir görevli, müşterinin adını ve hesaba yatırdığı tutarı alıp bir makbuz yazdıran küçük bir program istiyor.
print'i daha iyi tanımak
print birden fazla değeri virgülle alır, aralarına boşluk koyar ve sonunda satır atlar. İki küçük ayar bunu değiştirir: sep (separator, ayraç) değerlerin arasına, end ise satırın sonuna ne konacağını belirler.
print("Müşteri", "Ayşe Yılmaz")
print("Tarih", "2025", "03", "14", sep="/")
print("Tutar:", end=" ")
print(1500, "TL")
print("-" * 20)
Üçüncü satırda end=" " sayesinde satır sonu yerine boşluk konur; dördüncü print aynı satıra devam eder. Son satırdaki "-" * 20 ise bir metni 20 kez tekrarlar; makbuzlara çizgi çekmek için pratik bir yoldur.
print(), sadece satır atlar. Çıktıyı bölümlere ayırmak için kullanışlıdır.Yorumlar: kendine ve ekibine not
# işaretinden satır sonuna kadar olan her şey yorumdur (comment); Python onu görmezden gelir. Yorum, "ne" yaptığını değil "neden" yaptığını anlatmalı. Kod zaten ne yaptığını gösterir.
# Makbuz başlığı; şube yöneticisi bu biçimi istedi
print("ILGAZ BANK - MAKBUZ")
tutar = 1500 # TL cinsinden, kuruş yok
print("Yatırılan:", tutar)
# print("Bu satır çalışmaz, yorum hâline getirildi")
Son satırdaki gibi bir kod satırını geçici olarak kapatmaya "yoruma almak" denir; hata ararken çok kullanılır. Üç tırnaklı metinler ("""...""") ise çok satırlı açıklama için kullanılır; bunları fonksiyon derslerinde belge dizgisi (docstring) olarak tekrar göreceksin.
| Yorum türü | Yazım | Ne zaman |
|---|---|---|
| Satır yorumu | # açıklama | Kısa not, bir satırı kapatmak |
| Satır sonu yorumu | x = 5 # neden 5 | Tek bir değeri açıklamak |
| Belge dizgisi | """Açıklama""" | Fonksiyon ve modül başında |
input: kullanıcıdan veri almak
input, ekrana bir soru yazar, kullanıcı bir şey yazıp Enter'a basana kadar bekler ve yazılanı metin olarak döndürür. Bu "metin olarak" kısmı çok önemli: kullanıcı 1500 yazsa bile elinde "1500" diye bir metin olur, sayı değil.
ad = input("Müşteri adı: ")
tutar_metin = input("Yatırılan tutar: ")
tutar = int(tutar_metin) # metni tam sayıya çevir
print("Sayın", ad, "hesabınıza", tutar, "TL yatırıldı.")
print("Yeni bakiye tahmini:", tutar + 250)
Bu kutuda motor, input çağrılarına hazır örnek değerler verir; kendi bilgisayarında ise klavyeden girersin. int() metni tam sayıya, float() ondalıklı sayıya çevirir. Çevirmeyi unutursan tutar + 250 satırı hata verir çünkü metinle sayı toplanamaz.
"1500" + 250 yazmak TypeError üretir. Sayı olarak kullanacağın her girdiyi int() ya da float() ile çevir. Kullanıcı "abc" yazarsa çevirme de hata verir; bunu Hatalar dersinde yakalamayı öğreneceksin.Hata mesajı okumak
Her programcı her gün hata görür; fark, mesajı okuyabilmekte. Python hata verince bir traceback (izleme) basar. Şu kodu çalıştır ve mesaja bak:
print("Makbuz hazırlanıyor")
print("Toplam:", toplam)
Çıktının sonunda şuna benzer bir satır göreceksin: NameError: name 'toplam' is not defined. Okuma kuralı şöyle:
- En alt satıra bak: Hatanın türü ve açıklaması oradadır. NameError, "bu ada sahip bir şey tanımlı değil" demektir.
- Bir üstteki "line N" ifadesini bul: Hatanın hangi satırda çıktığını söyler.
- Hatadan önce ne basıldığına bak: "Makbuz hazırlanıyor" çıktıysa ilk satır çalışmış, sorun ikinci satırda.
En sık göreceğin üç tür: NameError (tanımsız ad, genelde yazım hatası), SyntaxError (eksik parantez ya da tırnak; Python daha kodu çalıştırmadan yakalar) ve TypeError (uyumsuz türler, örneğin metinle sayıyı toplamak).
input ile küçük bir hesap
Girdi almayı hesapla birleştirince program artık her çalıştırmada farklı sonuç üretebilir. Aşağıdaki örnekte Anadolu Market kasiyeri adet ve birim fiyatı giriyor; program toplamı ve KDV dahil tutarı yazıyor. Motor, bu kutuda input çağrılarına örnek değerler verecek.
adet = int(input("Adet: "))
birim = float(input("Birim fiyat: "))
ara_toplam = adet * birim
print("Ara toplam:", ara_toplam)
print("KDV dahil:", ara_toplam * 1.2)
İki dönüşüme dikkat et: adet tam sayı olduğundan int, fiyat ondalıklı olabileceğinden float. Yanlış seçersen ya hata alırsın ("3.5" int olmaz) ya da gereksiz ondalık görürsün. Girdiyi hangi türe çevireceğine, o değeri ne için kullanacağına bakarak karar ver.
Hepsini birleştirelim
# Ilgaz Bank şube makbuzu
print("=" * 28)
print("ILGAZ BANK - MAKBUZ")
print("=" * 28)
musteri = "Mehmet Kaya"
tutar = 2750
komisyon = 5
print("Müşteri :", musteri)
print("İşlem : Para yatırma")
print("Tutar :", tutar, "TL")
print("Komisyon:", komisyon, "TL")
print("Net :", tutar - komisyon, "TL")
print("=" * 28)
Dikkat et: değişken adları (musteri, tutar) tırnaksız, etiketler tırnaklı. Değişkenleri ayrı bir derste derinlemesine ele alacağız.
print'in tam imzası
Şimdiye kadar sep ve end ayarlarını gördün. print'in resmî tanımı şöyledir:
print(*degerler, sep=" ", end="\n", file=sys.stdout, flush=False)
*degerler: istediğin kadar değer; her biristr()ile metne çevrilir. Bu yüzdenprint("Adet:", 3)hata vermez ama"Adet: " + 3verir.sepveend: aradaki ve sondaki metin.file: çıktının nereye gideceği. Varsayılan ekran (standart çıktı, stdout);sys.stderrverirsen hata kanalına yazar.flush: çıktıyı beklemeden hemen gönderir. Uzun süren bir işte ilerleme mesajlarının gecikmeden görünmesi için kullanılır.
Bir de az bilinen bir ayrıntı: print ekrana yazar ama hiçbir şey döndürmez; dönüş değeri None'dır. "Ekrana yazmak" ile "değer üretmek" farklı şeylerdir ve fonksiyonlar dersinde bu ayrım çok önemli olacak.
import sys
sonuc = print("Rapor hazırlanıyor...")
print("print'in döndürdüğü:", sonuc)
print("Uyarı: 3 üründe stok kritik", file=sys.stderr)
print("Adım 1/3", end=" | ", flush=True)
print("Adım 2/3", end=" | ")
print("Adım 3/3")Hata kanalına yazılan satır bu uygulamada farklı renkte görünebilir. Terminalde ise python rapor.py > rapor.txt yazdığında stdout dosyaya gider, stderr ekranda kalır; böylece uyarılar rapor dosyasını kirletmez. Standart akışları Terminal temelleri dersinde ayrıntılı gördün ya da göreceksin.
Kaçış dizileri ve çok satırlı metin
Bir metnin içine Enter tuşuna basamazsın; bunun yerine ters eğik çizgiyle başlayan kaçış dizileri (escape sequence) kullanırsın:
| Yazım | Anlamı | Örnek çıktı |
|---|---|---|
\n | Yeni satır | Metni iki satıra böler |
\t | Sekme (tab) | Sütunları hizalar |
\\ | Tek ters eğik çizgi | C:\raporlar |
\" ve \' | Metnin içinde tırnak | "Kahve" dedi |
r"..." | Ham metin: kaçışlar işlenmez | r"C:\yeni" olduğu gibi kalır |
"""...""" | Çok satırlı metin | Satır sonları korunur |
print("Ürün\tAdet\tTutar")
print("Kahve\t2\t900")
print("Çay\t5\t250")
print("Satır 1\nSatır 2")
print("Klasör: C:\\raporlar\\mart")
print(r"Ham: C:\raporlar\nisan")
print("Müşteri \"Kahve Makinesi\" ürününü iade etti.")"C:\raporlar\nisan" yazarsan \n bir satır sonuna, \r da satır başı karakterine dönüşür ve yol bozulur. Windows yollarını ya r"..." ham metinle ya da düz eğik çizgiyle ("C:/raporlar/nisan") yaz; Python ikisini de anlar.Üç tırnaklı metin, makbuz ya da e-posta şablonu gibi uzun metinler için rahattır:
fis = """ILGAZ BANK
Şube: Konak
İşlem: Para yatırma
Tutar: 2750 TL"""
print(fis)
print("Satır sayısı:", fis.count("\n") + 1)Bir programın iskeleti
Gerçek bir betik rastgele satırlardan değil, belli bir düzenden oluşur. Bu düzeni şimdiden alışkanlık edinirsen kodun büyüdüğünde kaybolmazsın:
- Belge dizgisi (docstring): Dosyanın en üstünde, betiğin ne yaptığını anlatan üç tırnaklı metin.
- İçe aktarmalar:
import sysgibi satırlar, hepsi en üstte. - Sabitler:
KDV_ORANI = 0.20gibi değişmeyecek değerler. - Ana akış: Girdi al → hesapla → çıktı ver.
"""Ilgaz Bank şube makbuzu: tutar ve komisyondan net tutarı yazar."""
import sys
KOMISYON = 5 # TL, şube yönetmeliği gereği sabit
SUBE = "Konak"
def main():
tutar = 2750
net = tutar - KOMISYON
print(f"Şube: {SUBE}")
print(f"Tutar: {tutar} TL, Net: {net} TL")
if __name__ == "__main__":
main()Son iki satır şimdilik bir kalıp olarak kalsın: "bu dosya doğrudan çalıştırıldıysa main()'i çağır" demektir. Fonksiyonları ve modülleri öğrendiğinde neden bu kadar yaygın olduğunu tam anlayacaksın.
Hata türleri: belirti → neden → çözüm
| Hata | Tipik neden | Çözüm |
|---|---|---|
SyntaxError | Kapanmamış parantez/tırnak, eksik virgül | Python 3.10+ mesajı yeri gösterir: '(' was never closed |
IndentationError | Gereksiz ya da tutarsız girinti, sekme/boşluk karışımı | Hep 4 boşluk kullan; editörün girintiyi göstermesini aç |
NameError | Yazım hatası, tanımlamadan kullanma | Mesajdaki Did you mean önerisine bak |
TypeError | Uyumsuz türler: metin + sayı | int(), str() ile çevir ya da virgüllü print |
ValueError | Tür doğru, değer uygun değil: int("abc") | Girdiyi doğrula (Girdi ve dönüşüm dersi) |
ZeroDivisionError | Sıfıra bölme | Böleni önce kontrol et |
Python hata verdiğinde basılan traceback, çağrı zincirini yukarıdan aşağı listeler. Aşağıdaki örnekte hata bir fonksiyonun içinde çıkıyor:
Traceback (most recent call last):
File "makbuz.py", line 9, in <module>
main()
File "makbuz.py", line 6, in main
print("Net:", tutar - komisyn)
^^^^^^^
NameError: name 'komisyn' is not defined. Did you mean: 'komisyon'?Okuma sırası: en alttan başla (hatanın türü ve önerisi), sonra hemen üstündeki dosya-satır bilgisine bak (hata 6. satırda, main içinde), en üstteki satırlar ise oraya nasıl gelindiğini gösterir. ^^^^ işaretleri sorunlu ifadenin altını çizer.
"was never closed" gibi) daha isabetli sonuç verir; şirket kodunu ya da müşteri verisini asla dış bir siteye yapıştırma.logging modülüne bırakır: her mesajın zamanı, seviyesi (INFO, WARNING, ERROR) olur ve dosyaya yazılır. Ama ilk taslakta, hızlı hata ayıklamada (debugging) ve küçük araçlarda print hâlâ herkesin ilk aracıdır. İyi bir alışkanlık: kullanıcıya gösterilecek sonucu stdout'a, uyarı ve hataları file=sys.stderr ile hata kanalına yaz; gece çalışan işlerde ilerleme mesajlarına flush=True ekle ki log dosyası anında güncellensin.Gerçek programlarda input nerede?
Şaşırtıcı gelebilir ama iş yazılımlarında input nadiren kullanılır. Veri klavyeden değil dosyadan, veritabanından, bir web formundan ya da komut satırı argümanlarından gelir. input, öğrenirken ve küçük araçlar yazarken işe yarar; "girdi metin gelir, sen çevirirsin" kuralı ise her kaynak için geçerlidir. CSV'den okuduğun tutar da metindir, web formundan gelen yaş da.
Çıktıyı dosyaya yönlendirmek
Terminalde python makbuz.py > makbuz.txt yazarsan print çıktıları ekrana değil dosyaya gider. Bu, hiçbir kod değişikliği gerektirmeyen en basit rapor üretme yoludur ve sunucularda çok kullanılır. print'in kendisi de file= parametresiyle doğrudan bir dosyaya yazabilir; Dosya İşlemleri dersinde göreceksin.
Yorum kültürü
Kurumsal kodda yorum az ama yerinde olur. İyi yorum, bir iş kuralını açıklar: "Komisyon, şube yönetmeliği gereği 5 TL sabit." Kötü yorum, kodu tekrar eder: "tutardan 5 çıkar." Kodun kendisi anlaşılır değilse çözüm yorum eklemek değil, değişken adlarını düzeltmektir.