• Sonuç bulunamadı

Python’da Döngüler (loops)

3.3 range() Fonksiyonu

Bir önceki bölümde range() fonksiyonuna kısaca de˘ginmi¸s, konunun ayrıntısını bu bölüme bırakmı¸stık. ˙I¸ste ¸simdi burange() fonksiyonunun ne i¸se yaradı˘gını, ne tür özellikleri oldu˘gunu görece˘giz.

“range” kelimesi Türkçe’de “aralık” anlamına gelir. Adından da anla¸sılaca˘gı gibi, bu fonksiyon yardımıyla belli bir aralıktaki sayılar üzerinde i¸slem yapabilece˘giz. Bu fonksiyonla birkaç örnek yaparak i¸se ba¸slayalım. Mesela ¸su örne˘ge bakalım (Bu örne˘gi etkile¸simli kabukta yazabiliriz):

>>> range(10)

Bu komutu verdi˘gimizde ¸söyle bir çıktı alırız:

range(0, 10)

Buradan anladı˘gımıza göre, “range(10)” komutu, içerisinde 0’dan 10’a kadar olan sayıları barındırıyor (10 sayısı hariç). Bu sayıları listelemek için ¸söyle bir komut vermemiz gerekir:

>>> list(range(10))

Burada, list() adlı yeni bir fonksiyon daha görüyoruz. Bu fonksiyonu bu derste incelemeye-ce˘giz. list() fonksiyonu daha sonraki bir dersimizin konusu olacak. Biz ¸simdilik bu fonksiy-onun, “listeleme” görevi gördü˘günü bilelim. list() fonksiyonunun buradaki görevi, range() fonksiyonu içindeki sayıları listelemektir. Yukarıdaki komutu i¸sletti˘gimizde ¸söyle bir çıktı ala-ca˘gız:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Böylecerange() fonksiyonu yardımıyla, 0’dan 10’a kadar olan sayıları listelemi¸s olduk. Burada 10 sayısının listede yer almadı˘gına dikkat edin. Ayrıca, yukarıdaki komutu etkile¸simli kabukta yazdı˘gımız için ba¸sa print() komutunu eklemek zorunda kalmadık. Ama e˘ger bu kodları bir dosya içine yazıp kaydetmi¸s olsaydık, ba¸sa mutlakaprint() fonksiyonunu eklememiz gereke-cekti:

print(list(range(10)))

Burada, açtı˘gımız bütün parantezleri satır sonunda kapatmayı unutmuyoruz... E˘ger bütün parantezleri kapatmazsak programımız hata verecektir...

range() fonksiyonu bazı ba¸ska güzellikler de sunar bize. Mesela bu fonksiyonu kullanırken mutlaka 0’dan ba¸slamak gibi bir mecburiyetimiz yoktur. Örne˘gin ¸söyle bir ¸sey yazabiliriz:

>>> list(range(1, 11))

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Gördü˘günüz gibi, yukarıdaki komut yardımıyla 1’den 10’a kadar olan sayıları yazdırabildik. Bu-rada,range() fonksiyonunun saymaya kaçtan ba¸slayaca˘gını nasıl belirledi˘gimize dikkat edin.

E˘ger 2’den 10’a kadar olan bütün sayıları listelemek isteseydik ¸söyle bir ¸sey yazacaktık:

>>> list(range(2, 11))

range() fonksiyonunun yetenekleri bunlarla sınırlı de˘gildir. Bu fonksiyon yardımıyla yazdırdı˘gımız sayılar birer birer artmak zorunda da de˘gildir. Yani illa “1, 2, 3, 4...” ¸seklinde ilerlemek zorunda de˘giliz. ˙Istersek “0, 2, 4, 6...” ¸seklinde de ilerleyebiliriz:

>>> list(range(0, 10, 2))

