Python Değişkenler ve İsimlendirme Kuralları – Örneklerle Anlatım
Python Değişkenler ve İsimlendirme Kuralları
İlk beş derste ortamı kurduk: Python yüklendi, editör hazır, sanal ortam açıldı ve ekrana ilk “Merhaba” yazıldı. Güzel. Ama gerçek programlar sadece ekrana yazı yazmaz; veriyi bir yerden alır, hafızada tutar, üzerinde işlem yapar ve sonucu geri verir. İşte bu hafıza işinin kalbinde değişkenler yatıyor.
Bir program yazarken aynı değeri tekrar tekrar kullanman gerektiğini düşün. Kullanıcının doğum yılını bir kez alırsın, sonra o yılla yaş hesabı yaparsın, belki başka bir formülde daha kullanırsın. O değeri bir yerde tutamazsan her seferinde baştan istemen gerekir. Değişkenler tam olarak bu sorunu çözer.
Bu derste değişkenlerin ne olduğunu, Python’ın isimlendirmede kabul ettiklerini ve reddettiklerini, ayrıca bana yıllar içinde saatler kaybettiren o klasik hataları konuşacağız. Kahveni al, başlıyoruz.
Değişken Nedir?
En sade tanımıyla değişken, hafızadaki bir değere verdiğin isimdir. Python, sen bir değeri kaydettiğinde onu belleğin bir köşesine yerleştirir ve seçtiğin ismi o bölgeye bağlar.
Bunu şöyle düşün: bodrum katında kocaman bir depo var, yani RAM. Sen depoya bir kutu bırakıyorsun, üzerine yas yazıyorsun. Kutunun depoda tam olarak nerede durduğu seni ilgilendirmiyor; ihtiyacın olduğunda yas diye sesleniyorsun, kutu önüne geliyor.
python
# 'yas' ismini 34 değerine bağlıyoruz yas = 34 # İsmi çağırdığımızda Python kutunun içindekini getiriyor print(yas) # 34
Burada en kritik nokta eşittir işaretinin anlamı. Matematikte = iki tarafın eşitliğini söyler. Python’da ise “sağdaki değeri soldaki isme ata” demektir. Bu farkı ilk başta küçümsüyorsun. Sonra bir yerde x = x + 1 satırını görüyorsun ve matematikçi beynin isyan ediyor: “x nasıl x+1’e eşit olabilir?” Python’ın cevabı gayet pratik: x’in şu anki değerine 1 ekle, sonucu yine x’in üzerine yaz. Bu kadar.
Python’da Değişken Tanımlamak
Python’da değişken tanımlarken tip belirtmene gerek yok. Java’daki gibi int yas = 34; yazmıyorsun. İsim, eşittir, değer. Python değere bakıp tipini kendisi anlıyor. Buna dinamik tiplendirme deniyor.
python
# Üç farklı tipte değişkeni tek seferde tanımlıyoruz isim = "Ali" # str -> metin yas = 28 # int -> tam sayı boy = 1.78 # float -> ondalıklı sayı ogrenci_mi = True # bool -> doğru/yanlış # type() fonksiyonu değişkenin tipini söyler print(type(isim)) # <class 'str'> print(type(yas)) # <class 'int'> print(type(boy)) # <class 'float'> print(type(ogrenci_mi)) # <class 'bool'>
Arka planda ne oluyor? Python yas = 28 satırını gördüğünde bellekte bir int nesnesi oluşturuyor, içine 28’i koyuyor ve yas ismini bu nesneye bağlıyor. Yani ortada iki ayrı şey var: değer (28) ve ona işaret eden etiket (yas). Bu ayrım ileride listeleri kopyalarken tekrar karşına çıkacak; şimdilik aklının bir köşesinde dursun.
Aynı değişkenin tipini sonradan değiştirebilirsin de. yas = 28 yazdıktan sonra yas = "yirmi sekiz" dersen Python itiraz etmez; yeni değeri yeni bir nesne olarak oluşturur, etiketi ona taşır. Esneklik güzel. Ama bu gücü dikkatsiz kullanırsan kendi bacağına sıkarsın: bir değişkenin ömrü boyunca aynı tipi taşıması, büyük projelerde aklını ve zamanını korur.
İsimlendirmenin Sözdizimi Kuralları
Python’ın isimlendirme konusunda taviz vermediği kurallar var. Bunları ihlal edersen program hiç çalışmaz, tartışması yok:
- İlk karakter bir harf ya da alt çizgi (
_) olmalı; rakamla başlayamaz. - Kalan karakterler harf, rakam veya alt çizgi olabilir.
- Büyük-küçük harf duyarlılığı vardır:
yasileYasfarklı değişkenlerdir. - Boşluk, tire, nokta gibi karakterler kullanılamaz. (
ogrenci-yasigeçersiz,ogrenci_yasigeçerli.) - Rezerve kelimeler değişken adı olamaz; az sonra ayrıca değineceğiz.
1sepet yazarsan ne olur? SyntaxError alırsın. Python bu satırı okurken 1 ile başlayan şeyin sayı mı değişken mi olduğuna karar veremez. sepet1 ise tamamen geçerli. Yeni başlayanların gördüğü SyntaxError’ların ciddi bir kısmı bu kuraldan geliyor.
Bir keresinde stajyer arkadaşım 2faktorlu_dogrulama diye bir değişken tanımlamaya çalışıyordu, ekrandaki hatayı bir türlü çözemiyordu. Kodu iki dakika inceledik, sonra güldük: çözüm iki_faktorlu_dogrulama oldu. Bu tür hatalar utanılacak şeyler değil; hepimiz aynı yoldan geçtik.
Python’ın Rezerve Kelimeleri
Python’da bazı kelimeler dile ayrılmıştır ve değişken adı olarak kullanılamaz: if, for, while, def, class, import, return gibi. Yasaklı listenin tamamını Python sana kendisi verir:
python
# Python'ın rezerve kelimelerini listeliyoruz import keyword print(keyword.kwlist) # Çıktı: ['False', 'None', 'True', 'and', 'as', 'assert', ...]
class = "10-A" yazmayı dene bir. Interpreter’ın söylediklerini görünce bu kuralı bir daha unutmazsın. class kelimesi Python’da sınıf tanımlamak için kullanılır; ona başka bir anlam yükleyemezsin.
Yazım Stili: PEP 8 ve Temiz İsimler
Sözdizimi kuralları programın çalışması için zorunlu. Ama bir de Python topluluğunun üzerinde uzlaştığı stil kuralları var; bunlar programı çalıştırmaz, kodu okunabilir yapar. Python’ın stil rehberi PEP 8 olarak bilinir ve değişken isimleri için şunları önerir:
- Küçük harf + alt çizgi kullan:
ogrenci_adi. Bu stile snake_case denir. - Anlamlı isimler seç:
a = 3.14yerinepi_sayisi = 3.14. - Tek harfli isimleri sadece döngü sayaçları gibi kısa ömürlü yerlerde kullan:
for i in range(10). - Sabit değerlerde büyük harf kullan:
MAKSIMUM_DENEME = 5. - Türkçe karakterlerden uzak dur:
ogrenci_yasiyaz,öğrenci_yaşıyazma.
Türkçe karakter konusunu biraz açayım çünkü Türkiye’deki projelerde bu gerçek bir mesele. Python 3, UTF-8 sayesinde ş, ğ, ı harflerini değişken adlarında kabul ediyor; kod kendi makinende çalışıyor. Sonra dosyayı sunucuya atıyorsun, oradaki ayarlar farklı oluyor, işler garipleşiyor. Ben kendi projelerimde bile Türkçe karakter kullanmıyorum. Teknik olarak mümkün olması, iyi fikir olduğu anlamına gelmiyor.
Python’ın Hazır İsimlerini Ezmemek
Şimdi sana bir hata anlatayım ki aynısını yapmayasın. Python’ın list, str, sum, max, min gibi hazır fonksiyonları var. Bunları değişken adı olarak kullanmak sözdizimi açısından yasak değil; Python sana kızmaz. Ama kullanırsan hazır fonksiyonu kendi değişkeninle gölgelemiş olursun.
python
# KÖTÜ ÖRNEK: Hazır bir ismi değişken adı yapmak
list = [1, 2, 3] # 'list' artık senin değişkenin!
# Başka bir yerde list() fonksiyonunu çağırmaya çalışırsak...
sayilar = list("123") # TypeError: 'list' object is not callable
İlk büyük projemde sum diye bir değişken tanımlamıştım; o an gayet mantıklı gelmişti, sonuçta toplam tutuyordum. Üç gün sonra bambaşka bir dosyada sum(satirlar) çağrısı TypeError verdi. Saatlerce aradım, sorun dosyanın tepesinde masumca duran sum = 0 satırıydı. O günden beri hazır fonksiyon isimlerine elimi sürmüyorum.
Büyük-Küçük Harf ve = / == Tuzağı
Python’da Ad, ad ve AD üç farklı değişkendir. Bunu bilmek yetmez; hissetmen lazım. Çünkü buradan doğan hatalar sessizdir. Program çökmez, sadece yanlış sonuç üretir ve sen bunu fark etmezsin.
python
toplam = 100 Toplam = 200 print(toplam) # 100 print(Toplam) # 200 # Hata yok; ikisi apayrı değişkenler. Ama kafa karışıklığı garanti.
Bir de = ile == ikilisi var. Klavyede yan yanalar, anlamları ise bambaşka. = atama yapar, == karşılaştırma yapar. if konusuna geldiğimizde bu fark iyice oturacak; şimdiden şunu bil: if x = 5: yazarsan Python sana doğrudan SyntaxError fırlatır.
Birden Fazla Değişkeni Tek Satırda Atamak
Python’ın sevimli özelliklerinden biri de çoklu atama. Tek satırda birden fazla değişkene değer verebilirsin:
python
# Üç değişkene aynı anda değer atıyoruz ad, yas, sehir = "Zeynep", 32, "İzmir" print(ad) # Zeynep print(yas) # 32 print(sehir) # İzmir
Arka planda ne oluyor? Python önce sağdaki üç değeri bir pakete topluyor (buna tuple diyoruz, ileride detayına ineceğiz), sonra bu paketi soldaki isimlere sırayla dağıtıyor. Bu işleme unpacking deniyor ve fonksiyonlardan birden fazla değer döndürürken bol bol kullanacaksın.
Bu özelliğin en şık kullanımı iki değişkenin değerini takas etmek. Çoğu dilde bunun için geçici bir üçüncü değişken gerekir. Python’da tek satır:
python
a = 5 b = 10 # İki değeri tek satırda takas ediyoruz a, b = b, a print(a) # 10 print(b) # 5
Nasıl çalışıyor? Aynı mantık: Python önce (b, a) paketini, yani (10, 5)‘i oluşturuyor, sonra bu paketi a, b‘ye dağıtıyor. Geçici değişkene gerek yok, hata yapma ihtimali de düşüyor.
Küçük Bir Uygulama
Bu derste öğrendiklerimizi küçük bir programda birleştirelim. Bir e-ticaret sepeti simülasyonu kuralım; değişkenleri tanımlayalım, birbirine bağlayalım ve sonuçları ekrana basalım:
python
# Sepet bilgilerini değişkenlerde tutuyoruz
urun_adi = "Kablosuz Kulaklık"
birim_fiyat = 450.5
adet = 3
kargo_ucreti = 25
# Değişkenleri birbirine bağlayarak hesaplama yapıyoruz
ara_toplam = birim_fiyat * adet
genel_toplam = ara_toplam + kargo_ucreti
# Sonuçları ekrana yazdırıyoruz
print("Ürün:", urun_adi)
print("Ara Toplam:", ara_toplam)
print("Genel Toplam:", genel_toplam)
Bu kod parçasında asıl güzellik şu: ara_toplam, birim_fiyat ve adet değişkenlerinin o anki değerlerinden hesaplanıyor. Değişkenlerin gücü tam olarak burada ortaya çıkıyor; bir yerde değeri güncellersen ona bağlı tüm hesaplar kendiliğinden güncellenir. Deneme olarak birim_fiyatı 500 yapıp programı tekrar çalıştır; genel_toplamın değiştiğini göreceksin.
Sık Sorulan Sorular
Python’da değişken tanımlarken tip belirtmek zorunda mıyım?
Hayır. Python dinamik tiplendirme kullanır; değere bakıp tipini kendisi belirler. type() fonksiyonuyla da istediğin zaman kontrol edebilirsin.
Değişken adında Türkçe karakter kullanabilir miyim?
Teknik olarak evet, Python 3 Unicode destekliyor. Ama sunucu ortamları ve ekip arkadaşları devreye girince sorun çıkarabiliyor; pratikte önerilmez.
Değişken adı rakamla başlayabilir mi?
Hayır. İlk karakter harf ya da alt çizgi olmalı. 1sepet SyntaxError verir, sepet1 geçerlidir.
Sırada Ne Var?
Değişkenlerin temelini attık; kutularımız hazır. Şimdi sıra bu kutuların içine koyduğumuz değerlerle oynamakta. Bir sonraki derste Python’ın sayılarla ilişkisini konuşuyoruz: tam sayılar, ondalıklı sayılar, matematiksel operatörler ve bölme işleminin Python’daki şaşırtıcı davranışları. Sayılar ve Matematiksel İşlemler dersinde görüşmek üzere.
