Alıştırma Sorularının Cevapları

  1. Fahrenheit derece cinsinden 0, 10, 20, ... , 100 şeklinde verilen sıcaklıkları santigrat dereceye dönüştürerek bir tablo halinde ekrana yazdıran bir program yazınız.
In [8]:
# for dongusuyle sorunun cozumu
baslangic = 0
son = 101
adim = 10
print('    F      C     ')
print('--------------------')
for F in range(baslangic, son, adim):
    C = (F - 32)*5/9
    print("{:5d} {:8.2f}".format(F, C))
    F      C     
--------------------
    0   -17.78
   10   -12.22
   20    -6.67
   30    -1.11
   40     4.44
   50    10.00
   60    15.56
   70    21.11
   80    26.67
   90    32.22
  100    37.78
In [11]:
# while dongusuyle ayni sorunun cozumu
baslangic = 0
son = 101
adim = 10
F = baslangic
print('    F      C     ')
print('--------------------')
while F < son:
    C = (F - 32)*5/9
    print("{:5d} {:8.2f}".format(F, C))
    F += adim
    F      C     
--------------------
    0   -17.78
   10   -12.22
   20    -6.67
   30    -1.11
   40     4.44
   50    10.00
   60    15.56
   70    21.11
   80    26.67
   90    32.22
  100    37.78
In [1]:
# Oncelikle liste olusturarak sorunun cozumu
# fazladan 2 dongu daha kullanildigina dikkat ediniz
baslangic = 0
son = 101
adim = 10
F = [f for f in range(baslangic, son, adim)]
C = [(f - 32)*5/9 for f in F]
for f in F:
    c = (f - 32)*5/9
    print("{:5d} {:8.2f}".format(f, c))
    0   -17.78
   10   -12.22
   20    -6.67
   30    -1.11
   40     4.44
   50    10.00
   60    15.56
   70    21.11
   80    26.67
   90    32.22
  100    37.78
  1. Fahrenheit dereceyi santigrat dereceye hızlı dönüştürmek için C = (F - 30) / 2 formülü sıklıkla kullanılır. Standart Fahrenheit - Santigrat derece dönüşüm formülünün yanı sıra bu formülü de kullanarak Fahrenheit derece cinsinden 0, 10, 20, ... , 100 şeklinde verilen sıcaklıkları santigrat dereceye dönüştürerek üç sütunlu (birinci sütun F$^{\circ}$, ikinci ve üçüncü sütun iki ayrı fomülle hesaplanmış C$^{\circ}$) içerecek şekilde) bir tablo halinde ekrana yazdıran bir program yazınız.
In [3]:
# for dongusuyle cozum
# while dongusuyle cozumu kendiniz deneyiniz
baslangic = 0
son = 101
adim = 10
print('    F      C        C2')
print('--------------------------------')
for F in range(baslangic, son, adim):
    C = (F - 32)*5/9
    C2 = (F - 30) / 2
    print("{:5d} {:8.2f} {:8.2f}".format(F, C, C2))
    F      C        C2
--------------------------------
    0   -17.78   -15.00
   10   -12.22   -10.00
   20    -6.67    -5.00
   30    -1.11     0.00
   40     4.44     5.00
   50    10.00    10.00
   60    15.56    15.00
   70    21.11    20.00
   80    26.67    25.00
   90    32.22    30.00
  100    37.78    35.00
  1. 20'den küçük tüm asal sayıları (2, 3, 5, ... , 19) bir liste oluşturup, bir for döngüsü içerisinde bu listenin elemanlarını sırayla ekrana yazdıran bir program yazınız.
In [25]:
# index uzerinden tarama
asalsayilar = [2, 3, 5, 7, 11, 13, 17, 19]
for i in range(len(asalsayilar)):
    print(asalsayilar[i])
2
3
5
7
11
13
17
19
In [5]:
# eleman uzerinden tarama (daha Pythonic)
asalsayilar = [2, 3, 5, 7, 11, 13, 17, 19]
for asal in asalsayilar:
    print(asal)
