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ığı ya da 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 hesap yaptığını öğreneceğiz.

Bu bölümde çok sayıda Python özelliği ezberlemeniz gerekmiyor. 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 sayfadaki kod hücreleri kendiliğinden çalışmaz. Her hücrede önce çıktıyı tahmin edin, sonra Run Code düğmesine basın. Kodu değiştirip yeniden çalıştırabilir, Start Over ile ilk hâline döndürebilirsiniz.

Bu bölümün kapsamı

NoteSınavda sorulur
  • Atamada sağ tarafın önce hesaplanması ve değişkenin o anki değeri
  • int, float, str ve bool ayrı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 / not sonuçları
  • = ile == farkı ve yerleşik adı gölgelemenin sonucu
  • float değ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.

Gezi otobüsünü nasıl hesaplardınız?

Okulunuz bir gezi düzenliyor. Kayıt kapanınca gezi sorumlusu katılımcı sayısını bir programa yazacak. Program şu bilgilerle hesap yapacak:

  • Bir otobüse 45 kişi biner.
  • Bir otobüsün kirası 9.000 TL. Toplam kira katılımcılar arasında eşit bölünür.

Program üç şey söyleyecek: kaç otobüsün tamamen dolduğunu, son otobüse kaç kişinin kaldığını ve kişi başı ücreti.

1. bölümde bir işin adımlarını sözde kodla yazmıştık. Bu programın adımlarını da öyle, Türkçe ve madde madde yazın: girdi ne, hangi hesap hangi sırayla yapılıyor, çıktı ne. Sonra adımlarınızı dört durumla deneyin:

  1. Program klavyeden gelen her şeyi önce yazı olarak alır. Sorumlu bir gün 100, bir gün yüz yazdı. Adımlarınızdan hangisi bu yazıyı hesapta kullanılacak sayıya çeviriyor?
  2. 100 kişi kaydoldu. Adımlarınız hem dolu otobüs sayısını hem son otobüsteki kişi sayısını veriyor mu?
  3. Kişi başı ücreti hesapladınız, sonra 5 kişi daha kaydoldu ve katılımcı sayısını 105 yaptınız. Kişi başı ücret kendiliğinden değişir mi?
  4. Sorumlu sonucu denetlemek istiyor: kişi başı ücret ile katılımcı sayısının çarpımı toplam kiraya eşit mi? 105 kişiyle deneyin.

Python bilmeniz gerekmiyor: “Katılımcı sayısını 45’e böl” de bir adım. Adımlarınızı bir kenara yazın. Bölümde her birinin Python’da nasıl yazıldığını göreceğiz. Alıştırmalardan önce listenize döneceğiz.

Değişken: bir değere verdiğimiz ad

Değişken, bir değere verdiğimiz addır. Aşağıdaki programda urun_fiyati, adet ve toplam üç değişkendir. Program ne yazar?

= 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. Hücre hangi değeri yazar?

İkinci atamadan sonra puan adı yeni değeri gösterir. Eski değer artık bu adla bulunamaz.

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= atar, == karşılaştırır

= 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.5

Geç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. Bu hücre çalışır mı?

Anahtar sözcükleri ezberlemeniz beklenmiyor. VS Code bunların çoğunu farklı renkte gösterir. Yanlış kullanırsanız Python SyntaxError (söz dizimi hatası) verir. Dikkat etmeniz gereken, bu sözcükleri kendi değişkenlerinize ad olarak vermemek.

Yerleşik adları gölgelemeyin

Python’ın kendisiyle birlikte gelen print, input, int gibi fonksiyon ve tür adlarına yerleşik ad denir. Bu 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

Bu örnek bilerek hücreye konmadı. Sayfadaki hücreler aynı Python oturumunu paylaşır. Hücrede print = 5 çalışırsa sonraki hücrelerin hepsi bozulur.

Özellikle şu adları kendi değişkenlerinize vermeyin:

print, input, list, str, int, float, sum

Örneğin input = "Deniz" yazmak geçerlidir, ama ondan sonra input("Adınız: ") çağrısı TypeError verir. Bu fonksiyonu birazdan göreceğiz.

Tip

