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.
Amaç çok sayıda Python özelliğini ezberlemek değildir. Bir değerin hangi veri türüne (type) sahip olduğunu fark etmek, uygun değişken adı seçmek ve bir ifadenin hangi sonucu üreteceğini adım adım izlemek daha önemlidir.
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 gereğ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ıya yansıması
- Türkçe karakterli değişken adlarının kullanılabilirliği
- kayan noktalı gösterimin ikilik taban ayrıntısı
- tarayıcı hücrelerinde girdinin neden değişkenle simüle edildiği
Bu başlıklar konunun devamıdır; ileride karşınıza çıkar ama bu derste ezberlemeniz beklenmiyor.
"25" ile 25 aynı şey midir?
Ekranda ikisi de aynı görünür. Biriyle toplama yapabilirsiniz, diğeriyle yapamazsınız. Bu bölümdeki hataların çoğu bu tek ayrımdan doğar: bir değerin neye benzediği ile ne olduğu farklı şeylerdir.
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 atama, puan değişkeninin o andan itibaren gösterdiği değeri değiştirir.
= 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 ve True ya da False üretir.
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 dil yapısını oluşturan if, for, while, def, class, return, True gibi anahtar sözcükler (keywords) değişken adı olarak kullanılamaz.
Örneğin şu satır geçerli Python değildir:
# for = 3Anahtar sözcükleri ezberlemeniz beklenmiyor. Editör çoğunu renklendirir ve Python geçersiz kullanımda SyntaxError verir. Önemli olan, dilin özel sözcüklerini kendi veri adlarımızla karıştırmamaktır.
Yerleşik adları gölgelemeyin
Bazı adlar teknik olarak değişken adı yapılabilir; fakat Python’ın hazır işlevlerini gölgeler (shadow) ve sonraki satırlarda şaşırtıcı hatalara yol açar.
Örneğin:
print = 5
# print("Merhaba") # TypeError: 'int' object is not callableBenzer biçimde başlangıçta şu adları kendi değişkenleriniz için kullanmayın:
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.
Bir yerleşik adı yanlışlıkla değiştirdiyseniz aynı oturumda del print gibi bir silme işlemiyle adı kaldırmak mümkün olabilir; fakat başlangıçta en güvenli yaklaşım anlamlı ve çakışmayan adlar seçmektir. Tarayıcı hücresinde kalıcı durum oluştuysa çalışma ortamını yeniden başlatmak da eski atamayı temizler.
Türkçe karakterli değişken adları
Python 3, Unicode tanımlayıcıları desteklediği için teknik olarak şu kod çalışabilir:
öğrenci_adı = "Ayşe"Buna rağmen bu derste değişken ve fonksiyon adlarında çoğunlukla ASCII karakterleri kullanacağız:
ogrenci_adi = "Ayşe"Bunun nedeni Türkçe metin kullanmanın yanlış olması değildir. Kod adlarında ı / i gibi görsel olarak kolay karışan karakterler, farklı klavye düzenleri, arama ve bazı araçlarla paylaşım sırasında gereksiz sürtünme oluşturabilir. 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 iyi değildir:
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şken adı, “bu değer neyi temsil ediyor?” sorusuna cevap vermelidir. Başlangıçta biraz uzun ama anlamlı adlar kullanmak, tek harfli adlardan genellikle daha iyidir.
Temel veri türleri
Python’da her değerin bir türü vardır. 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ğini gözlemleyin.
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 otomatik olarak yeniden hesaplanmaz.
Kod izlerken her satırdan sonra “hangi değişken şimdi hangi değeri gösteriyor?” sorusunu sorun.
Aritmetik ifadeler
Python sayısal değerlerle temel matematik işlemlerini doğrudan yapabilir.
| 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 yapılan normal sayısal bölme float sonuç üretir. Bölme kalansız olsa bile bu değişmez:
print(10 / 5) # 2.0
print(type(10 / 5)) # <class 'float'>Tam sayı bölümü gerekiyorsa farklı anlam taşıyan // operatörü kullanılır. 10 / 5 ile 10 // 5 aynı sayısal büyüklüğü gösterebilir; fakat işlem türleri ve sonuç türleri aynı değildir.
Birden fazla işlem varsa Python işlem önceliğini uygular. Parantez kullanmak hem sonucu hem de kodun okunabilirliğini açık hâle getirir:
ara_sinav = 70
final = 80
ortalama = (ara_sinav * 0.40) + (final * 0.60)
print(ortalama)float sonuçlarda uzun ondalıklar
Bilgisayarlar birçok ondalıklı sayıyı ikili sistemde tam olarak temsil edemez. Bu nedenle bazı hesapların sonucu matematikte beklediğiniz değere çok yakın olduğu hâlde ekranda birkaç fazladan basamakla görünebilir:
print(0.1 + 0.2)Tipik çıktı:
0.30000000000000004
Bu, Python’ın toplama işlemini “yanlış yaptığı” anlamına gelmez; float değerlerin bilgisayarda yaklaşık temsil edilmesinin sonucudur. Bu konu özellikle para, ölçüm ve oran hesaplarında görünür olabilir.
Bu hafta önce sayısal değerin nasıl hesaplandığını öğreneceğiz. Ekranda para gibi değerleri 994.24 TL biçiminde göstermeyi 8. haftada f-string sayı biçimlendirmesiyle ele alacağız. Görsel biçimlendirme ile hesaplamanın kendisi aynı şey değildir.
Quarto Live’da otomatik değerlendirilen Python alıştırmalarında ayrı bir Check düğmesi bulunmaz. Run Code düğmesi öğrenci kodunu çalıştırır; alıştırmaya bağlı bir kontrol tanımlıysa değerlendirme de aynı akışta yapılır ve geri bildirim 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. // tam saat sayısını, % ise geriye kalan dakikayı bulmak için uygundur.
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() ekrandaki iletiyi gösterir, kullanıcının yazdığı değeri alır ve metin (str) olarak döndürür.
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.
Quarto Live, Python kodunu Pyodide ile tarayıcıdaki bir Web Worker içinde çalıştırır. Bu ortam terminaldeki standart girdiyi (stdin) aynı biçimde sağlamadığı için doğrudan input() kullanan canlı hücreler OSError: [Errno 29] I/O error üretebilir. Bu nedenle kitapta input() sözdizimini gerçek Python kodu olarak öğreneceğiz; fakat tarayıcı içi alıştırmalarda kullanıcıdan gelmiş veriyi bir değişkenle simüle 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)Bu iki örnekte öğretmek istediğimiz fikir aynıdır: dışarıdan gelen metin bir değişkende saklanır ve programın sonraki adımlarında kullanılır.
Sayı girmek neden tek başına yetmez?
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 tür dönüşümü yapmamız gerekir:
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 önce str türündedir; int(girdi_metni) yeni bir int değeri üretir.
Ondalıklı değerler için aynı fikir float() ile uygulanır:
boy = float(input("Boyunuz (metre): "))
print(boy)int("on dokuz") veya float("abc") gibi dönüşümler başarılı olmaz. Bu hafta geçerli girdi verildiğini varsayıyoruz. Geçersiz girdiyi sistematik biçimde ele almayı koşullar ve daha sonra istisnalarla geliştireceğiz.
İncele ve düzelt — tür uyuşmazlığı
Aşağıdaki program bilinçli olarak hatalıdır. Amaç "19" metnini sayıya dönüştürüp bir yıl sonrasını hesaplamaktır.
Kodu 20 çıktısını üretecek biçimde düzeltin.
int(yas_metni) ifadesi "19" metninden 19 tam sayısını üretir.
yas_metni = "19"
gelecek_yas = int(yas_metni) + 1
print(gelecek_yas)Karşılaştırmalar bool üretir
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
Birden fazla karşılaştırmayı bir araya getirmek için Python’ın and, or ve not anahtar sözcüklerini kullanabiliriz.
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. Bunlarla karar vermeyi gelecek hafta yapacağız.
Alıştırma — üyelik koşulunu birleştirin
Bir spor merkezindeki indirim için kişinin yaşı en fazla 25 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 iki ürünün toplamını 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.
Buradaki amaç yeni sözdizimi öğrenmek değil; bir değerdeki değişikliğin sonraki ifadeleri nasıl etkilediğini izlemektir.
Ü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ğerlerini kullanarak:
- Yolculukta tüketilecek yakıt miktarını,
- Toplam yakıt maliyetini
hesaplayan programı yazın.
Kabul kriterleri:
- Tüketilen yakıt
mesafe_km / 100 * tuketim_100_kmilişkisine göre hesaplanmalı. - Toplam maliyet, tüketilen litre ile litre fiyatının çarpımı olmalı.
- Her iki sonuç
print()ile gösterilmeli.
Bu değerlerle toplam_maliyet matematiksel olarak 994.24 TL’dir. Bununla birlikte bazı Python sürümleri ve işlem sıralarında ekranda 994.2400000000001 gibi çok yakın bir float değeri görebilirsiniz. Bu, formülünüzün yanlış olduğu anlamına gelmez. Önce hesabın doğru olduğunu kontrol edin; kullanıcıya iki ondalık basamakla gösterimi 8. haftada ele alacağız.
Ö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ı
Tarayıcı hücresinden farklı olarak terminalde çalışan normal Python yorumlayıcısı input() için standart girdi sağlar. 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ğunu gözlemleyin.
Tek sayfa özet
Bu hafta programlarımız sabit çıktı üretmekten çıkıp veri tutmaya ve hesaplama 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 işlevleri gölgeleyebilir. - Python 3 Türkçe karakterli tanımlayıcılara izin verse de bu derste kod adlarında taşınabilirlik ve okunabilirlik için çoğunlukla ASCII adlar kullanacağız.
int,float,strveboolfarklı veri türleridir./normal bölme işlemi kalansız bölmede bilefloatsonuç üretir.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.- Tarayıcıdaki Pyodide hücrelerinde terminal tipi
input()kullanılmadığı için girdi değeri etkileşimli alıştırmalarda değişkenle simüle edilir. - Sayısal işlem gerekiyorsa
int()veyafloat()gibi tür dönüşümleri gerekebilir. - Aritmetik ifadeler değer üretir; işlem sırası sonucu etkiler.
- Karşılaştırmalar
TrueveyaFalseüretir. and,orvenotmantıksal sonuçları birleştirmek için kullanılır.- Kod izlerken her satırdan sonra değişkenlerin hangi değerleri gösterdiğini takip etmek önemlidir.
Bir sonraki bölümde True ve False üreten 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.