2
3
5
7
11
13
17
19
  1. 1'den n = 100'e kadar tam sayıları bir listeye aldıktan sonra, bu listedeki her bir sayı için o sayıya (n) kadarki tüm sayıların toplamını Gauss'un meşhur $n*n(+1) / 2$ formülüyle hesaplayan ve yeni bir listeye yazdıran bir program yazınız.
In [8]:
sayilar = list(range(1,101))
toplamlar = []
for n in sayilar:
    toplamlar.append(n*(n + 1)/2)
print(sayilar)
print(toplamlar)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
[1.0, 3.0, 6.0, 10.0, 15.0, 21.0, 28.0, 36.0, 45.0, 55.0, 66.0, 78.0, 91.0, 105.0, 120.0, 136.0, 153.0, 171.0, 190.0, 210.0, 231.0, 253.0, 276.0, 300.0, 325.0, 351.0, 378.0, 406.0, 435.0, 465.0, 496.0, 528.0, 561.0, 595.0, 630.0, 666.0, 703.0, 741.0, 780.0, 820.0, 861.0, 903.0, 946.0, 990.0, 1035.0, 1081.0, 1128.0, 1176.0, 1225.0, 1275.0, 1326.0, 1378.0, 1431.0, 1485.0, 1540.0, 1596.0, 1653.0, 1711.0, 1770.0, 1830.0, 1891.0, 1953.0, 2016.0, 2080.0, 2145.0, 2211.0, 2278.0, 2346.0, 2415.0, 2485.0, 2556.0, 2628.0, 2701.0, 2775.0, 2850.0, 2926.0, 3003.0, 3081.0, 3160.0, 3240.0, 3321.0, 3403.0, 3486.0, 3570.0, 3655.0, 3741.0, 3828.0, 3916.0, 4005.0, 4095.0, 4186.0, 4278.0, 4371.0, 4465.0, 4560.0, 4656.0, 4753.0, 4851.0, 4950.0, 5050.0]
In [11]:
# toplamlari daha hizli elde etmek icin 
# list comprehensions kullanabiliriz
sayilar = list(range(1,101))
toplamlar = [n*(n + 1)/2 for n in sayilar]
print(sayilar)
print(toplamlar)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
[1.0, 3.0, 6.0, 10.0, 15.0, 21.0, 28.0, 36.0, 45.0, 55.0, 66.0, 78.0, 91.0, 105.0, 120.0, 136.0, 153.0, 171.0, 190.0, 210.0, 231.0, 253.0, 276.0, 300.0, 325.0, 351.0, 378.0, 406.0, 435.0, 465.0, 496.0, 528.0, 561.0, 595.0, 630.0, 666.0, 703.0, 741.0, 780.0, 820.0, 861.0, 903.0, 946.0, 990.0, 1035.0, 1081.0, 1128.0, 1176.0, 1225.0, 1275.0, 1326.0, 1378.0, 1431.0, 1485.0, 1540.0, 1596.0, 1653.0, 1711.0, 1770.0, 1830.0, 1891.0, 1953.0, 2016.0, 2080.0, 2145.0, 2211.0, 2278.0, 2346.0, 2415.0, 2485.0, 2556.0, 2628.0, 2701.0, 2775.0, 2850.0, 2926.0, 3003.0, 3081.0, 3160.0, 3240.0, 3321.0, 3403.0, 3486.0, 3570.0, 3655.0, 3741.0, 3828.0, 3916.0, 4005.0, 4095.0, 4186.0, 4278.0, 4371.0, 4465.0, 4560.0, 4656.0, 4753.0, 4851.0, 4950.0, 5050.0]
  1. x ekseni üzerinde herhangi a, b sayıları için $[a, b]$ kapalı aralığında, n+1 (n herhangi bir tamsayı olmak üzere) tane birbirinden eşit uzaklıkta koordinat içeren bir liste oluşturunuz. İpucu: Öncelikle boş bir liste oluşturup, a ile b arasında herhangi ardışık iki koordinatın arasının ne büyüklükte (h = (b - a) / n) olacağını hesapladıktan sonra bu listeyi bir for döngüsünün içinde doldurunuz.
In [12]:
# for dongusuyle cozum
a = 0; b = 100 # araligin uclari
n = 10 # aralik sayisi
h = (b - a) / n # aralik boyu
liste = []
for i in range(n+1):
    liste.append(a + i*h)
