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ür | Adı | Örnek | Ne için |
|---|---|---|---|
int | tam sayı (integer) | 42, -7, 0 | Adet, sipariş numarası, yıl |
float | kayan noktalı sayı | 3.14, 1499.90 | Tutar, oran, ölçüm |
str | metin (string) | "İzmir", 'A' | Ad, adres, kod |
bool | mantıksal (boolean) | True, False | Evet/hayır durumları |
NoneType | yokluk | None | "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.
True 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))
"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:
- snake_case: küçük harf, kelimeler alt çizgiyle:
toplam_tutar,musteri_adi. - Anlamlı ad:
tyerinetutar,x1yerinesiparis_adedi. Üç ay sonra kodu okuyan sen olacaksın. - Sabitler BÜYÜK_HARF: değişmeyecek değerler için:
KDV_ORANI = 0.20. Python bunu zorlamaz, ekip arkadaşlarına mesajdır. - Hazır adları gölgeleme:
print,list,sum,typegibi adlara değer atama; o fonksiyonu kaybedersin.
KDV_ORANI = 0.20
urun_fiyati = 1250
kdv_tutari = urun_fiyati * KDV_ORANI
print("KDV:", kdv_tutari)
print("KDV dahil:", urun_fiyati + kdv_tutari)
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.
Ç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.
stok = 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, complex | list |
str | dict |
tuple, frozenset | set |
None | Kendi 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.
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.
| İfade | Sonuç | Neden |
|---|---|---|
int(" 42\n") | 42 | Baştaki/sondaki boşluklar yok sayılır |
int("3.0") | ValueError | int metni yalnız tam sayı yazımı olarak kabul eder |
int(float("3.0")) | 3 | Önce float, sonra int |
int(-3.9) | -3 | Sıfıra doğru keser, yuvarlamaz |
float("1e3") | 1000.0 | Bilimsel gösterim kabul edilir |
bool("False") | True | Boş olmayan her metin True'dur |
bool(0.0), bool([]) | False | Sıfır ve boş koleksiyonlar False |
str(None) | "None" | Dört harflik bir metin olur, boş değil |
int(True) | 1 | bool, 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çim | Anlamı | Örnek |
|---|---|---|
snake_case | Normal değişken ve fonksiyon | toplam_tutar |
BUYUK_HARF | Sabit (değiştirme sözü) | KDV_ORANI |
_ | Kullanılmayacak değer | no, _, tutar = kayit |
_on_ek | "İç kullanım" işareti | _gecici_toplam |
son_ek_ | Anahtar sözcükle çakışmayı önler | class_, 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ğilDEBUG="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.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.