Ana içeriğe geç
Kesit Python
Temel · Değerler ve metinler

Değişkenler ve veri türleri

int, float, str, bool ve None türlerini tanır; type() ile türü sorgular, dönüşüm yapar ve doğru adlandırma kurallarıyla değişken tanımlarsın.

Uygulamada aç, 20 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ç.

Değişken: değere takılan etiket

Anadolu Market'in sipariş sisteminde bir siparişin tutarı, müşterinin adı, kargonun teslim edilip edilmediği gibi bilgileri saklamak gerekir. Python'da bu bilgiler değişkenlerde (variable) tutulur. Değişken, bir değere taktığın etikettir: tutar = 1500 dediğinde Python bellekte 1500 değerini oluşturur ve ona tutar etiketini yapıştırır.

tutar = 1500
musteri = "Ayşe Yılmaz"
print(musteri, "için tutar:", tutar)
tutar = tutar + 250      # etiketi yeni değere taşı
print("Güncel tutar:", tutar)

Eşittir işareti matematikteki "eşittir" değil, atama (assignment) işlemidir: sağdaki hesaplanır, soldaki ada bağlanır. Bu yüzden tutar = tutar + 250 gayet mantıklıdır: önce sağdaki toplanır (1750), sonra etiket oraya taşınır. Aynı satırda birden fazla değişkene atama da yapabilirsin: ad, yas = "Ali", 30.

Beş temel tür

Her değerin bir türü (type) vardır ve tür, o değerle ne yapılabileceğini belirler. type() fonksiyonu türü söyler:

siparis_no = 10452            # int: tam sayı
tutar = 1499.90               # float: ondalıklı sayı
sehir = "İzmir"               # str: metin
teslim_edildi = False         # bool: True ya da False
iade_tarihi = None            # None: henüz değer yok
print(type(siparis_no), type(tutar))
print(type(sehir), type(teslim_edildi), type(iade_tarihi))
TürAdıÖrnekNe için
inttam sayı (integer)42, -7, 0Adet, sipariş numarası, yıl
floatkayan noktalı sayı3.14, 1499.90Tutar, oran, ölçüm
strmetin (string)"İzmir", 'A'Ad, adres, kod
boolmantıksal (boolean)True, FalseEvet/hayır durumları
NoneTypeyoklukNone"Henüz bilinmiyor"

Birkaç ayrıntı: Python'da tam sayıların üst sınırı yoktur, bankanın toplam mevduatını bile int tutar. Ondalık ayracı her zaman noktadır (1499.90), virgül değil. True ve False büyük harfle başlar. None ise "boş" ya da "henüz atanmadı" anlamına gelen özel bir değerdir; iade edilmemiş bir siparişin iade tarihi None'dır.

bool aslında bir sayıdırTrue 1, False 0 gibi davranır: True + True 2 verir. Bu, bir listede kaç koşulun sağlandığını saymak için ileride işine yarayacak.

Tür dönüşümü

Veri çoğu zaman yanlış türde gelir: CSV dosyasından okunan tutar metindir, formdan gelen yaş metindir. Dönüşüm (conversion) fonksiyonları türü değiştirir:

metin_tutar = "1499.90"
tutar = float(metin_tutar)
print(tutar + 100)              # artık hesap yapılabilir
adet = int("3")
print(adet * tutar)
etiket = "Adet: " + str(adet)   # sayıyı metne çevirip birleştir
print(etiket)
print(int(7.99), float(5))      # 7 ve 5.0

Dikkat: int(7.99) yuvarlamaz, ondalık kısmı atar ve 7 verir. int("7.99") ise hata verir; metin önce float olmalı. bool() dönüşümünün de bir kuralı vardır: 0, boş metin "" ve None False'a, geri kalan her şey True'ya dönüşür.

print(bool(0), bool(1500), bool(""), bool("İzmir"), bool(None))
Metin sayı değildir"1500" + 250 TypeError verir, "1500" * 2 ise "15001500" üretir. İkincisi hata vermediği için daha tehlikelidir; raporda tutarın iki kere yan yana yazıldığını görürsün. Sayı olarak kullanacağın her metni önce çevir.

Adlandırma kuralları

Python'ın zorunlu kuralları az: ad harf ya da alt çizgiyle başlar, rakam içerebilir ama rakamla başlayamaz, boşluk ve tire içeremez, if, for, class gibi anahtar sözcükler (keyword) ad olamaz. Türkçe karakter teknik olarak çalışır ama kurumsal kodda kullanılmaz. Geri kalanı stil rehberi PEP 8'den gelir:

KDV_ORANI = 0.20
urun_fiyati = 1250
kdv_tutari = urun_fiyati * KDV_ORANI
print("KDV:", kdv_tutari)
print("KDV dahil:", urun_fiyati + kdv_tutari)
Ad seçerken soru sor"Bu değişkenin içinde ne var?" sorusunun cevabı adın kendisi olmalı. veri ya da deger gibi genel adlar hiçbir şey anlatmaz; aylik_ciro anlatır.