Yerleşik bir adın üzerine yanlışlıkla yazdıysanız del print gibi bir satırla kendi atamanızı silebilirsiniz. Kod hücresinde eski atama kalmışsa sayfayı yenilemek de onu temizler. En güvenlisi, baştan çakışmayan adlar seçmektir.

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 kullanmaya devam edeceğiz.

Anlamlı ad seçin

Kod çalışsa bile anlamsız adlar okumayı zorlaştırır:

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ş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. type() bir değerin türünü verir. İki satır ne yazar?

Tırnak işaretleri değerin metin olduğunu belirtir. type() sonucu <class 'int'> biçiminde yazar. Şimdilik yalnız tırnak içindeki tür adına bakın.

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.

Note

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
- çıkarma 8 - 2
* çarpma 8 * 2
/ bölme 8 / 2
// tam bölme 17 // 5
% kalan 17 % 5
** üs alma 2 ** 3

Tam bölme, bölümün yalnız tam sayı kısmını verir. Kalan, bölmeden geriye kalan sayıdır. Hücredeki dört satır ne yazar?

Note/ 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. 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. Ortalama kaç çıkar?

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. İki satır ne yazar?

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. İki float sonucu == ile karşılaştırırken bunu aklınızda tutun.

İlk satır 0.30000000000000004 yazar. 0.1 ve 0.2 tam tutulamadığı için toplam 0.3’ün biraz üstüne düşer. İkinci satır False yazar: == bu çok küçük farkı da görür.

Note

Bu hafta değerin nasıl hesaplandığıyla ilgileniyoruz. Para gibi değerleri ekranda 257.14 TL biçiminde göstermeyi 8. haftada f-string’lerle (metnin içine değer yerleştirmenin bir yolu) öğreneceğiz.

NoteAlıştırmalarda geri bildirim

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.

WarningKod hücresinde input() çalışmaz

Bu sayfadaki hücreler Python’ı tarayıcının içinde çalıştırır. Bu ortam klavyeden terminaldeki gibi girdi okuyamaz. Bu yüzden input() kullanan bir hücre OSError: [Errno 29] I/O error hatası verebilir. input() örneklerini kitapta düz kod bloğu olarak göreceğiz, onları kendi bilgisayarınızda çalıştırabilirsiniz. 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 + 1

Fakat yas bir str, 1 ise bir int değeridir. Python bu iki farklı türü + ile doğrudan toplayamaz ve TypeError verir.

İki taraf da metin olsaydı hata çıkmazdı, ama toplama da yapılmazdı. + iki metni yan yana ekler: "19" + "1" sonucu "191" olur.

Ö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. Üç satır ne yazar?

girdi_metni bir strdir. int(girdi_metni) ise bu metnin gösterdiği sayıyı int olarak verir.

Dönüşümü unutunca her zaman hata almazsınız. Kullanıcı 5 adet sipariş verdi ve bu değer bir metin olarak geldi. Çalıştırmadan önce iki satırın ne yazacağını tahmin edin:

* bir metinle bir tam sayı arasında çarpma yapmaz, metni o sayı kadar yan yana yazar. Program hata vermeden devam ettiği için bu yanlışı fark etmek TypeError’dan zordur. İki metni çarpmaya çalışırsanız ("5" * "3") Python yine TypeError verir.

İlk satır 555 yazar: "5" metni üç kez yan yana gelir. İkinci satır önce "5" metnini 5 sayısına çevirir, sonra çarpar ve 15 yazar.

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 float() kullanılır:

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

int("on dokuz") ya da float("abc") gibi dönüşümler başarısız olur ve Python ValueError verir. int() yalnız rakamlarla yazılmış bir metni sayıya çevirebilir. Bu hafta kullanıcının geçerli bir değer yazdığını varsayıyoruz. Geçersiz girdiyle ne yapılacağını 3. haftada koşullarla, 13. haftada istisnalarla (program çalışırken çıkan hatayı yakalamanın bir yolu) göreceğ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ırmanın sonucu her zaman True ya da False’tur. sicaklik 18 iken dört satır ne yazar?

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 ya da eşit mi?
>= büyük ya da eşit mi?