Burada bir nokta dikkatinizi çekmi¸s olmalı. Yukarıdaki kodda ba¸slangıç sayısı olan 0’ı da belirt-tik. Normalde, e˘ger saymaya sıfırdan ba¸slayacaksak, “0” sayısını ayrıca belirtmemize gerek yoktur. Ama yukarıdaki örnekte, yapmak istedi˘gimiz ¸seyi gerçekle¸stirebilmek için parantez içinde üç adet sayı belirtmemiz gerekiyor. Çünkü range() fonksiyonunun formülü ¸su ¸ sek-ildedir:

range(ba¸slangıç_de˘geri, biti¸s_de˘geri, atlama_de˘geri)

Burada “ba¸slangıç_de˘geri” olarak belirtti˘gimiz yere, saymaya kaçtan ba¸slayaca˘gımızı yazıy-oruz. “biti¸s_de˘geri”ne sayma i¸sleminin hangi sayıya kadar devam edece˘gini yazaca˘gız.

“atlama_de˘geri” ¸seklinde gösterdi˘gimiz ifadeye ise, range() fonksiyonunun, ba¸slangıç de˘gerinden biti¸s de˘gerine kadar olan sayıları sıralarken kaçar kaçar atlaması gerekti˘gini yaz-mamız gerekiyor. range() fonksiyonunda “ba¸slangıç_de˘geri”nin varsayılan bir de˘geri vardır.

Bu de˘ger 0’dır. Yani e˘ger range() fonksiyonunu kullanarak 100’e kadar sayacaksanız ve

“list(range(100))” gibi bir kod yazmı¸ssanız, Python sizin 0’dan ba¸slamak istedi˘ginizi varsay-acaktır. “biti¸s_de˘geri”nin varsayılan bir de˘geri yoktur. Bunu bizim belirlememiz gerekir. “at-lama_de˘geri”nin varsayılan de˘geri ise “1”dir. Yani e˘ger herhangi bir atlama de˘geri belirtmezs-eniz, Python sizin birer birer saymak istedi˘ginizi varsayacaktır. Dolayısıyla, “list(range(100))”

gibi bir kod yazdı˘gımızda Python bunu alttan alta ¸su ¸sekilde görecektir:

>>> list(range(0, 100, 1))

E˘ger 0’dan 100’e kadar olan sayıları iki¸ser iki¸ser atlayarak listelemek istiyorsanız ve bu is-te˘ginizi ¸su ¸sekilde belirtirseniz Python’un kafasının karı¸smasına yol açarsınız:

>>> list(range(100, 2))

Burada Python sizin ne yapmaya çalı¸stı˘gınızı anlayamaz. Parantez içinde ilk de˘ger olarak

“100”, ikinci de˘ger olarak ise 2 yazdı˘gınız için, Python bu 100 sayısını ba¸slangıç de˘geri; 2 sayısını ise biti¸s de˘geri olarak algılayacaktır. Dolayısıyla da Python bu durumda sizin 100’den 2’ye kadar olan sayıları listelemek istedi˘ginizi zannedecek,range() fonksiyonuyla bu ¸sekilde geriye do˘gru sayamayaca˘gımız için de bo¸s bir çıktı verecektir... Bu yüzden, Python’un ¸sa¸ sır-maması için yukarıdaki örne˘gi ¸su ¸sekilde yazmalıyız:

>>> list(range(0, 100, 2))

Kısacası, e˘gerrange() fonksiyonunun kaçar kaçar sayaca˘gını da belirtmek istiyorsak, parantez içine, gerekli bütün sayıları yazmalıyız...

Bu arada, “range(100, 2)” gibi bir ifade yazarak sayıları geriye do˘gru listeleyemeyecek olmamız, hiç bir ¸sekilde geriye do˘gru sayamayaca˘gımız anlamına gelmiyor. Elbette “at-lama_de˘geri” parametresine eksi de˘gerli bir sayı vererekrange() fonksiyonunun geriye do˘gru saymasını da sa˘glayabiliriz:

>>> list(range(100, 2, -1))