Birden fazla değişkenle küçük bir rapor

Türleri ve adlandırmayı öğrendin; şimdi hepsini bir sipariş özetinde birleştir. Her değişkenin türünün görevine uyduğuna dikkat et: adet için int, fiyat için float, durum için bool, henüz bilinmeyen kargo numarası için None.

siparis_no = 10452
musteri_adi = "Ayşe Yılmaz"
adet = 3
birim_fiyat = 1499.9
odendi = True
kargo_no = None
toplam = adet * birim_fiyat
print("Sipariş", siparis_no, "-", musteri_adi)
print("Toplam:", round(toplam, 2), "TL")
print("Ödendi mi?", odendi)
print("Kargo numarası:", kargo_no)
print("Kargo verildi mi?", kargo_no is not None)

Son satır küçük ama kıymetli bir kalıp: bir alanın dolu olup olmadığını is not None ile sorarsın. Kargo numarası geldiğinde değişkene gerçek değeri atayacak ve aynı satır True verecek.

Dinamik tipleme

Python'da değişkenin türü yoktur, değerin türü vardır. Aynı etiket önce bir sayıya, sonra bir metne takılabilir; buna dinamik tipleme (dynamic typing) denir:

deger = 42
print(type(deger))
deger = "kırk iki"
print(type(deger))
deger = None
print(type(deger), deger is None)

Bu esneklik hızlı yazdırır ama bir bedeli var: Python, tutar değişkenine yanlışlıkla metin atadığını sana söylemez; hata ancak o değişkenle hesap yapmaya çalıştığında çıkar. İki alışkanlık bunu yönetir: bir değişkene hep aynı türde değer koymak ve belirsiz durumda type() ya da isinstance() ile kontrol etmek. Son satırdaki is None ise bir değerin None olup olmadığını sormanın doğru yoludur.

Derinleş

Çoklu atama, takas ve açma

Python aynı satırda birden fazla değişkene değer atamana izin verir. Bu yalnızca kısalık değil, bazı işleri çok daha güvenli yapar. En bilinen örnek iki değişkenin değerini takas etmektir (swap): başka dillerde geçici bir değişken gerekir, Python'da tek satır yeter.

sol_raf, sag_raf = "Çay", "Kahve"
print("Önce:", sol_raf, sag_raf)
sol_raf, sag_raf = sag_raf, sol_raf     # takas
print("Sonra:", sol_raf, sag_raf)

siparis = ("AM-417", "İzmir", 1499.9)   # bir kayıt
no, sehir, tutar = siparis              # açma (unpacking)
print(no, "|", sehir, "|", tutar)

stok = rezerve = 0                      # zincirleme atama
stok += 40
print("stok:", stok, "rezerve:", rezerve)

Takas neden çalışır? Python önce sağ tarafın tamamını hesaplar ve geçici bir demet (tuple) kurar, sonra soldaki adlara sırayla dağıtır. Açmada (unpacking) soldaki ad sayısı sağdaki eleman sayısıyla aynı olmalıdır; değilse ValueError: too many values to unpack alırsın. Bu katılık iyi bir şeydir: CSV satırında beklenmedik fazladan bir sütun varsa hata hemen ortaya çıkar.

Zincirleme atamada paylaşımstok = rezerve = 0 sayılarla güvenlidir çünkü sayı değişmezdir; += yeni bir sayı üretir. Ama a = b = [] yazarsan iki ad aynı listeyi gösterir ve birine eklediğin eleman ötekinde de görünür. Listelerde her değişkene ayrı ayrı [] ata.

Değer, kimlik ve değiştirilebilirlik

Her nesnenin üç özelliği vardır: değer (içeriği), tür ve kimlik (bellekteki yeri). == değerleri, is kimlikleri karşılaştırır; id() ise kimliği bir sayı olarak verir.

a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b, a is b)    # eşit değerler, farklı nesneler
print(a is c)            # aynı nesneye iki etiket
print(id(a) == id(c))

kargo_no = None
print(kargo_no is None)  # None için hep is kullan
Değiştirilemez (immutable)Değiştirilebilir (mutable)
int, float, bool, complexlist
strdict
tuple, frozensetset
NoneKendi yazdığın çoğu sınıf

Değiştirilemez bir nesneyi "değiştiren" her işlem aslında yeni bir nesne üretir ve adı ona taşır. tutar += 250 satırından sonra id(tutar) farklıdır. Değiştirilebilir nesneler ise yerinde değişir; liste, sözlük ve küme derslerinde bu farkın sonuçlarını sık sık göreceksin.

