11 Problemler: Tipler, İşlemler ve Koşullar
Bir programlama dilini öğrenmenin en etkili yollarından biri, kısa kodları çalıştırmadan okuyup ne yapacaklarını tahmin etmektir. Bu bölümdeki her problem bir kod parçası verir ve onun çıktısını sorar. Çözümler kodu satır satır izler, her adımda değişkenlerin değerlerini ve tiplerini yazar.
Problemler Değişkenler, Veri Tipleri ve Atama, Aritmetik İşlemler ve math Modülü, Girdi ve Çıktı İşlemleri ve Karşılaştırma, Mantık Operatörleri ve Koşullu İfadeler bölümlerinin konularını kapsar; son kısımda kısa for döngüleri de yer alır. Her problemi önce kâğıt üzerinde çözün, sonra çözümü açın ve kodu çalıştırarak sonucunuzu doğrulayın.
11.1 Tipler ve Dönüşümler
Bu kısımdaki problemlerde aynı görünen değerlerin metin mi sayı mı olduğuna dikkat edin.
Alıştırma 11.1 (Rakam İçeren Metinler) Aşağıdaki programın çıktısını bulunuz.
a = "3"
b = "5"
print(type(a))
print(a + b)
print(3 * b)
print(3 * int(b))
print(a + b + "2")Çözüm
a ve b tırnak içinde yazıldığı için birer metindir; tipleri str’dir.
a + b: iki metin birleştirilir:"35".3 * b: bir metin bir tam sayıyla çarpıldığında üç kez yan yana yazılır:"555".3 * int(b):int(b)\(5\) sayısıdır; \(3 \cdot 5 = 15\).a + b + "2": üç metin soldan sağa birleştirilir:"352".
<class 'str'>
35
555
15
352
\(\blacksquare\)
Alıştırma 11.2 (Metinleri Sayıya Çevirmek) Aşağıdaki programın çıktısını bulunuz.
a = "3"
b = "5"
print(int(a) + int(b))
print(int(a) + int(b) + 2)
print(float(a) + float(b))
x = str(3)
y = str(5)
print(x + y)Çözüm
int(a) ve int(b) metinleri \(3\) ve \(5\) tam sayılarına çevirir; toplamları \(8\), bir fazlası \(2\) eklenince \(10\) olur. float ile çevrilen sayıların toplamı ondalıklı olarak 8.0 yazılır. Son iki satırda ise ters yönde bir dönüşüm vardır: str(3) ve str(5) sayıları metne çevirir ve x + y birleştirme yapar: "35".
8
10
8.0
35
\(\blacksquare\)
Alıştırma 11.3 (Metinlerin Mantıksal Değeri) Aşağıdaki programın çıktısını bulunuz.
a = "3"
print(bool(a))
print(bool("0"))
print(bool(0))
print(bool(""))Çözüm
bool bir metni yalnız boşsa False’a çevirir. "3" ve "0" boş olmayan metinlerdir; içlerindeki rakamın ne olduğu önemli değildir, ikisi de True verir. 0 sayısı ise False’tur; boş metin "" de False’tur.
True
True
False
False
\(\blacksquare\)
Alıştırma 11.4 (Kesme ve Toplama) Aşağıdaki programın çıktısını bulunuz.
x = float(3)
y = int(5.7)
z = x + y
print(z)
print(int(2.9))Çözüm
x \(3{,}0\) olur. int(5.7) ondalık kısmı atar, yuvarlamaz: y \(5\)’tir. Bir float ile bir int toplandığında sonuç float olur: \(3{,}0 + 5 = 8{,}0\). int(2.9) de aynı nedenle \(3\) değil \(2\)’dir.
8.0
2
\(\blacksquare\)
Alıştırma 11.5 (Parantez İçinde Tip Adı) Aşağıdaki programın çıktısını bulunuz.
a = (int)(3.5 + ((float)(5.0 / 2) * 3))
print(a)
b = int(3.1 + (float(5.0 / 2) * 3))
print(b)
c = int(3.1 + (float(5.2 / 2) * 3))
print(c)Çözüm
Birinci satırdaki (int) ve (float) yazımları C dilindeki tip dönüştürme yazımına benzer; Python’da ise yalnız gereksiz parantez içine alınmış int ve float fonksiyonlarıdır ve int(...), float(...) ile aynı işi yapar.
a: \(5{,}0/2 = 2{,}5\); \(2{,}5 \cdot 3 = 7{,}5\); \(3{,}5 + 7{,}5 = 11{,}0\);int\(11\) verir.b: \(3{,}1 + 7{,}5 = 10{,}6\);intondalık kısmı atar ve \(10\) verir.c: \(5{,}2/2 = 2{,}6\); \(2{,}6 \cdot 3 = 7{,}8\); \(3{,}1 + 7{,}8 = 10{,}9\);intyine \(10\) verir.
11
10
10
int sonucu yuvarlamadığı için \(10{,}9\) bile \(10\) olur. \(\blacksquare\)
Alıştırma 11.6 (Anahtar Kelime mi?) Aşağıdaki programın çıktısını bulunuz.
import keyword
print(keyword.iskeyword("not"))
print(keyword.iskeyword("lambda"))
print(keyword.iskeyword("print"))
print(keyword.iskeyword("True"))Çözüm
not ve lambda Python’ın anahtar kelimeleridir. print ise hazır bir fonksiyonun adıdır, anahtar kelime değildir; bu yüzden değişken adı olarak kullanılabilir (ama kullanılmamalıdır). True bir anahtar kelimedir; küçük harfle yazılmış true olsaydı anahtar kelime olmazdı.
True
True
False
True
\(\blacksquare\)
11.2 Yazdırma ve Biçimlendirme
Bu kısımda print’in değerleri nasıl ayırdığına ve biçimlendirmenin hangi değeri nereye yerleştirdiğine dikkat edin.
Alıştırma 11.7 (Tırnak İçinde Kalan Değişkenler) Aşağıdaki programın çıktısını bulunuz.
a = 5
b = 3
print("a, ile,b, nin toplamı:,a+b,dir.")
print(a, "ile", b, "nin toplamı:", a + b, "dir.")Çözüm
Birinci print’e tek bir metin verilmiştir; virgüller ve değişken adları metnin içindedir ve olduğu gibi yazılır. İkinci print’e ise altı ayrı değer verilmiştir: a, "ile", b, "nin toplamı:", a + b ve "dir.". Değişkenlerin değerleri hesaplanır ve değerler aralarında birer boşlukla yazılır.
a, ile,b, nin toplamı:,a+b,dir.
5 ile 3 nin toplamı: 8 dir.
\(\blacksquare\)
Alıştırma 11.8 (Aynı Cümle, Farklı Yazımlar) Aşağıdaki programın çıktısını bulunuz.
a = 5
b = 3
print(f"{a} ile {b} nin toplamı {a + b} dir.")
print("{} ile {} nin toplamı {} dir.".format(a, b, a + b))
print("{} ile {} nin toplamı {} dir.".format(b, a + b, a))
print("%d ile %d nin toplamı %d dir." % (a, b, a + b))
print("%d ile %d nin toplamı %f dir." % (a, b, a + b))Çözüm
İlk iki satır ve dördüncü satır aynı cümleyi üç farklı yolla yazar: 5 ile 3 nin toplamı 8 dir.. Üçüncü satırda format’a verilen değerlerin sırası değiştirilmiştir; {}’ler sırayla 3, 8 ve 5 ile dolar ve anlamsız bir cümle çıkar. Son satırda toplam %f ile yazılır; %f virgülden sonra altı basamak kullanır: 8.000000.
5 ile 3 nin toplamı 8 dir.
5 ile 3 nin toplamı 8 dir.
3 ile 8 nin toplamı 5 dir.
5 ile 3 nin toplamı 8 dir.
5 ile 3 nin toplamı 8.000000 dir.
\(\blacksquare\)
Alıştırma 11.9 (sep ile end) Aşağıdaki programın çıktısını bulunuz.
print("Python kullanmayı biliyor musun", end="?")
print()
print("Python kullanmayı biliyor musun", sep="&&")
print("Python", "kullanmayı", "biliyor", "musun", sep="&&")Çözüm
Birinci satır cümleyi yazar ve satır sonuna yeni satır yerine ? koyar; hemen ardından gelen boş print() satırı bitirir. Üçüncü satırda print’e tek bir değer verildiği için ayırıcıya hiç gerek kalmaz; sep="&&" etkisizdir. Son satırda dört değer vardır ve aralarına && konur.
Python kullanmayı biliyor musun?
Python kullanmayı biliyor musun
Python&&kullanmayı&&biliyor&&musun
\(\blacksquare\)
Alıştırma 11.10 (Virgül ve Kaçış Karakterleri) Aşağıdaki programın çıktısını bulunuz. İkinci ve üçüncü satırların başında neden bir boşluk görünür?
a1 = "Matematik"
a2 = "İstatistik"
print(a1, a2)
print(a1 + a2)
print(a1, "\n", a2)
print(a1, "\\", a2)Çözüm
print(a1, a2) iki metni aralarına bir boşluk koyarak yazar; a1 + a2 ise boşluksuz birleştirir. Üçüncü print’e üç değer verilmiştir: a1, yeni satır karakteri "\n" ve a2. print her değerin arasına bir boşluk koyar; bu yüzden Matematik’ten sonra bir boşluk ve yeni satır, yeni satırdan sonra da bir boşluk ve İstatistik gelir. İstatistik’in önündeki boşluk bu ikinci boşluktur. Son satırda "\\" tek bir ters eğik çizgi yazar.
Matematik İstatistik
Matematikİstatistik
Matematik
İstatistik
Matematik \ İstatistik
Satır başındaki boşluk istenmiyorsa print(a1 + "\n" + a2) ya da print(a1, a2, sep="\n") yazılır. \(\blacksquare\)
11.3 Atama ve Aritmetik
Bu kısımda her atamadan sonra değişkenlerin değerlerini ve tiplerini yazarak ilerleyin.
Alıştırma 11.11 (Negatif Sayı ve Yuvarlama) Aşağıdaki programın çıktısını bulunuz.
a1 = 3 - (-5)
a2 = 3.2 + (-5)
print("a1:", a1)
print("a2:", a2)
print("a2:", round(a2, 2))Çözüm
\(3 - (-5) = 8\)’dir. \(3{,}2 + (-5) = -1{,}8\) olmalıdır; ama \(3{,}2\) ikilik tabanda tam olarak saklanamadığından sonuç \(-1{,}7999999999999998\) olarak yazılır. round(a2, 2) bu küçük farkı yuvarlayarak \(-1{,}8\) verir.
a1: 8
a2: -1.7999999999999998
a2: -1.8
\(\blacksquare\)
Alıştırma 11.12 (Zincir Atama ve Birleşik Atama) Aşağıdaki programın çıktısını bulunuz.
z = y = 21
z *= 5
y /= z
print("z =", z)
print("y =", y)Çözüm
İlk satır z’ye ve y’ye \(21\) değerini verir. z *= 5 \(z = 105\) yapar; y değişmez. y /= z \(y = 21/105 = 0{,}2\) yapar; bölme / ile yapıldığı için sonuç float’tur.
z = 105
y = 0.2
\(\blacksquare\)
Alıştırma 11.13 (Atamaları İzlemek) Aşağıdaki programın çıktısını bulunuz.
i, j = 18, 2
i /= j
j *= i
j = i + 1
i = j - 1
print("i:", i)
print("j:", j)Çözüm
Satır satır:
i, j = 18, 2: \(i = 18\), \(j = 2\).i /= j: \(i = 9{,}0\) (float).j *= i: \(j = 2 \cdot 9{,}0 = 18{,}0\).j = i + 1: \(j = 10{,}0\); önceki \(18{,}0\) değeri kaybolur.i = j - 1: \(i = 9{,}0\).
i: 9.0
j: 10.0
\(\blacksquare\)
Alıştırma 11.14 (Uzun Bir İfade) Aşağıdaki programın çıktısını bulunuz.
c1 = 5 - 6 / 3 * 2 - 9 / 3 / 3 - 5 + 7 * 6 / 3
print("c1:", c1)Çözüm
Çarpma ve bölmeler soldan sağa önce yapılır:
6 / 3 * 2: \(2{,}0 \cdot 2 = 4{,}0\).9 / 3 / 3: \(3{,}0/3 = 1{,}0\).7 * 6 / 3: \(42/3 = 14{,}0\).
İfade \(5 - 4{,}0 - 1{,}0 - 5 + 14{,}0\) olur ve soldan sağa \(9{,}0\) bulunur.
c1: 9.0
\(\blacksquare\)
Alıştırma 11.15 (Parantezler ve Üs) Aşağıdaki programın çıktısını bulunuz.
c2 = (6 + 2 * 4) / 2 - 3 ** 2 + (6 / 3) / (2 - 3)
print("c2:", c2)Çözüm
Parantezler önce hesaplanır: \(6 + 2 \cdot 4 = 14\), \(6/3 = 2{,}0\) ve \(2 - 3 = -1\). Üs alınır: \(3^2 = 9\). Bölmeler yapılır: \(14/2 = 7{,}0\) ve \(2{,}0/(-1) = -2{,}0\). Son olarak \(7{,}0 - 9 + (-2{,}0) = -4{,}0\) bulunur.
c2: -4.0
\(\blacksquare\)
Alıştırma 11.16 (Kesirli Üs) Aşağıdaki programın çıktısını bulunuz.
a = 36
z = -(5 * (a ** (3 / 2)) / 4)
print("z:", z)Çözüm
\(3/2 = 1{,}5\) ve \(36^{1{,}5} = 36 \cdot \sqrt{36} = 36 \cdot 6 = 216\)’dır; kesirli üs sonucu float verir: \(216{,}0\). Sonra \(5 \cdot 216{,}0 = 1080{,}0\), \(1080{,}0/4 = 270{,}0\) ve dıştaki eksi işaretiyle \(z = -270{,}0\) olur.
z: -270.0
\(\blacksquare\)
Alıştırma 11.17 (Negatif Sayının Kalanı) Aşağıdaki programın çıktısını bulunuz.
Y = -4 * 16 % 4 + 2 ** (2 * 2 + 2)
print("Y:", Y)
print(16 % 4, 4 % 16)Çözüm
Parantez içi \(6\), üs \(2^6 = 64\)’tür. Eksi işareti -4’e aittir; * ve % soldan sağa yapılır: \(-4 \cdot 16 = -64\) ve \(-64 = (-16) \cdot 4 + 0\) olduğundan \(-64 \bmod 4 = 0\). Böylece \(Y = 0 + 64 = 64\) olur. İkinci satırda \(16 \bmod 4 = 0\); \(4 \bmod 16 = 4\)’tür, çünkü \(4 = 0 \cdot 16 + 4\).
Y: 64
0 4
\(\blacksquare\)
11.4 Mantık ve Koşullar
Bu kısımda koşulların doğru mu yanlış mı olduğunu belirleyip hangi kolun çalıştığını izleyin.
Alıştırma 11.18 (Bir Mantık İfadesi) Aşağıdaki programın çıktısını bulunuz.
print((2 ** 2 == 4 and False) or (not (16 < 15 and True)))Çözüm
Soldaki parantezde \(2^2 = 4\) olduğundan 2 ** 2 == 4 True’dur; True and False False olur. Sağdaki parantezde 16 < 15 False’tur; False and True False olur ve not onu True’ya çevirir. Sonuç False or True, yani True’dur.
True
\(\blacksquare\)
Alıştırma 11.19 (is Operatörü) Aşağıdaki programın çıktısını bulunuz.
x = False
y = True
print(y)
print(x is y)
print(y is y)
print(x == (not y))Çözüm
is iki adın bellekteki aynı nesneyi gösterip göstermediğini sorar. Python’da yalnız bir tane True ve bir tane False nesnesi vardır. x is y False is True sorusudur ve yanlıştır; y is y doğrudur. Son satırda not y False’tur ve x == False doğrudur.
True
False
True
True
Sayıları ve metinleri karşılaştırırken is değil == kullanılmalıdır: iki eşit değer bellekte farklı nesneler olabilir. is’in güvenle kullanıldığı başlıca yer None ile karşılaştırmadır. \(\blacksquare\)
Alıştırma 11.20 (Bir if İçinde Takas) Aşağıdaki programın çıktısını bulunuz.
a = 5
b = 9
c = 0
if a < b:
c = a
a = b
b = c
print(a, b, sep=",")Çözüm
\(5 < 9\) doğru olduğundan blok çalışır. c = a \(c = 5\) yapar ve a’nın eski değerini saklar; a = b \(a = 9\) yapar; b = c \(b = 5\) yapar. Bu, üçüncü bir değişkenle yapılan bir takastır; a ile b yer değiştirmiştir.
9,5
\(\blacksquare\)
Alıştırma 11.21 (Koşul Bloğunda Ardışık Hesap) Aşağıdaki programın çıktısını bulunuz.
a = 5
b = 9
c = 3
if a < b:
c = a + c * b
a = b - a + c
b = c
print("a:", a)
print("b:", b)
print("c:", c)Çözüm
Koşul doğrudur. Her satır, önceki satırların değiştirdiği değerleri kullanır:
c = a + c * b: \(c = 5 + 3 \cdot 9 = 32\).a = b - a + c: \(a = 9 - 5 + 32 = 36\); buradac’nin yeni değeri \(32\) kullanılır.b = c: \(b = 32\).
a: 36
b: 32
c: 32
\(\blacksquare\)
Alıştırma 11.22 (Bağımsız ve İç İçe Koşullar) Aşağıdaki programın çıktısını bulunuz.
a, b, c = 2, 7, 6
if a + b > c:
print(a + b + c)
if a + c > b:
print(a - b + c)
if a - b + c > 5:
print("sonuç doğru")
else:
print("hatalı sonuç")Çözüm
İki dış if birbirinden bağımsızdır; ikisi de ayrı ayrı denetlenir. \(2 + 7 = 9 > 6\) olduğundan \(2 + 7 + 6 = 15\) yazılır. \(2 + 6 = 8 > 7\) olduğundan ikinci blok da çalışır ve \(2 - 7 + 6 = 1\) yazılır. İçteki koşul \(1 > 5\) yanlış olduğundan else kolu çalışır.
15
1
hatalı sonuç
\(\blacksquare\)
Alıştırma 11.23 (Bir Hesabın Büyüklüğüne Göre Karar) Aşağıdaki programın çıktısını bulunuz.
x, y, z = 12, 5, 8
kontrol = (x * y) + (y * z) - (x // z)
print(f"Kontrol değeri: {kontrol}")
if kontrol > 50:
print("Büyük değer elde edildi!")
elif kontrol > 25:
print("Orta değer elde edildi.")
else:
print("Küçük değer elde edildi.")
print("Program sona erdi.")Çözüm
\(x \cdot y = 60\), \(y \cdot z = 40\) ve \(12 \,//\, 8 = 1\)’dir; kontrol \(60 + 40 - 1 = 99\) olur. \(99 > 50\) olduğundan ilk kol çalışır ve geri kalan koşullara bakılmaz. Son satır koşulların dışındadır ve her durumda çalışır.
Kontrol değeri: 99
Büyük değer elde edildi!
Program sona erdi.
\(\blacksquare\)
Alıştırma 11.24 (İşaret Değiştirip Hesaplamak) Aşağıdaki programın çıktısını bulunuz.
X = -3
if X != 3:
X = -X
X = 2 * X + 1
print(X)Çözüm
\(-3 \neq 3\) doğru olduğundan blok çalışır ve \(X = 3\) olur. Son atama if bloğunun dışındadır ve her durumda çalışır: \(X = 2 \cdot 3 + 1 = 7\).
7
\(\blacksquare\)
11.5 Döngülerle Kısa Sorular
Bu kısımdaki döngülerde her yinelemede döngü değişkeninin değerini yazarak ilerleyin.
Alıştırma 11.25 (Her Harfe Bir e) Aşağıdaki programın çıktısını bulunuz.
for i in "zeynep":
a = i + "e"
print(a)Çözüm
Döngü “zeynep” metninin harflerini sırayla alır: z, e, y, n, e, p. Her harfin sonuna "e" eklenip yazılır: ze, ee, ye, ne, ee, pe.
ze
ee
ye
ne
ee
pe
\(\blacksquare\)
Alıştırma 11.26 (Yalnız Bir Harfi Atlamak) Aşağıdaki programın çıktısını bulunuz.
for i in "zeynep":
if i == "e":
continue
print(i)Çözüm
e harfine gelindiğinde continue o yinelemenin geri kalanını, yani print’i atlar. İki e atlanır; z, y, n ve p yazılır.
z
y
n
p
\(\blacksquare\)
Alıştırma 11.27 (Döngü Değişkenine Atama) Aşağıdaki programın çıktısını bulunuz.
for i in "zeynep":
if i == "e" or i == "y":
i = "yok"
else:
i = "ne"
print(i)Çözüm
Döngünün içinde i’ye yeni bir değer atanabilir; bu yalnız o yinelemeyi etkiler, bir sonraki yinelemede i yine metnin sıradaki harfini alır. Harf e ya da y ise yok, değilse ne yazılır: z → ne, e → yok, y → yok, n → ne, e → yok, p → ne.
ne
yok
yok
ne
yok
ne
\(\blacksquare\)
Alıştırma 11.28 (Tek Numaralı Sıra) Aşağıdaki programın çıktısını bulunuz.
isimler = ["Ali", "Ayşe", "Mehmet"]
for indeks, isim in enumerate(isimler):
indeks = 2 * indeks + 1
print(indeks, isim)Çözüm
enumerate indeksleri \(0\), \(1\), \(2\) olarak verir. Her yinelemede indeks \(2 \cdot \text{indeks} + 1\) değeriyle değiştirilir: \(1\), \(3\), \(5\). Bu değişiklik enumerate’in bir sonraki indeksi etkilemez.
1 Ali
3 Ayşe
5 Mehmet
\(\blacksquare\)
Alıştırma 11.29 (2, 3 ve 7’ye Bölünenler) Aşağıdaki program \(1\) ile \(100\) arasında \(2\)’ye, \(3\)’e ve \(7\)’ye bölünebilen sayıları bulur. Çıktısını bulunuz.
cozum = []
for i in range(1, 101):
if i % 2 == 0 and i % 3 == 0 and i % 7 == 0:
cozum.append(i)
print(cozum)Çözüm
Bir sayı \(2\)’ye, \(3\)’e ve \(7\)’ye bölünüyorsa, bu sayılar aralarında asal olduğu için \(2 \cdot 3 \cdot 7 = 42\)’ye bölünür. \(100\)’e kadar \(42\)’nin katları \(42\) ve \(84\)’tür.
[42, 84]
\(\blacksquare\)
Alıştırma 11.30 (and ile or Bir Arada) Aşağıdaki programın çıktısını bulunuz.
cozum = []
for i in range(1, 81):
if i % 2 == 0 and i % 3 == 0 or i % 7 == 0:
cozum.append(i)
print(cozum)Çözüm
and, or’dan önce uygulanır; koşul (i % 2 == 0 and i % 3 == 0) or i % 7 == 0 olarak okunur. Bir sayı ya \(6\)’ya bölünüyorsa ya da \(7\)’ye bölünüyorsa listeye girer. \(80\)’e kadar \(6\)’nın katları \(6, 12, \ldots, 78\) (\(13\) sayı), \(7\)’nin katları \(7, 14, \ldots, 77\) (\(11\) sayı) ve ikisinin ortak katı \(42\)’dir; liste \(13 + 11 - 1 = 23\) sayı içerir ve sayılar küçükten büyüğe sıralıdır.
[6, 7, 12, 14, 18, 21, 24, 28, 30, 35, 36, 42, 48, 49, 54, 56, 60, 63, 66, 70, 72, 77, 78]
Koşul i % 2 == 0 and (i % 3 == 0 or i % 7 == 0) diye parantezlenseydi yalnız çift sayılar alınırdı; örneğin \(7\) ve \(21\) listeye girmezdi. \(\blacksquare\)
Bir sonraki bölüm Problemler: Listeler, Döngüler ve Demetler, aynı yöntemle listeler, liste üreteçleri, while döngüleri ve demetler üzerine problemler içeriyor.