Karşılaştırmada tür de önemlidir. "25" == 25 sonucu False’tur, çünkü metin ile sayı hiçbir zaman eşit sayılmaz.

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:

  • and: iki taraf da True ise True olur.
  • or: taraflardan en az biri True ise True olur.
  • not: sonucu tersine çevirir.

Çalıştırmadan önce üç satırın ne yazacağını tahmin edin:

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)

Soruya dönelim: gezi hesabı Python’da

Bölümün başında gezi programının adımlarını yazıp dört durumla denemiştiniz. Python’daki karşılıkları şöyle:

Durum Sözde kodda Python’da Dikkat
100 ya da yüz yazıldı “Katılımcı sayısını al” katilimci = int(input("Katılımcı sayısı: ")) input() her zaman str verir. int() olmadan "100" // 45 satırı TypeError verir. int("yüz") ise ValueError verir
100 kişi “Katılımcı sayısını 45’e böl” katilimci // 45 dolu otobüs sayısını, katilimci % 45 son otobüsteki kişi sayısını verir 100 / 45 sonucu 2.2222222222222223 olur. Otobüs sayısı da kişi sayısı da tam sayıdır
5 kişi daha geldi “Sayıyı güncelle, ücreti yeniden hesapla” katilimci = 105 atamasından sonra kisi_basi = toplam_kira / katilimci satırı yeniden çalışmalı Atama o anki değeri saklar. kisi_basi kendiliğinden güncellenmez
105 kişiyle denetim “Ücret çarpı kişi, kiraya eşit mi?” kisi_basi * katilimci == toplam_kira == karşılaştırır ve bool verir. Burada = yazılırsa Python hata verir, çünkü atamanın sol tarafında işlem olamaz. Sonuç False çıkar: kisi_basi bir float ve yaklaşık tutuluyor

Listenizi tabloyla karşılaştırın. “Sayıyı al” adımında yazıyı sayıya çeviren bir adım yoksa Python da çevirmez. “45’e böl” yazdıysanız hangi bölmeyi kastettiğinizi düşünün: dolu otobüs için tam bölme, son otobüs için kalan gerekir. Kaç otobüs kiralanacağını bulmak için bir kural daha gerekiyor: “son otobüste kişi varsa bir otobüs daha kirala”. Bunu 3. bölümde koşullarla yazacağız.

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. Her değişiklikten önce beklediğiniz sonucu not edin, sonra çalıştırın:

  1. adet değerini 3 yapın.
  2. Kargoyu ücretsiz yapmak için kargo değerini değiştirin.
  3. odenecek hesabına 20 TL sabit indirim ekleyin.

Bu alıştırmada yeni bir yazım yok. Bir değeri değiştirince ona bağlı hesapların nasıl değiştiğini izleyeceksiniz.

Hücreyi her çalıştırdığınızda program baştan çalışır. adet değişince urunler_toplami da yeni değerle yeniden hesaplanır. “Tahmin et” örneğindeki toplam ise eski değerde kalmıştı, çünkü birim_fiyat hesaptan sonra değişmişti.

Üret: gezinin otobüs hesabı

Bölümün başındaki gezi programını yazın. Kayıt formundan "105" metni geldi. Bu hafta henüz koşul yazmadığımız için son otobüste kişi olduğunu varsayın: kiralanacak otobüs sayısı, dolu otobüs sayısının bir fazlası.

Programınız şu koşulları sağlamalı (kabul kriterleri):

  • katilimci_metni önce int() ile sayıya çevrilmeli.
  • Dolu otobüs sayısı // ile, son otobüsteki kişi sayısı % ile hesaplanmalı.
  • Toplam kira, kiralanan otobüs sayısı ile otobus_kirasi’nın çarpımı olmalı. Kişi başı ücret, toplam kiranın katılımcı sayısına bölümü olmalı.
  • Dolu otobüs sayısı, son otobüsteki kişi sayısı ve kişi başı ücret print() ile yazdırılmalı.
  • Son satırda kisi_basi * katilimci == toplam_kira denetimi yazdırılmalı.
Warning

