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.

Python
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".
Çıktı
<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.

Python
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".

Çıktı
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.

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

Çıktı
True
True
False
False

\(\blacksquare\)

Alıştırma 11.4 (Kesme ve Toplama) Aşağıdaki programın çıktısını bulunuz.

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

Çıktı
8.0
2

\(\blacksquare\)

Alıştırma 11.5 (Parantez İçinde Tip Adı) Aşağıdaki programın çıktısını bulunuz.

Python
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\); int ondalı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\); int yine \(10\) verir.
Çıktı
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.

Python
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ı.

Çıktı
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.

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

Çıktı
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.

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

Çıktı
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.

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

Çıktı
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?

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

Çıktı
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.

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

Çıktı
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.

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

Çıktı
z = 105
y = 0.2

\(\blacksquare\)

Alıştırma 11.13 (Atamaları İzlemek) Aşağıdaki programın çıktısını bulunuz.

Python
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\).
Çıktı
i: 9.0
j: 10.0

\(\blacksquare\)

Alıştırma 11.14 (Uzun Bir İfade) Aşağıdaki programın çıktısını bulunuz.

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

Çıktı
c1: 9.0

\(\blacksquare\)

Alıştırma 11.15 (Parantezler ve Üs) Aşağıdaki programın çıktısını bulunuz.

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

Çıktı
c2: -4.0

\(\blacksquare\)

Alıştırma 11.16 (Kesirli Üs) Aşağıdaki programın çıktısını bulunuz.

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

Çıktı
z: -270.0

\(\blacksquare\)

Alıştırma 11.17 (Negatif Sayının Kalanı) Aşağıdaki programın çıktısını bulunuz.

Python
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\).

Çıktı
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.

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

Çıktı
True

\(\blacksquare\)

Alıştırma 11.19 (is Operatörü) Aşağıdaki programın çıktısını bulunuz.

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

Çıktı
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.

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

Çıktı
9,5

\(\blacksquare\)

Alıştırma 11.21 (Koşul Bloğunda Ardışık Hesap) Aşağıdaki programın çıktısını bulunuz.

Python
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\); burada c’nin yeni değeri \(32\) kullanılır.
  • b = c: \(b = 32\).
Çıktı
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.

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

Çıktı
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.

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

Çıktı
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.

Python
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\).

Çıktı
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.

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

Çıktı
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.

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

Çıktı
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.

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

Çıktı
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.

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

Çıktı
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.

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

Çıktı
[42, 84]

\(\blacksquare\)

Alıştırma 11.30 (and ile or Bir Arada) Aşağıdaki programın çıktısını bulunuz.

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

Çıktı
[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.