print(liste)
[0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0]
In [18]:
# lıst comprehensions cozumu
a = 0; b = 100 # araligin uclari
n = 10 # aralik sayisi
h = (b - a) / n # aralik boyu
liste = [a + i*h for i in range(n+1)]
print(liste)
[0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0]
In [15]:
# Aralik boyu bir float (kayan sayi)
# olacagindan adim olarak secilmemelidir
# range fonksiyonunda adim her zaman bir tamsayidir.
a = 0; b = 100 # araligin uclari
n = 10 # aralik sayisi
h = (b - a) / n # aralik boyu (float)
liste = []
for sayi in range(a, b, h):
    liste.append(sayi)
print(liste)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-787d56e1e406> in <module>()
      6 h = (b - a) / n # aralik boyu (float)
      7 liste = []
----> 8 for sayi in range(a, b, h):
      9     liste.append(sayi)
     10 print(liste)

TypeError: 'float' object cannot be interpreted as an integer
In [17]:
# soruda bu sekilde istenmemekle birlikte n+1 tane 
# 0.0 iceren bir liste olusturulup, her bir eleman
# dongu icinde degistirilebilir...
a = 0; b = 100 # araligin uclari
n = 10 # aralik sayisi
h = (b - a) / n # aralik boyu
liste = [0.0]*(n+1)  
for i in range(n+1):
    liste[i] = a + i*h
print(liste)
[0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0]
In [ ]:
# while dongusuyle cozum
a = 0; b = 100 # araligin uclari
n = 10 # aralik sayisi
h = (b - a) / n # aralik boyu
liste = []
# kosulu b'den cok az (10^-10) kucuk bir sayiya
# kadar seklinde tanimlamakta fayda vardir.
while a < b + 1e-10:
    liste.append(a)
    a += h
print(liste)
  1. $q = [["a", "b", "c"], ["d", "e", "f"], ["g", "h"]]$ listesinden $a$ harfini, $["d", "e", "f"]$ listesini, q listenin son elemanını ve $g$ harfini verebilecek ikişer ayrı indeksleme öneriniz.
In [2]:
q = [["a", "b", "c"], ["d", "e", "f"], ["g", "h"]]
print(q[0][0]) # a sayisi q listesinin 0. indeksteki elemaninin 0. indeksindedir
print(q[-3][-3]) # q listesnin sondan sayarsak -3 indeksindeki elemanin -3. indeksindedir
print(q[1]) # istenen listenin q listesindeki indeksi 1'dir
print(q[-2]) # ayni listeyi sondan sayarak -2. indekste de bulabilirsiniz
print(q[2]) # istenen liste q listesinin 2. indeksindedir
print(q[-1]) # istenen liste q listesinin son sirasindadir
print(q[2][0]) # g harfi 2. indeksteki listenin 0. indeksindedir
print(q[-1][-2]) # g harfi sondan sayarsaniz -1. indeksteki listenin sondan -2. indeksinde
a
a
['d', 'e', 'f']
['d', 'e', 'f']
['g', 'h']
['g', 'h']
g
g
  1. Altıncı (6.) soruda verilen q listesinin tüm harflerini sırayla (her satıra bir harf) ekrana yazdıran bir döngü (ipucu: içiçe döngü) yazınız.
In [3]:
for liste in q: # q listesindeki her bir listeyi alip liste degiskenine ata
    for harf in liste: # her liste degiskenindeki her bir harfi harf degiskenine ata
        print(harf) # her bir liste icin harf degiskenini sirayla ekrana getir
a
b
c
d
e
f
g
h

Ek Alıştırmalar:

  1. list comprehensions yapısıyla hızlı liste oluştururken öncelikle $for$ dongu yapisina bakilir, bu donguden sirayla herhangi bir nesneye alinan deger; for dongusunun sol tarafında yer alan işleme tabi tutulup, yeni oluşturulan listeye eklenir. Örneğin aşağıda for döngüsünde 0 ile 10 arasında (10 hariç) sayılar $range()$ fonksiyonu ile sırayla üretilip $i$ tamsayı nesnesine atanmakta, her bir sayıya bir eklenip; bu sayı da $a$ listesinin sonuna ilave edilmektedir. Sonuç doğal olarak 0 ile 10 arasındaki sayılara 1er eklenmiş sayılardan (1 ile 11 arasındaki sayılar, 11 hariç) oluşan bir listedir.