Bu değerlerle 2 dolu otobüs, son otobüste 15 kişi ve 257.14285714285717 TL kişi başı ücret çıkmalı. Denetim satırı False yazar. Bu, formülünüzün yanlış olduğunu göstermez: kişi başı ücret yaklaşık tutulduğu için çarpım 27000.000000000004 olur. Sonucu iki ondalık basamakla göstermeyi 8. haftada öğreneceğiz. katilimci_metni’ni "90" yaparsanız boş bir otobüs fazladan kiralanır. Bunu 3. bölümde koşulla düzelteceğiz.

Önce katilimci = int(katilimci_metni) satırını yazın. Sonra katilimci // otobus_kapasitesi ve katilimci % otobus_kapasitesi ile iki sayıyı bulun.

katilimci_metni = "105"
otobus_kapasitesi = 45
otobus_kirasi = 9000

katilimci = int(katilimci_metni)
dolu_otobus = katilimci // otobus_kapasitesi
son_otobus = katilimci % otobus_kapasitesi
otobus_sayisi = dolu_otobus + 1

toplam_kira = otobus_sayisi * otobus_kirasi
kisi_basi = toplam_kira / katilimci

print("Dolu otobüs:", dolu_otobus)
print("Son otobüste:", son_otobus)
print("Kişi başı:", kisi_basi)
print(kisi_basi * katilimci == toplam_kira)

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. Aşağıdaki programı VS Code’da yeni bir dosyaya, örneğin girdi.py adıyla kaydedin ve 1. haftadaki gibi çalıştırın. Program soru sorunca cevabı terminale yazıp Enter’a basın:

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. Son olarak yaşı rakamla değil yazıyla, on dokuz diye girin.

Gezi programını da aynı yolla deneyebilirsiniz: Üret’teki çözümde katilimci_metni = "105" satırını katilimci_metni = input("Katılımcı sayısı: ") yapın ve bir kez yüz yazın.

Sınav provası

Önce kendi cevabınızı seçin, sonra cevap anahtarında her şıkkın neden doğru ya da yanlış olduğunu okuyun. Yanlış şıklar rastgele yazılmadı; bu konuda öğrencilerin gerçekten yaptığı hatalardan seçildi. Sınav soruları da aynı yolla hazırlanır.

Madde 1. Aşağıdaki program ne yazdırır?

a = 10
b = a + 5
a = 20
print(a)
print(b)
  • A. 10 ve 25
  • B. 20 ve 15
  • C. 20 ve 20
  • D. 10 ve 15
  • E. 20 ve 25

Madde 2. "25" ile 25 arasındaki temel fark nedir?

  • A. İkisi de sayıdır; tırnak yalnızca okunabilirlik içindir
  • B. İlki daha büyük bir sayıdır
  • C. İlki float, ikincisi inttir
  • D. İkisi de aynıdır; Python tırnağı yok sayar
  • E. İlki metin (str), ikincisi tam sayıdır (int)

Madde 3. yas = input("Yaşınız: ") satırından sonra yas + 1 işlemi neden hata verir?

  • A. yas değişkeni boş kaldığı için
  • B. input() çağrısına bir mesaj verildiği için sonuç bozulur
  • C. input() yalnızca harf kabul eder, rakam kabul etmez
  • D. input() girilen değeri her zaman metin olarak verir
  • E. Sayıya 1 eklemek için += 1 yazmak gerekir

Madde 4. 17 // 5 ve 17 % 5 işlemlerinin sonuçları sırasıyla nedir?

  • A. 3 ve 2
  • B. 4 ve 1
  • C. 2 ve 3
  • D. 3.4 ve 2
  • E. 3 ve 3.4

Madde 5. 10 / 5 işlemi neden 2 değil 2.0 sonucunu verir?

  • A. print() sayıları her zaman ondalıklı gösterir
  • B. Bölme sonucunda küçük bir yuvarlama hatası oluşmuştur
  • C. / işlemi kalansız bölmede bile her zaman float verir
  • D. Bölünen bölenden büyük olduğu için
  • E. 10 ve 5 değerleri aslında float olarak saklanır

Madde 6. 20 >= 18 and True ifadesinin sonucu nedir?

  • A. None
  • B. True
  • C. 20
  • D. False
  • E. Hata verir; sayı karşılaştırması True ile birleştirilemez

