Ana içeriğe geç
Kesit Python
Temel · Başlangıç

İlk program: print, yorum, input

print ile biçimli çıktı üretir, koda yorum eklersin, input ile kullanıcıdan veri alır ve ilk hata mesajını okumayı öğrenirsin.

Uygulamada aç, 19 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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.

Boş satırParantezi boş bırakırsan, 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ımNe zaman
Satır yorumu# açıklamaKısa not, bir satırı kapatmak
Satır sonu yorumux = 5 # neden 5Tek 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.

input her zaman metin döndürür"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:

  1. 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.
  2. Bir üstteki "line N" ifadesini bul: Hatanın hangi satırda çıktığını söyler.
  3. 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).

Hata, başarısızlık değildirHata mesajı, Python'ın sana verdiği en dürüst geri bildirimdir. Mesajı okuma alışkanlığı, kod yazmaktan daha değerli bir beceridir; deneyimli geliştiriciyi ayıran şey hata görmemesi değil, mesajı iki saniyede çözmesidir.

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.

Derinleş

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 biri str() ile metne çevrilir. Bu yüzden print("Adet:", 3) hata vermez ama "Adet: " + 3 verir.
  • sep ve end: aradaki ve sondaki metin.
  • file: çıktının nereye gideceği. Varsayılan ekran (standart çıktı, stdout); sys.stderr verirsen 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ımAnlamıÖrnek çıktı
\nYeni satırMetni iki satıra böler
\tSekme (tab)Sütunları hizalar
\\Tek ters eğik çizgiC:\raporlar
\" ve \'Metnin içinde tırnak"Kahve" dedi
r"..."Ham metin: kaçışlar işlenmezr"C:\yeni" olduğu gibi kalır
"""..."""Çok satırlı metinSatı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.")
Windows yolunda gizli kaçış"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:

  1. Belge dizgisi (docstring): Dosyanın en üstünde, betiğin ne yaptığını anlatan üç tırnaklı metin.
  2. İçe aktarmalar: import sys gibi satırlar, hepsi en üstte.
  3. Sabitler: KDV_ORANI = 0.20 gibi değişmeyecek değerler.
  4. 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

HataTipik nedenÇözüm
SyntaxErrorKapanmamış parantez/tırnak, eksik virgülPython 3.10+ mesajı yeri gösterir: '(' was never closed
IndentationErrorGereksiz ya da tutarsız girinti, sekme/boşluk karışımıHep 4 boşluk kullan; editörün girintiyi göstermesini aç
NameErrorYazım hatası, tanımlamadan kullanmaMesajdaki Did you mean önerisine bak
TypeErrorUyumsuz türler: metin + sayıint(), str() ile çevir ya da virgüllü print
ValueErrorTür doğru, değer uygun değil: int("abc")Girdiyi doğrula (Girdi ve dönüşüm dersi)
ZeroDivisionErrorSıfıra bölmeBö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.

Hata mesajını aramadan önceSon satırı olduğu gibi kopyalayıp aramak işe yarar, ama önce kendin oku. Değişken adlarını ve dosya yollarını içeren kısmı çıkarıp yalnız hata kalıbını aramak ("was never closed" gibi) daha isabetli sonuç verir; şirket kodunu ya da müşteri verisini asla dış bir siteye yapıştırma.
Gerçek işteKurumsal betiklerde print yerini yavaş yavaş 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.
Uzmanlaş

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.

Alıştırmalara geç (19)