Değişkenler, veri türleri ve ifadeler
İlk bölümde Python programımız sabit metinler yazdırıyordu. Gerçek programlarda ise değerler değişir: bir ürünün fiyatı, öğrencinin yaşı, hava sıcaklığı veya kalan internet kotası her çalıştırmada farklı olabilir. Bu hafta programın veriyi nasıl tuttuğunu, nasıl dönüştürdüğünü ve bu verilerle nasıl hesaplama yaptığını öğreneceğiz.
Bu bölümde çok sayıda Python özelliği ezberlemeyeceksiniz. Bunun yerine bir değerin hangi veri türünde (type) olduğunu fark etmeyi, değişkenlere anlamlı adlar vermeyi ve bir ifadenin hangi sonucu vereceğini adım adım izlemeyi öğreneceksiniz. İfade, Python’ın hesaplayıp tek bir değere indirdiği yazımdır: 3 * 4 bir ifadedir ve değeri 12’dir.
Bu bölümün kapsamı
- Atamada sağ tarafın önce hesaplanması ve değişkenin o anki değeri
int,float,strveboolayrımıinput()sonucunun metin olması ve dönüşümün neden gerektiği/,//ve%sonuçları ile sonuç türleri- Karşılaştırma ve
and/or/notsonuçları =ile==farkı ve yerleşik adı gölgelemenin sonucufloatdeğerlerin yaklaşık tutulmasının çıktıdaki etkisi
- Türkçe karakterli değişken adlarının kullanılabilirliği
- Kayan noktalı gösterimin ikilik taban ayrıntısı
- Kod hücrelerinde girdinin neden bir değişkenle verildiği
Bunlarla ileride yine karşılaşabilirsiniz, ama ezberlemeniz beklenmiyor.
"25" ile 25 aynı şey midir?
print("25") ile print(25) ekrana aynı şeyi yazar. Ama biriyle toplama yapabilirsiniz, öbürüyle yapamazsınız. Bu bölümdeki hataların çoğu bu ayrımdan çıkar: bir değerin ekranda nasıl göründüğü, türünü söylemez.
Değişken: bir değere verdiğimiz ad
Aşağıdaki programda urun_fiyati ve adet iki değişkendir:
urun_fiyati = 120
adet = 3
toplam = urun_fiyati * adet
print(toplam)= işareti burada matematikteki “eşittir” anlamında kullanılmaz. Sağ taraftaki değer hesaplanır ve sol taraftaki değişken adına bağlanır. Bu işleme atama (assignment) denir.
Bir değişkeni daha sonra yeni bir değere bağlayabiliriz:
puan = 70
puan = 85
print(puan)Çıktı 85 olur. İkinci atamadan sonra puan adı artık 85 değerini gösterir.
= ile == aynı şey değildir
= bir değeri değişkene atar. == ise iki değerin eşit olup olmadığını karşılaştırır; sonuç True (doğru) ya da False (yanlış) olur.
Değişken adları nasıl seçilir?
Python’da değişken adlarında harf, rakam ve alt çizgi (_) kullanılabilir. Ancak ad rakamla başlayamaz.
Geçerli örnekler:
ogrenci_adi = "Deniz"
sinav1 = 72
toplam_tutar = 450.5Geçersiz örnekler:
1sinav
toplam tutar
urun-fiyati
Anahtar sözcükler değişken adı olamaz
Python’ın kendine ayırdığı if, for, while, def, class, return, True gibi sözcüklere anahtar sözcük (keyword) denir. Bunlar değişken adı olamaz.
Örneğin şu satır geçerli Python değildir:
# for = 3Anahtar sözcükleri ezberlemeniz beklenmiyor. VS Code bunların çoğunu farklı renkte gösterir; yanlış kullanırsanız Python SyntaxError verir. Dikkat etmeniz gereken, bu sözcükleri kendi değişkenlerinize ad olarak vermemek.
Yerleşik adları gölgelemeyin
Bazı adlara değer atamak Python’a göre geçerlidir, ama sorun çıkarır. Böyle bir ada değer atarsanız Python’ın hazır fonksiyonunu gölgelersiniz (shadow): ad artık sizin değerinizi gösterir ve sonraki satırlarda şaşırtıcı hatalar çıkar.
Örneğin:
print = 5
# print("Merhaba") # TypeError: 'int' object is not callableÖzellikle şu adları kendi değişkenlerinize vermeyin:
print, input, list, str, int, float, sum
Bu adlar Python’ın yerleşik fonksiyon veya tür adlarıdır. Örneğin list = [1, 2] yazmak geçerli olsa bile daha sonra list(...) fonksiyonunu kullanmanızı engeller.
Yerleşik bir adın üzerine yanlışlıkla yazdıysanız aynı oturumda del print gibi bir komutla kendi atamanızı silebilirsiniz. Ama en güvenlisi, baştan anlamlı ve çakışmayan adlar seçmektir. Kod hücresinde eski atama hâlâ geçerliyse çalışma ortamını yeniden başlatmak da onu temizler.
Türkçe karakterli değişken adları
Python 3 değişken adlarında Türkçe harfleri de kabul eder (adlarda Unicode karakterlere izin verir). Bu yüzden şu kod çalışır:
öğrenci_adı = "Ayşe"Yine de bu derste değişken ve fonksiyon adlarında çoğunlukla ASCII karakterleri kullanacağız. Kabaca söylersek bunlar ç, ğ, ı, ö, ş, ü olmadan İngiliz alfabesinin harfleri, rakamlar ve _ işaretidir:
ogrenci_adi = "Ayşe"Türkçe harf kullanmak yanlış değil. Ama adlardaki ı ile i gibi gözle kolay karışan harfler, başka bir klavye düzeninde yazarken, kodda arama yaparken ve kodu bazı araçlarla paylaşırken gereksiz sorun çıkarabilir. Kullanıcıya gösterilen metinlerde ve veri değerlerinde Türkçe karakterleri normal biçimde kullanmaya devam edeceğiz.
Kod çalışsa bile anlamsız adlar okumayı zorlaştırır:
x = 249.90
y = 2
z = x * yAynı program şu biçimde daha kolay okunur:
birim_fiyat = 249.90
adet = 2
toplam_tutar = birim_fiyat * adetDeğişkenin adı “bu değer ne?” sorusunu cevaplamalı. Biraz uzun ama anlamlı bir ad, tek harfli bir addan çoğu zaman daha iyidir.
Temel veri türleri
Python’da her değerin bir türü vardır. Tür, değerin ne çeşit bir veri olduğunu ve onunla hangi işlemlerin yapılabileceğini belirler. Bu hafta dört temel tür üzerinde duracağız:
| Python türü | Ne tutar? | Örnek |
|---|---|---|
int |
tam sayı | 42, -7, 0 |
float |
ondalıklı sayı | 3.14, 19.5 |
str |
metin (string) | "Samsun", "42" |
bool |
mantıksal değer | True, False |
Aynı görünen değerler farklı türlerde olabilir:
sayi = 42
metin = "42"
print(type(sayi))
print(type(metin))42 bir int, "42" ise bir str değeridir. Tırnak işaretleri değerin metin olduğunu belirtir.
type() ile türü inceleyin
Aşağıdaki hücreyi çalıştırın. Sonra değerleri değiştirip type() çıktısının nasıl değiştiğine bakın.
Tahmin et: atama sırası sonucu nasıl etkiler?
Aşağıdaki kodu çalıştırmadan önce iki print() çağrısının ne yazdıracağını tahmin edin:
toplam değişkeni hesaplandığı anda birim_fiyat değeri 120 idi. Daha sonra birim_fiyat değişse de toplam kendiliğinden yeniden hesaplanmaz.
Kod izlerken her satırdan sonra “hangi değişken şimdi hangi değeri gösteriyor?” sorusunu sorun.
Aritmetik ifadeler
Python sayılarla temel matematik işlemlerini doğrudan yapabilir. İşlemi gösteren işaretlere operatör denir.
| Yazım | İşlem | Örnek |
|---|---|---|
+ |
toplama | 8 + 2 → 10 |
- |
çıkarma | 8 - 2 → 6 |
* |
çarpma | 8 * 2 → 16 |
/ |
bölme | 8 / 2 → 4.0 |
// |
tam bölme | 17 // 5 → 3 |
% |
kalan | 17 % 5 → 2 |
** |
üs alma | 2 ** 3 → 8 |
/ işlemi neden 4.0 verdi?
Python’da / ile bölmenin sonucu her zaman float olur. Bölme kalansız olsa bile bu değişmez:
print(10 / 5) # 2.0
print(type(10 / 5)) # <class 'float'>Sonucun tam sayı olması gerekiyorsa // operatörü kullanılır. 10 / 5 ile 10 // 5 aynı büyüklükte sonuç verir (2.0 ve 2), ama ikisi ayrı işlemlerdir ve sonuç türleri de farklıdır.
Birden fazla işlem varsa Python matematikteki işlem önceliğini uygular: çarpma ve bölme, toplama ve çıkarmadan önce yapılır. Parantez kullanırsanız hangi işlemin önce yapılacağı açıkça görünür ve kod daha kolay okunur:
ara_sinav = 70
final = 80
ortalama = (ara_sinav * 0.40) + (final * 0.60)
print(ortalama)float sonuçlarda uzun ondalıklar
Bilgisayar sayıları ikili sistemde (yalnızca 0 ve 1 ile) saklar ve 0.1 gibi birçok ondalıklı sayıyı bu sistemde tam olarak tutamaz. Bu yüzden bazı hesapların sonucu, beklediğiniz değere çok yakın olsa da ekranda fazladan basamaklarla görünebilir:
print(0.1 + 0.2)Çoğu bilgisayarda çıktı şudur:
0.30000000000000004
Python toplamayı “yanlış yapmıyor”. Bilgisayar float değerleri yaklaşık olarak tuttuğu için sonuç böyle çıkıyor. Bu fark özellikle para, ölçüm ve oran hesaplarında karşınıza çıkabilir.
Bu hafta değerin nasıl hesaplandığıyla ilgileniyoruz. Para gibi değerleri ekranda 994.24 TL biçiminde göstermeyi 8. haftada f-string’lerle (metnin içine değer yerleştirmenin bir yolu) öğreneceğiz. Bir değerin nasıl hesaplandığı ile ekranda nasıl gösterildiği ayrı konulardır.
Bu sayfadaki alıştırmalarda ayrı bir Check düğmesi yok. Run Code düğmesi kodunuzu çalıştırır. Alıştırmanın bir kontrolü varsa kodunuz aynı anda kontrol edilir ve sonuç hücrenin altında görünür.
Alıştırma: dakikayı saat ve dakikaya ayırın
135 dakika, 2 saat 15 dakikadır. Aşağıdaki programı tamamlayın. // ile tam saat sayısını, % ile geriye kalan dakikayı bulabilirsiniz.
Kalanı bulmak için % kullanın: bir_deger % 60.
toplam_dakika = 135
saat = toplam_dakika // 60
dakika = toplam_dakika % 60
print(saat)
print(dakika)input() ile kullanıcıdan veri alma
Geçen hafta girdi kavramını tanımış ama input() kullanmamıştık. Artık değişkenleri bildiğimiz için kullanıcıdan alınan değeri saklayabiliriz:
ad = input("Adınız: ")
print("Merhaba", ad)input() parantez içindeki iletiyi ekrana yazar, kullanıcının klavyeden yazıp Enter’a bastığı değeri alır ve bu değeri metin (str) olarak verir.
Geçen haftadan hatırlayın: print() içine virgülle verilen birden fazla değer varsayılan olarak aralarında bir boşlukla yazdırılır. Bu nedenle print("Merhaba", ad) çıktısında metin ile ad arasına ayrıca boşluk karakteri eklememiz gerekmez.
input() çalışmaz
Bu sayfadaki hücreler Python’ı tarayıcının içinde çalıştırır (Pyodide ile, bir Web Worker’da). Bu ortamda klavyeden girdi okuma (standart girdi, stdin) terminaldeki gibi çalışmaz. Bu yüzden input() kullanan bir hücre OSError: [Errno 29] I/O error hatası verebilir. input()’u kitapta normal Python kodu olarak öğreneceğiz. Tarayıcıdaki alıştırmalarda ise kullanıcıdan gelen değeri bir değişkene yazarak simüle edeceğiz, yani taklit edeceğiz.
Tarayıcıda girdi akışını simüle edin
Aşağıdaki girdi_metni değişkenini, kullanıcının input() ile yazdığı değer gibi düşünün. Değeri kendi adınızla değiştirip hücreyi çalıştırın:
Gerçek bir .py dosyasında aynı akış şöyle yazılır:
ad = input("Adınız: ")
print("Merhaba", ad)İki örnekte de fikir aynı: dışarıdan gelen metin bir değişkende saklanır ve programın sonraki adımlarında kullanılır.
Kullanıcı sayı yazsa bile neden toplama yapılamaz?
Aşağıdaki kod ilk bakışta doğru görünebilir:
yas = input("Yaşınız: ")
gelecek_yas = yas + 1Fakat yas bir str, 1 ise bir int değeridir. Python bu iki farklı türü + ile doğrudan toplayamaz.
Önce metni sayıya çevirmemiz gerekir. Bir değeri başka bir türe çevirmeye tür dönüşümü (type conversion) denir:
yas = int(input("Yaşınız: "))
gelecek_yas = yas + 1
print(gelecek_yas)Tarayıcıda aynı dönüşüm fikrini input() olmadan deneyebiliriz:
girdi_metni bir strdir; int(girdi_metni) ise bu metnin gösterdiği sayıyı int olarak verir.
Ondalıklı değerler için float() kullanılır:
boy = float(input("Boyunuz (metre): "))
print(boy)int("on dokuz") ya da float("abc") gibi dönüşümler başarısız olur. Bu hafta kullanıcının geçerli bir değer yazdığını varsayıyoruz. Geçersiz girdiyle nasıl başa çıkılacağını önce koşullarla, sonra istisnalarla (çalışma sırasında çıkan hataları yakalamanın bir yolu) öğreneceğiz.
İncele ve düzelt: tür uyuşmazlığı
Aşağıdaki program bilerek hatalı yazıldı. Program "19" metnini sayıya çevirip bir yıl sonraki yaşı hesaplamalı.
Kodu, 20 yazdıracak biçimde düzeltin.
int(yas_metni), "19" metnini 19 tam sayısına çevirir.
yas_metni = "19"
gelecek_yas = int(yas_metni) + 1
print(gelecek_yas)Karşılaştırmalar bool verir
Karşılaştırma yaptığımızda sonuç sayı veya metin değil, True ya da False olur:
Sık kullanılan karşılaştırmalar:
| Yazım | Anlam |
|---|---|
== |
eşit mi? |
!= |
eşit değil mi? |
< |
küçük mü? |
> |
büyük mü? |
<= |
küçük veya eşit mi? |
>= |
büyük veya eşit mi? |
Bu sonuçları gelecek hafta if ile programın hangi yolu izleyeceğine karar vermek için kullanacağız.
Mantıksal ifadeler: and, or, not
Karşılaştırmaları birleştirmek ya da sonucu tersine çevirmek için Python’ın and, or ve not anahtar sözcüklerini kullanırız.
yas = 20
ogrenci_mi = True
print(yas >= 18 and ogrenci_mi)
print(yas < 18 or ogrenci_mi)
print(not ogrenci_mi)and: iki taraf daTrueiseTrueolur.or: taraflardan en az biriTrueiseTrueolur.not: sonucu tersine çevirir.
Şimdilik bu ifadelerin yalnızca sonucunu okuyacağız. Bu sonuçlara göre karar vermeyi gelecek hafta göreceğiz.
Alıştırma: üyelik koşulunu birleştirin
Bir spor merkezinde indirimden yararlanmak için kişinin en fazla 25 yaşında ve öğrenci olması gerekiyor. Aşağıdaki indirim_uygun değişkenini doğru mantıksal ifadeyle hesaplayın.
İfade şu iki parçayı birlikte kullanmalı: yas <= 25 ve ogrenci_mi.
yas = 22
ogrenci_mi = True
indirim_uygun = yas <= 25 and ogrenci_mi
print(indirim_uygun)Değiştir: küçük bir alışveriş hesabı
Aşağıdaki program aynı üründen iki adet alındığında kargoyla birlikte ödenecek tutarı hesaplıyor:
Şunları sırayla deneyin:
adetdeğerini3yapın ve sonucu tahmin edin.- Kargoyu ücretsiz yapmak için
kargodeğerini değiştirin. odenecekhesabına20TL sabit indirim ekleyin.- Kodu çalıştırmadan önce her değişiklikte beklediğiniz sonucu not edin.
Bu alıştırmada yeni bir yazım yok; bir değeri değiştirince sonraki ifadelerin sonucunun nasıl değiştiğini izleyeceksiniz.
Üret: yolculuk yakıt maliyeti
Bir araç 100 kilometrede ortalama 6.5 litre yakıt tüketiyor. Yolculuk mesafesi 320 km ve yakıtın litre fiyatı 47.80 TL olsun.
Aşağıdaki başlangıç değerleriyle iki şeyi hesaplayan bir program yazın:
- Yolculukta harcanacak yakıt (litre)
- Toplam yakıt maliyeti (TL)
Programınız şu koşulları sağlamalı (kabul kriterleri):
- Tüketilen yakıt
mesafe_km / 100 * tuketim_100_kmformülüyle hesaplanmalı. - Toplam maliyet, tüketilen litre ile litre fiyatının çarpımı olmalı.
- İki sonuç da
print()ile yazdırılmalı.
Bu değerlerle toplam_maliyet matematiksel olarak 994.24 TL’dir. Ancak Python sürümüne ve işlemlerin sırasına bağlı olarak ekranda 994.2400000000001 gibi çok yakın bir float değeri görebilirsiniz. Bu, formülünüzün yanlış olduğunu göstermez. Önce hesabın doğru olduğunu kontrol edin; sonucu kullanıcıya iki ondalık basamakla göstermeyi 8. haftada öğreneceğiz.
Önce mesafe_km / 100 * tuketim_100_km ile tüketilen litreyi bulun. Sonra bu değeri litre_fiyati ile çarpın.
mesafe_km = 320
tuketim_100_km = 6.5
litre_fiyati = 47.80
tuketilen_yakit = mesafe_km / 100 * tuketim_100_km
toplam_maliyet = tuketilen_yakit * litre_fiyati
print("Tüketilen yakıt:", tuketilen_yakit)
print("Toplam maliyet:", toplam_maliyet)Yerel Python ortamında kısa input() uygulaması
Kendi bilgisayarınızdaki (yerel) Python yorumlayıcısı, terminalde çalışırken input() ile klavyeden girdi okuyabilir. Bir .py dosyasında aşağıdaki küçük programı deneyin:
ad = input("Adınız: ")
yas = int(input("Yaşınız: "))
print("Merhaba", ad)
print("Gelecek yıl yaşınız:", yas + 1)Programı en az iki farklı ad ve yaş değeriyle çalıştırın. Ardından int() dönüşümünü kaldırıp ne olduğuna bakın.
Tek sayfa özet
Bu hafta programlarımız yalnızca sabit metin yazdırmakla kalmadı; veri tutmaya ve hesap yapmaya başladı.
- Değişken, bir değere verdiğimiz addır.
- Atama sırasında sağ taraf hesaplanır ve sonuç sol taraftaki değişken adına bağlanır.
- Python anahtar sözcükleri değişken adı olamaz;
print,input,list,strgibi yerleşik adları değişken adı yapmak ise hazır fonksiyonları gölgeleyebilir. - Python 3 Türkçe harfli adlara izin verse de bu derste adlarda çoğunlukla ASCII harfler kullanacağız; böylece kod her klavyede ve her araçta sorunsuz okunur ve yazılır.
int,float,strveboolfarklı veri türleridir./ile bölmenin sonucu, bölme kalansız olsa bilefloattur.floatdeğerler bazı ondalıklı sayıları yaklaşık tuttuğu için sonuçta küçük gösterim farkları görülebilir.input()kullanıcı girdisini metin (str) olarak verir.- Kod hücrelerinde
input()terminaldeki gibi çalışmadığı için alıştırmalarda girdiyi bir değişkenle veriyoruz. - Girdiyle hesap yapmak için önce
int()ya dafloat()ile tür dönüşümü yapmak gerekir. - Aritmetik bir ifade hesaplanıp tek bir değere iner; işlem önceliği sonucu etkiler.
- Karşılaştırmanın sonucu
Trueya daFalseolur. andveormantıksal sonuçları birleştirir,notsonucu tersine çevirir.- Kod izlerken her satırdan sonra hangi değişkenin hangi değeri gösterdiğine bakın.
Bir sonraki bölümde sonucu True ya da False olan bu ifadeleri kullanarak programın hangi durumda hangi kodu çalıştıracağına karar vereceğiz.
Bu bölümün kazanımları
Bu bölümü bitiren öğrenci:
- Atamada sağ tarafın önce hesaplandığını bilir ve değişkenin o anki değerini izler.
int,float,strvebooltürlerini birbirinden ayırır.input()sonucunun metin olduğunu ve sayısal işlem için dönüşüm gerektiğini açıklar./,//ve%işlemlerinin sonucunu ve sonuç türünü tahmin eder.- Karşılaştırma ve mantıksal ifadelerin
True/Falsesonucunu belirler. =ile==arasındaki farkı ayırır ve yerleşik adları gölgelemenin sonucunu açıklar.floatdeğerlerin yaklaşık tutulmasının çıktıdaki sonucunu yorumlar.