Madde 7. = ile == arasındaki fark nedir?

  • A. İkisi de eşitlik sınar; == yalnızca daha okunaklıdır
  • B. == yalnızca if içinde, = yalnızca fonksiyon içinde kullanılır
  • C. == atama yapar, = karşılaştırır
  • D. = değişkene değer atar, == iki değeri karşılaştırır
  • E. = sayılarda, == metinlerde kullanılır

Madde 8. Aşağıdaki program neden ikinci satırda hata verir?

print = 5
print("Merhaba")
  • A. print adı artık 5 sayısına bağlıdır, sayı çağrılamaz
  • B. print bir anahtar sözcüktür ve atamada kullanılamaz
  • C. 5 sayısı metinle birlikte kullanılamaz
  • D. İkinci satırda tırnak yanlış kullanılmıştır
  • E. Hata vermez; Python eski print fonksiyonunu kendiliğinden geri getirir

Madde 9. print(0.1 + 0.2) çıktısı 0.30000000000000004 görünüyor. Bu ne anlama gelir?

  • A. Toplama işlemi yanlış yazılmıştır
  • B. Sayılar metin olarak toplanmıştır
  • C. print() uzun sayıları yazdırırken çıktıyı bozmuştur
  • D. Python’da bir hesaplama hatası vardır ve sürüm güncellenmelidir
  • E. float bazı ondalık sayıları tam değil, yaklaşık tutar

Madde 1. Doğru: B. b hesaplandığı anda a hâlâ 10’du, yani b 15 oldu. Sonradan anın değişmesi byi etkilemez.

  • A yanlış: İki satır da yanlış izlenmiş: a eski değerinde, b ise yeni a ile hesaplanmış gibi. Oysa ne a eski değerinde kalır ne de b yeniden hesaplanır.
  • C yanlış: b = a + 5 satırındaki a yüzünden iki adın aynı değeri paylaştığı sanılabilir. Ama b ayrı bir değişkendir ve anın yeni değerini almaz.
  • D yanlış: b doğru bulunmuş ama a ilk değerinde bırakılmış. Üçüncü satır ayı 20 yaptı; print(a) güncel değeri yazar.
  • E yanlış: b bir formül gibi aya bağlı kalıyormuş ve a değişince yeniden hesaplanıyormuş gibi düşünülür. Ama b = a + 5 satırı o andaki sonucu, yani 15’i saklar; b sonradan kendiliğinden güncellenmez.

Madde 2. Doğru: E. Tırnak değeri metne çevirir. Metinle aritmetik işlem yapılamaz: "25" + 1 hata verirken 25 + 1 sonucu 26 olur.

  • A yanlış: Ekranda ikisi de 25 diye göründüğü için akla yatkındır. Ama tırnak süs değildir; değerin türünü belirler.
  • B yanlış: Tırnak sayıya bir şey ekliyormuş gibi görünebilir. Ama metin bir sayı büyüklüğü taşımaz; "25" > 25 karşılaştırması hata bile verir.
  • C yanlış: İki değerin farklı türde olduğunu doğru sezer ama türü yanlış adlandırır. "25" bir strdir; float olması için tırnaksız ve ondalıklı (25.0) yazılması gerekirdi.
  • D yanlış: print("25") ile print(25) ekranda aynı çıktıyı verdiği için böyle düşünülebilir. Ama Python tırnağı yok saymaz; type("25") ile type(25) farklı sonuç verir.

Madde 3. Doğru: D. Kullanıcı 18 yazsa bile değişkende "18" durur. Metinle sayı toplanamaz; toplama için önce int(yas) ile dönüştürmek gerekir.

  • A yanlış: Hata görünce değişkenin hiç değer almadığı düşünülebilir. Ama kullanıcı bir değer girdiyse değişken boş değildir; sorun değerin türü.
  • B yanlış: Mesajın girilen sayıyla birleştiği sanılabilir. Ama parantez içindeki mesaj yalnızca ekranda görünür; dönen değerin türünü değiştirmez.
  • C yanlış: Sonucun metin olduğunu duyan öğrenci bunu “yalnızca harf alır” diye anlayabilir. Ama input() rakam da kabul eder; yalnızca sonucu metin olarak verir.
  • E yanlış: Sayaçların çoğu zaman += 1 ile artırıldığını gören öğrenciye akla yatkın gelir. Ama += 1 da aynı hatayı verir; yazım biçimi türü değiştirmez.