In [6]:
a = [i+1 for i in range(10)]
print(a)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Aynı amaca aşağıdaki klasik döngü yapısıyla da ulaşabilir. Yukarıdaki kısa yazımla aşağıdaki kod bloğu birbirine denktir.

In [7]:
a = []
for i in range(10):
    a.append(i+1)
print(a)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  1. Güneş Sistemi'ndeki gezegenlerden oluşan bir liste (gezegenler) tanımlayıp, bu listeyi tersine çeviriniz (tersliste adındaki bir listeye gezegenler listesindeki elemanları ters sırada alınız).
In [8]:
# Bunun en kolay yolu reversed fonksiyonunu kullanmaktir
gezegenler = ['merkur','venus','dunya','mars','jupiter','saturn',\
              'uranus','neptun']
# Ancak reversed bir liste uretmez, uretilen nesneyi list ile listeye cevirmeniz gerekir
tersgezegenler = list(reversed(gezegenler))
print(tersgezegenler)
['neptun', 'uranus', 'saturn', 'jupiter', 'mars', 'dunya', 'venus', 'merkur']
In [9]:
# Ikinci bir yontem klasik bir for dongusunu indeks ile tarayarak bos listeyi doldurmaktir
tersgezegenler = []
for i in range(1,len(gezegenler)+1):
    i *= -1
    tersgezegenler.append(gezegenler[i])
print(tersgezegenler)
['neptun', 'uranus', 'saturn', 'jupiter', 'mars', 'dunya', 'venus', 'merkur']
In [10]:
# Bunu gezegenler listesini ters yonde tarayarak da yapabilirsiniz
tersgezegenler = []
for i in range(len(gezegenler)-1, -1, -1):
    tersgezegenler.append(gezegenler[i])
print(tersgezegenler)
['neptun', 'uranus', 'saturn', 'jupiter', 'mars', 'dunya', 'venus', 'merkur']
In [11]:
# Bir baska cok basit yol ise liste dilimleri (slice) kullanmaktir
# Son elemandan baslayip (-1 indeks), 
# en bastaki elemana (varsayilan indeks oldugu icin vermeye gerek yoktur)
# -1 adimla (sola) dogru taramak istenen sonucu verecektir
tersgezegenler = gezegenler[-1::-1]
print(tersgezegenler)
['neptun', 'uranus', 'saturn', 'jupiter', 'mars', 'dunya', 'venus', 'merkur']
In [15]:
# Bir listenin tum icerigi iki farkli sekilde taranir:
print('-------------------')
print('1. elemanla tarama')
print('-------------------')
for gezegen in gezegenler:
    print(gezegen)
print('---------------')
print('2. indeksle tarama')
print('-------------------')
for indeks in range(len(gezegenler)):
    print(gezegenler[indeks])
-------------------
1. elemanla tarama
-------------------
merkur
venus
dunya
mars
jupiter
saturn
uranus
neptun
---------------
2. indeksle tarama
-------------------
merkur
venus
dunya
mars
jupiter
saturn
uranus
neptun

$enumerate()$ fonksiyonu kullanılarak her iki davranış birleştirilebilir. Böylece tarama sırasında hem her bir eleman, hem de o elemanın liste içinde bulundğu indeks elde edilmiş olur.

In [18]:
print('---------------')
print('enumerate')
print('-------------------')
for indeks,gezegen in enumerate(gezegenler):
    print('{:d} indeksindeki gezegen: {:s}'.format(indeks,gezegen))
---------------
enumerate
-------------------
0 indeksindeki gezegen: merkur
1 indeksindeki gezegen: venus
2 indeksindeki gezegen: dunya
3 indeksindeki gezegen: mars
4 indeksindeki gezegen: jupiter
5 indeksindeki gezegen: saturn
6 indeksindeki gezegen: uranus
7 indeksindeki gezegen: neptun