Hatta istersekrange() fonksiyonunun geriye do˘gru kaçar kaçar sayaca˘gını da belirtebiliriz:

>>> list(range(100, 2, -2))

...gibi...

Sanırım tekrar hatırlatmaya gerek yok. Yukarıdaki kodları e˘ger bir dosyaya yazıp çalı¸ stıra-caksanız, ba¸slarınaprint() fonksiyonunu da eklemeniz gerekir. Dolayısıyla yukarıda en son verdi˘gimiz örnek bir dosya içinde ¸söyle görünecektir:

print(list(range(0, 100, 2)))

Gördü˘günüz gibi, bir sürü parantez i¸sareti oldu kodlarımız içinde. Esasında yukarıda yap-tı˘gımız i¸slemleri yapabilmek için farklı bir yol da izleyebiliriz. range() fonksiyonunu yukarıdaki

¸

sekillerde kullanmak yerine, bunu birfor döngüsü içine de alabiliriz:

for i in range(0, 100, 2):

print(i)

Ayrıcarange() fonksiyonunu bir for döngüsü içine aldı˘gımızda,range() fonksiyonunun üret-ti˘gi sayılarla bazı yararlı i¸sler de yapabiliriz. Örne˘gin ¸suna bir bakın:

for çarp in range(10):

print(çarp * 2)

Bu kodları çalı¸stırdı˘gımızda ¸söyle bir çıktı elde ederiz:

0 2 4 6 8 10 12 14 16 18

Burada Python’un yaptı˘gı ¸sey, 0’dan 10’a kadar olan bütün sayıları tek tek 2 ile çarpmak oldu...

Ayrıcarange() fonksiyonunu “for” döngüsü içinde kullandı˘gımızdalist() fonksiyonunu kul-lanmamıza gerek kalmadı˘gına da dikkat edin.

for döngüsünü ve range() fonksiyonunu if deyimi ile birlikte kullanarak ¸söyle bir ¸sey da yapabiliriz:

for çift_sayılar in range(10):

if çift_sayılar % 2 == 0:

print(çift_sayılar)

Burada gerçekle¸sen süreci kabaca ¸söyle ifade edebiliriz:

0’dan 10’a kadar olan bütün sayıları tek tek tara ve bunların her birini “çift_sayılar” olarak adlandır. E˘ger çift_sayılar olarak adlandırdı˘gımız bu sayılar içinde 2’ye tam bölünen sayılar varsa bunları ekrana yazdır...

“%” i¸slecinin ne i¸se yaradı˘gını daha önceki derslerimizden hatırlıyorsunuz....

BÖLÜM

4

Listeler

4.1 Giri¸ s

Bu bölümde yine Python’un çok önemli bir ö˘gesinden bahsedece˘giz. Bu dersimizin konusu

“Python’da Listeler”.

Aslında bizrange() fonksiyonunu incelerken, ucundan da olsa listeleri görmü¸stük. Mesela ¸su örne˘gi hatırlıyorsunuz:

list(range(10))

Bu komut ¸söyle bir çıktı veriyordu:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

˙I¸ste yukarıda gördü˘gümüz bu çıktı aslında bir “liste”dir... Teknik bir dille ifade etmek gerekirse,

“listeler” Python’daki “veri tipleri”nden (data types) yalnızca bir tanesidir. Simdiye kadar¸ gördü˘gümüz veri tipleri arasında “sayılar” ve “karakter dizileri” vardı... Dolayısıyla, “sayılar”,

“karakter dizileri” ve “listeler” Python’da “veri tipi” adı verilen bir grubun üyesidir. Bu teknik terimleri elbette ezberlemek zorunda de˘gilsiniz. Ama bilmenin zararını de˘gil faydasını görürsünüz.

Python’da “listeler” konusuna kısa bir giri¸s yaptı˘gımıza göre artık yava¸s yava¸s ayrıntılara inm-eye ba¸slayabiliriz.