Madde 4. Doğru: A. // tam bölüm sonucunu, % kalanı verir: 17 = 5 × 3 + 2.

  • B yanlış: 3.4 yukarı yuvarlanmış gibi düşünülür. Ama 5 × 4 = 20 olur ve 17’yi aşar; // aşağı yuvarlar, bölüm 3 olur.
  • C yanlış: İki işaretin görevi karıştırılmış. // bölümü, % kalanı verir; bölüm 3, kalan 2’dir.
  • D yanlış: 17 / 5 sonucu 3.4 olduğu için // da aynı sonucu verir sanılır. Ama // bölümün ondalık kısmını atar ve 3 verir.
  • E yanlış: % işareti yüzdeyi andırdığı için ondalık bir sonuç verir sanılabilir. Ama % kalanı verir: 17 % 5 sonucu 2’dir.

Madde 5. Doğru: C. Python 3’te / normal bölmedir ve sonucu daima floattur. Tam sayı sonucu için // kullanılır.

  • A yanlış: Fark ekranda göründüğü için sorun yazdırmada aranır. Ama print(10 // 5) çıktısı 2’dir; belirleyici olan gösterim değil, değerin türüdür.
  • B yanlış: 0.1 + 0.2 örneği akla geldiği için sondaki .0 bir yuvarlama izi sanılabilir. Ama sonuç tam 2’dir; .0 yalnızca değerin float olduğunu gösterir.
  • D yanlış: Bölmede sayıların sırası önemli olduğu için büyüklük ilişkisi bir neden gibi görünebilir. Ama sonucun türüyle ilgisi yoktur; 5 / 10 da float verir.
  • E yanlış: Sonuç float olduğu için bölünen sayıların da float olduğu sanılır. Ama 10 ve 5 noktasız yazılmış int değerlerdir; float olan yalnızca bölmenin sonucudur.

Madde 6. Doğru: B. 20 >= 18 zaten Truedur; and iki taraf da doğru olduğunda True verir.

  • A yanlış: Sonuç ne sayı ne metin olduğu için “değersiz” anlamında None akla gelebilir. Ama bu ifade True ya da False verir; None çıkmaz.
  • C yanlış: İfadedeki ilk değer 20 olduğu için sonucun o sayı olduğu sanılabilir. Ama karşılaştırma sayı değil, bool bir değer verir.
  • D yanlış: and iki koşulu birden istediği için sonucu zorlaştırıyormuş gibi görünür. Ama burada iki taraf da doğru; bu durumda and sonucu True olur.
  • E yanlış: Bir karşılaştırma ile True farklı şeyler gibi göründüğü için birleşemeyecekleri sanılır. Ama 20 >= 18 ifadesinin sonucu zaten bir bool; and iki bool değeri sorunsuz birleştirir.

Madde 7. Doğru: D. = sağdaki değeri soldaki ada bağlar. == iki değerin eşit olup olmadığını sınar ve True ya da False verir. Koşullarda kullanılması gereken ==dir.

  • A yanlış: Matematikte eşitlik tek = ile yazıldığı için ikisinin aynı işi yaptığı sanılabilir. Ama = sınamaz, atar. if x = 5: yazımı hata verir.
  • B yanlış: == en sık if satırlarında göründüğü için akla gelir. Ama iki işaret kullanım yeriyle değil, yaptıkları işle ayrılır; esit = x == 5 satırında ikisi birlikte bulunur.
  • C yanlış: İki işaretin ayrı işleri olduğunu bilen ama hangisinin hangisi olduğunu karıştıran öğrenci bunu seçer. Görevler ters yazılmış.
  • E yanlış: İki işaretin farklı yerlerde kullanıldığını fark eden öğrenci ayrımı türe bağlayabilir. Ama türle ilgisi yoktur; ikisi de her türle çalışır ve farklı işler yapar.

Madde 8. Doğru: A. İlk satır print adını 5 sayısına bağladı. Python yerleşik adlara atama yapmanızı engellemez; atama yapılırsa asıl fonksiyon gölgelenir. İkinci satır bir sayıyı fonksiyon gibi çağırmaya çalıştığı için hata verir.

  • B yanlış: print her programda göründüğü ve düzenleyicide renkli yazıldığı için anahtar sözcük sanılır. Ama print yerleşik bir addır; atama söz dizimi hatası vermez, hata ikinci satırda çıkar.
  • C yanlış: Sayıyla metnin toplanamadığını öğrenen öğrenci aynı hatayı burada arar. Ama burada sayıyla metin birleştirilmiyor; hata print adının artık sayı olmasından çıkıyor.
  • D yanlış: Hata ikinci satırda bildirildiği için sorun o satırın yazımında aranır. Ama tırnaklar doğru; sorun ilk satırdaki atamadır.
  • E yanlış: Yerleşik bir fonksiyonun bozulamayacağı düşünülebilir. Ama böyle bir geri alma yoktur; ad, yeniden atanana ya da program bitene kadar sayı kalır.

Madde 9. Doğru: E. Ondalık sayıların ikilik tabanda tam karşılığı olmayabilir. Bu Python’a özgü bir kusur değil; bilgisayarlar float sayıları böyle saklar. Kodda hata yoktur, bu beklenen davranıştır.

  • A yanlış: Beklenmedik bir sonuç görünce ilk şüphe kodun yazımına gider. Ama yazımda sorun yok; fark değerlerin saklanma biçiminden geliyor.
  • B yanlış: Tuhaf çıktıların nedeni çoğu zaman metin birleştirme olduğu için akla gelir. Ama metin toplansaydı sonuç 0.10.2 gibi birleşmiş bir metin olurdu.
  • C yanlış: Fazla basamaklar ekranda göründüğü için sorun yazdırmada aranır. Ama print() yalnızca değeri gösterir, değeri değiştirmez. Aynı fark 0.1 + 0.2 == 0.3 karşılaştırmasının False vermesinde de görülür.
  • D yanlış: Sonuç matematikte bildiğimiz 0.3 olmadığı için Python’ın yanlış hesapladığı sanılır. Ama aynı davranış öteki dillerde de görülür; güncelleme bunu değiştirmez.

Tek sayfa özet

Bu hafta programlarımız yalnızca sabit metin yazdırmakla kalmadı; veri tutmaya ve hesap yapmaya başladı.

  • Ekranda aynı görünen "25" ile 25 farklı türdedir. Değerle hangi işlemin yapılacağını tür belirler.
  • Değişken, bir değere verdiğimiz addır. Gezi programındaki katılımcı sayısı, kira ve kişi başı ücret birer değişkendir.
  • Atama sırasında sağ taraf hesaplanır ve sonuç sol taraftaki değişken adına bağlanır. Sonradan değişen bir değer, ondan önce hesaplanmış sonucu kendiliğinden güncellemez.
  • 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 fonksiyonları gölgeler.
  • Python 3 Türkçe harfli adlara izin verse de bu derste adlarda çoğunlukla ASCII harfler kullanacağız; böylece ı ile i gibi harfler karışmaz ve kod her klavyede kolayca yazılır.
  • int, float, str ve bool farklı veri türleridir.
  • / ile bölmenin sonucu, bölme kalansız olsa bile floattur.
  • 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.
  • 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 da float() ile tür dönüşümü yapmak gerekir. Dönüşüm unutulursa "5" * 3 hata vermeden "555" olur. Rakam olmayan bir metin dönüştürülürse ValueError çıkar.
  • Aritmetik bir ifade hesaplanıp tek bir değere iner; işlem önceliği sonucu etkiler.
  • // bölümün tam sayı kısmını, % kalanı verir: 105 kişi 45’lik otobüslere 2 dolu otobüs ve 15 kişi olarak dağılır.
  • Karşılaştırmanın sonucu True ya da False olur.
  • and ve or mantıksal sonuçları birleştirir, not sonucu 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ı açıklar ve değişkenin o anki değerini izler.
  • int, float, str ve bool türlerini birbirinden ayırt eder.
  • 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 / False sonucunu belirler.
  • = ile == işaretlerini ayırt eder ve yerleşik adları gölgelemenin sonucunu açıklar.
  • float değerlerin yaklaşık tutulmasının çıktıdaki etkisini yorumlar.
Back to top