is ile sayı karşılaştırmaKüçük tam sayılar ve kısa metinler bellekte önbelleğe (cache) alınabildiği için x is 5 bazen True çıkar, bazen çıkmaz; Python 3.8+ bunun için uyarı da verir. Kural basit: is yalnızca None, True/False ve "aynı nesne mi" sorusu için; değer karşılaştırmasında hep ==.

Tür dönüşümünün tuzakları

Dönüşüm fonksiyonlarının kuralları sezgine her zaman uymaz. Bu tablo, gerçek veride en sık karşılaşılan durumları topluyor; Girdi ve dönüşüm dersinde girdiyi güvenli çevirmeyi ayrıca göreceksin.

İfadeSonuçNeden
int(" 42\n")42Baştaki/sondaki boşluklar yok sayılır
int("3.0")ValueErrorint metni yalnız tam sayı yazımı olarak kabul eder
int(float("3.0"))3Önce float, sonra int
int(-3.9)-3Sıfıra doğru keser, yuvarlamaz
float("1e3")1000.0Bilimsel gösterim kabul edilir
bool("False")TrueBoş olmayan her metin True'dur
bool(0.0), bool([])FalseSıfır ve boş koleksiyonlar False
str(None)"None"Dört harflik bir metin olur, boş değil
int(True)1bool, int'in alt türüdür
print(int(" 42\n") + 1)
print(bool("False"), bool(""), bool("0"))
print(repr(str(None)), len(str(None)))
print(isinstance(True, int), type(True) == int)

Son satırdaki fark ince ama önemli: isinstance alt türleri de kabul eder (True bir int sayılır), type(x) == int ise tam tür eşleşmesi ister. Bir değerin bool mu sayı mı olduğunu ayırt etmen gerekiyorsa bool kontrolünü önce yap. Birden fazla türe izin vermek için isinstance(x, (int, float)) yazabilirsin.

Adlandırmanın ince ayrıntıları

BiçimAnlamıÖrnek
snake_caseNormal değişken ve fonksiyontoplam_tutar
BUYUK_HARFSabit (değiştirme sözü)KDV_ORANI
_Kullanılmayacak değerno, _, tutar = kayit
_on_ek"İç kullanım" işareti_gecici_toplam
son_ek_Anahtar sözcükle çakışmayı önlerclass_, type_
__cift__Python'ın özel adları (dunder)__name__; kendin uydurma

Bir adı del ile silebilirsin; nesneyi değil, etiketi kaldırır. Silinen adı kullanmaya çalışırsan NameError alırsın. Pratikte del'i değişkenler için nadiren, büyük ara verileri bellekten erken bırakmak için kullanırsın.

kayit = ("AM-418", "Bursa", 3200)
no, _, tutar = kayit       # şehri kullanmayacağız
print(no, tutar)
gecici = tutar * 2
del gecici
print("gecici" in dir())   # artık tanımlı değil
Gerçek işteUygulama ayarları çoğunlukla ortam değişkenlerinden ya da yapılandırma dosyalarından metin olarak gelir: DEBUG="false", PORT="8080". bool("false") True döndürdüğü için "hata ayıklama (debugging) kapalı" sandığın sistem canlıda açık kalabilir; bu, gerçek projelerde sık görülen bir hatadır. Ayarları okurken metni açıkça karşılaştır (deger.strip().lower() in ("1", "true", "evet")) ve sayıları int() ile çevir. Yapılandırma dersinde bunu pydantic gibi araçlarla otomatikleştirmeyi göreceksin.
Uzmanlaş

Tip ipuçları: dinamik dilde belgeleme

Python 3'te değişkene beklenen türü yazabilirsin: tutar: float = 1499.90. Buna tip ipucu (type hint) denir. Python bunu çalışırken denetlemez; ama VS Code ve mypy gibi araçlar okur, yanlış türde atama yapınca altını çizer. Kurumsal projelerde fonksiyon imzalarında neredeyse standarttır; Orta seviyede ayrıntılı göreceksin.

Para için float mı?

Bankacılıkta kuruş hatası kabul edilmez ve float bazı ondalıkları tam temsil edemez (Sayılar dersinde göreceksin). Finans yazılımları ya tutarı kuruş cinsinden int tutar (1499.90 TL yerine 149990 kuruş) ya da decimal modülünü kullanır. Raporlama ve analizde float yeterlidir; muhasebe kaydında değildir.

Değişken aslında neye işaret eder?

Python'da her değer bellekte bir nesnedir (object) ve değişken ona bir referanstır. a = b dediğinde değer kopyalanmaz, ikinci bir etiket aynı nesneye takılır. Sayı ve metinler değiştirilemez olduğundan bunu fark etmezsin; ama liste gibi değiştirilebilir nesnelerde bu "kopyalama tuzağı"na dönüşür. Listeler dersinde başına gelmeden önce burada duymuş ol.

Alıştırmalara geç (20)