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 hafta neleri yapabilmelisiniz?

Bölümün sonunda:

  • Bir değeri değişkende saklayabilmeli ve daha sonra kullanabilmeli,
  • Geçerli ve anlamlı değişken adları seçebilmeli; anahtar sözcükleri ve yerleşik adları değişken adı olarak kullanmanın sorunlarını açıklayabilmeli,
  • int, float, str ve bool veri türlerini ayırt edebilmeli,
  • type() ile bir değerin türünü inceleyebilmeli,
  • input() ile alınan girdinin neden metin olduğunu açıklayabilmeli,
  • int(), float() ve str() ile temel tür dönüşümleri yapabilmeli,
  • / işleminin sayısal bölmede float sonuç ürettiğini açıklayabilmeli,
  • float değerlerde görülebilen küçük gösterim farklarının neden hesaplama hatası olmadığını açıklayabilmeli,
  • Aritmetik ifadelerin sonucunu işlem sırasını dikkate alarak tahmin edebilmeli,
  • Karşılaştırma ve mantıksal ifadelerin True veya False ürettiğini açıklayabilmeli,
  • Kısa bir programdaki tür uyuşmazlığını bulup düzeltebilmelisiniz.

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.

Bir değişkenin bir değere bağlanması ve daha sonra yeniden değer alması.

Değişken bağlama ve yeniden atama
Important= 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.5

Geç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 = 3

Anahtar 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 callable

Benzer 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.

Tip

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 * y

Aynı program şu biçimde daha kolay okunur:

birim_fiyat = 249.90
adet = 2
toplam_tutar = birim_fiyat * adet
Tip

Değ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.

Note

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 + 210
- çıkarma 8 - 26
* çarpma 8 * 216
/ bölme 8 / 24.0
// tam bölme 17 // 53
% kalan 17 % 52
** üs alma 2 ** 38
Note/ 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.

Note

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.

Noteİnteraktif alıştırmalarda geri bildirim

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.

WarningTarayıcıdaki Python hücresi terminal değildir

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 + 1

Fakat 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.

input ile alınan metnin sayısal işleme uygun türe dönüştürülmesi.

Kullanıcı girdisinde tür dönüşümü

Ondalıklı değerler için aynı fikir float() ile uygulanır:

boy = float(input("Boyunuz (metre): "))
print(boy)
Warning

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 da True ise True olur.
  • or: taraflardan en az biri True ise True olur.
  • 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:

  1. adet değerini 3 yapın ve sonucu tahmin edin.
  2. Kargoyu ücretsiz yapmak için kargo değerini değiştirin.
  3. odenecek hesabına 20 TL sabit indirim ekleyin.
  4. 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_km ilişkisine göre hesaplanmalı.
  • Toplam maliyet, tüketilen litre ile litre fiyatının çarpımı olmalı.
  • Her iki sonuç print() ile gösterilmeli.
Warning

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.

Bölüm özeti

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, str gibi 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, str ve bool farklı veri türleridir.
  • / normal bölme işlemi kalansız bölmede bile float sonuç üretir.
  • float değ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() veya float() gibi tür dönüşümleri gerekebilir.
  • Aritmetik ifadeler değer üretir; işlem sırası sonucu etkiler.
  • Karşılaştırmalar True veya False üretir.
  • and, or ve not mantı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.

Kendinizi kontrol edin

Kodu çalıştırmadan cevaplamaya çalışın:

  1. "25" ile 25 arasındaki temel fark nedir?
  2. input() ile alınan "18" değeriyle neden doğrudan + 1 işlemi yapılamaz?
  3. Aşağıdaki kod ne yazdırır?
a = 10
b = a + 5
a = 20
print(a)
print(b)
  1. 17 // 5 ve 17 % 5 sonuçları nedir?
  2. 10 / 5 neden 2.0 döndürür?
  3. 20 >= 18 and True ifadesinin sonucu nedir?
  4. = ile == arasındaki fark nedir?
  5. print = 5 gibi bir atama neden sonraki print(...) çağrısını bozabilir?
  6. 0.1 + 0.2 sonucunun tam 0.3 görünmemesi neden tek başına hesaplama hatası değildir?
  7. Neden bu kitapta input() kullanan kod örnekleri tarayıcı hücresinden çok normal Python kod bloğu olarak gösteriliyor?

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.

Back to top