09-06-2015, 04:54 PM
Bu arada, etkileşimli kabukta
gibi bir komut verdiğinizde range(0, 10) çıktısı aldığınızı görüyorsunuz. Bu çıktı, verdiğimiz komutun 0 ile 10 arası sayıları elde etmemizi sağlayacağını belirtiyor, ama bu sayıları o anda bize göstermiyor. Daha önce verdiğimiz örneklerden de anlaşılacağı gibi, 0-10 aralığındaki sayıları görebilmek için
ifadesi üzerinde bir
döngüsü kurmamız gerekiyor.
ifadesinin taşıdığı sayıları görebilmek için
döngüsü kurmak tek seçenek değildir. Bu işlem için yıldızlı parametrelerden de yararlanabiliriz.
fonksiyonunu incelediğimiz derste yıldızlı parametrelerin nasıl kullanıldığını göstermiştik. Dilerseniz şimdi bu parametre tipini
fonksiyonuna nasıl uygulayabileceğimizi görelim:
>>> print(*range(10))
0 1 2 3 4 5 6 7 8 9
fonksiyonunun sep parametresi yardımıyla bu çıktıyı istediğiniz gibi düzenleyebileceğinizi biliyorsunuz. Mesela çıktıdaki sayıları birbirlerinden virgülle ayırmak için şöyle bir komut verebiliyoruz:
>>> print(*range(10), sep=", ")
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Böylece
fonksiyonunu enine boyuna incelemiş ve bu fonksiyonun ne işe yaradığını, nasıl kullanılacağını anlamamızı sağlayan örnekler vermiş olduk. Artık başka bir konuyu geçebiliriz.
pass Deyimi
pass kelimesi İngilizcede ‘geçmek, pas geçmek’ gibi anlamlara gelir. Python’daki kullanımı da bu anlama oldukça yakındır. Biz bu deyimi Pyhon’da ‘görmezden gel, hiçbir şey yapma’ anlamında kullanacağız.
Dilerseniz
deyimini tarif etmeye çalışmak yerine bu deyimi bir örnek üzerinde açıklamaya çalışalım.
Hatırlarsanız yukarıda şöyle bir örnek vermiştik:
while True:
parola = input("parola belirleyin: ")
if not parola:
print("parola bölümü boş geçilemez!")
elif len(parola) in range(3, 8): #eğer parolanın uzunluğu 3 ile 8 karakter
#aralığında ise...
print("Yeni parolanız", parola)
break
else:
print("parola 8 karakterden uzun 3 karakterden kısa olmamalı")
Burada mesela eğer kullanıcı parolayı boş bırakırsa ‘parola bölümü boş geçilemez!’ uyarısı gösteriyoruz. Şimdi o
bloğunu şöyle yazdığımızı düşünün:
while True:
parola = input("parola belirleyin: ")
if not parola:
pass
elif len(parola) in range(3, 8): #eğer parolanın uzunluğu 3 ile 8 karakter
#aralığında ise...
print("Yeni parolanız", parola)
break
else:
print("parola 8 karakterden uzun 3 karakterden kısa olmamalı")
Burada, eğer kullanıcı parolayı boş bırakırsa programımız hiçbir şey yapmadan yoluna devam edecektir. Yani burada
deyimi yardımıyla programımıza şu emri vermiş oluyoruz:
while True:
sayı = int(input("Bir sayı girin: "))
if sayı == 0:
break
elif sayı < 0:
pass
else:
print(sayı)
Burada eğer kullanıcı 0 sayısını girerse programımız sona erer (
deyimini biraz sonra inceleyeceğiz). Eğer kullanıcı 0‘dan küçük bir sayı girerse, yani kullanıcının girdiği sayı eksi değerli ise,
deyimininin etkisiyle programımız hiçbir şey yapmadan yoluna devam eder. Bu koşulların dışındaki durumlarda ise programımız kullanıcının girdiği sayıları ekrana yazdıracaktır.
Yukarıda anlatılan durumların dışında,
deyimini kodlarınız henüz taslak aşamasında olduğu zaman da kullanabilirsiniz. Örneğin, diyelim ki bir kod yazıyorsunuz. Programın gidişatına göre, bir noktada yapmanız gereken bir işlem var, ama henüz ne yapacağınıza karar vermediniz. Böyle bir durumda
deyiminden yararlanabilirsiniz. Mesela birtakım
deyimleri yazmayı düşünüyor olun:
if .....:
böyle yap
elif .....:
şöyle yap
else:
pass
Burada henüz
bloğunda ne yapılacağına karar vermemiş olduğunuz için, oraya bir
koyarak durumu şimdilik geçiştiriyorsunuz. Program son haline gelene kadar oraya bir şeyler yazmış olacaksınız.
Sözün özü,
deyimlerini, herhangi bir işlem yapılmasının gerekli olmadığı durumlar için kullanıyoruz. İlerde işe yarar programlar yazdığınızda, bu
deyiminin göründüğünden daha faydalı bir araç olduğunu anlayacaksınız.
break Deyimi
Python’da
özel bir deyimdir. Bu deyim yardımıyla, devam eden bir süreci kesintiye uğratabiliriz. Bu deyimin kullanıldığı basit bir örnek verelim:
>>> while True:
... parola = input("Lütfen bir parola belirleyiniz:")
... if len(parola) < 5:
... print("Parola 5 karakterden az olmamalı!")
... else:
... print("Parolanız belirlendi!")
... break
Burada, eğer kullanıcının girdiği parolanın uzunluğu 5 karakterden azsa, Parola 5 karakterden az olmamalı! uyarısı gösterilecektir. Eğer kullanıcı 5 karakterden uzun bir parola belirlemişse, kendisine ‘Parolanız belirlendi!’ mesajını gösterip,
deyimi yardımıyla programdan çıkıyoruz.
Gördüğünüz gibi,
ifadesinin temel görevi bir döngüyü sona erdirmek. Buradan anlayacağımız gibi,
ifadesinin her zaman bir döngü içinde yer alması gerekiyor. Aksi halde Python bize şöyle bir hata verecektir:
SyntaxError: 'break' outside loop
Yani:
SözDizimiHatası: ``break`` döngü dışında ..
continue Deyimi
ilginç bir deyimdir. İsterseniz
deyimini anlatmaya çalışmak yerine bununla ilgili bir örnek verelim:
while True:
s = input("Bir sayı girin: ")
if s == "iptal":
break
if len(s) <= 3:
continue
print("En fazla üç haneli bir sayı girebilirsiniz.")
Burada eğer kullanıcı klavyede iptal yazarsa programdan çıkılacaktır. Bunu;
if s == "iptal":
break
satırıyla sağlamayı başardık.
Eğer kullanıcı tarafından girilen sayı üç haneli veya daha az haneli bir sayı ise,
ifadesinin etkisiyle:
>>> print("En fazla üç haneli bir sayı girebilirsiniz.")
satırı es geçilecek ve döngünün en başına gidilecektir.
Eğer kullanıcının girdiği sayıdaki hane üçten fazlaysa ekrana:
En fazla üç haneli bir sayı girebilirsiniz.
cümlesi yazdırılacaktır.
Dolayısıyla buradan anladığımıza göre,
deyiminin görevi kendisinden sonra gelen her şeyin es geçilip döngünün başına dönülmesini sağlamaktır. Bu bilgiye göre, yukarıdaki programda eğer kullanıcı, uzunluğu üç karakterden az bir sayı girerse
deyiminin etkisiyle programımız döngünün en başına geri gidiyor. Ama eğer kullanıcı, uzunluğu üç karakterden fazla bir sayı girerse, ekrana ‘En fazla üç haneli bir sayı girebilirsiniz,’ cümlesinin yazdırıldığını görüyoruz.
Örnek Uygulamalar
Python programlama dilinde döngülerin neye benzediğini öğrendik. Bu bölünde ayrıca döngülerle birlikte kullanabileceğimiz başka araçları da tanıdık. Şimdi dilerseniz bu öğrendiklerimizi pekiştirmek için birkaç ufak çalışma yapalım.
Karakter Dizilerinin İçeriğini Karşılaştırma
Diyelim ki elinizde şöyle iki farklı metin var:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
Siz burada, ilk_metin adlı değişken içinde bulunan, ama ikinci_metin adlı değişken içinde bulunmayan öğeleri ayıklamak istiyorsunuz. Yani bu iki metnin içeriğini karşılaştırıp, farklı öğeleri bulmayı amaçlıyorsunuz. Bu işlem için, bu bölümde öğrendiğimiz döngülerden ve daha önce öğrendiğimiz başka araçlardan yararlanabilirsiniz. Şimdi dikkatlice bakın:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
for s in ilk_metin:
if not s in ikinci_metin:
print(s)
Bu kodları bir dosyaya kaydedip çalıştırdığımızda şu çıktıyı alıyoruz:
a
a
ş
ş
a
Demek ki ilk_metin adlı değişkende olup da ikinci_metin adlı değişkende olmayan öğeler bunlarmış...
Bu kodlarda anlayamayacağınız hiçbir şey yok. Ama dilerseniz biz yine de bu kodları tek tek inceleyelim.
İlk olarak değişkenlerimizi tanımladık:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
Amacımız ilk_metin‘de olan, ama ikinci_metin‘de olmayan öğeleri görmek. Bunun için ilk_metin‘deki öğeleri tek tek ikinci_metin‘deki öğelerle karşılaştırmamız gerekiyor. Tahmin edebileceğiniz gibi, bir metnin bütün öğelerine tek tek bakabilmenin en iyi yolu
döngülerini kullanmaktır. O halde döngümüzü yazalım:
for s in ilk_metin: #ilk_metin'deki, 's' adını verdiğimiz bütün öğeler için
if not s in ikinci_metin: #eğer 's' adlı bu öğe ikinci_metin'de yoksa
print(s) #'s' adlı öğeyi ekrana bas
Gördüğünüz gibi, döngüleri (
), bool işleçlerini (not) ve aitlik işleçlerini (in) kullanarak, istediğimiz şeyi rahatlıkla yapabiliyoruz. Burada kullandığımız
deyimi, bir önceki satırda
döngüsü ile üzerinden geçtiğimiz öğeleri süzmemizi sağlıyor. Burada temel olarak şu üç işlemi yapıyoruz:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
for s in ikinci_metin: #ikinci_metin'deki, 's' adını verdiğimiz bütün öğeler için
if not s in ilk_metin: #eğer 's' adlı bu öğe ilk_metin'de yoksa
print(s) #'s' adlı öğeyi ekrana bas
Bu da bize şu çıktıyı veriyor:
u
ı
o
r
y
e
u
ı
r
u
e
e
e
u
Gördüğünüz gibi, yaptığımız tek şey, ilk_metin ile ikinci_metin‘in yerlerini değiştirmek oldu. Kullandığımız mantık ise değişmedi.
Bu arada, yukarıdaki çıktıda bizi rahatsız eden bir durum var. Çıktıda bazı harfler birbirini tekrar ediyor. Aslında temel olarak sadece şu harfler var:
u
ı
o
r
y
e
Ama metin içinde bazı harfler birden fazla sayıda geçtiği için, doğal olarak çıktıda da bu harfler birden fazla sayıda görünüyor. Ama tabii ki, eğer biz istersek farklı olan her harften yalnızca bir tanesini çıktıda görmeyi de tercih edebiliriz. Bunun için şöyle bir kod yazabiliriz:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
fark = ""
for s in ikinci_metin:
if not s in ilk_metin:
if not s in fark:
fark += s
print(fark)
Burada da anlayamayacağımız hiçbir şey yok. Bu kodlardaki bütün parçaları tanıyoruz. Herzamanki gibi öncelikle değişkenlerimizi tanımladık:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
Daha sonra fark adlı boş bir karakter dizisi tanımlıyoruz. Metinler içindeki farklı karakter dizilerini fark adlı bu karakter dizisi içinde depolayacağız.
Ardından da
döngümüzü yazıyoruz:
for s in ikinci_metin: # ikinci_metin'de 's' dediğimiz bütün öğeler için
if not s in ilk_metin: # eğer 's' ilk_metin'de yoksa
if not s in fark: # eğer 's' fark'ta da yoksa
fark += s # bu öğeyi fark değişkenine ekle
print(fark) # fark değişkenini ekrana bas
Uyguladığımız mantığın ne kadar basit olduğunu görüyorsunuz. Bu kodlarda basitçe şu işlemleri yapıyoruz:
Python programlama dilinde önceden oluşturduğumuz bir karakter dizisini başka bir karakter dizisi ile birleştirdiğimizde bu işlem ilk oluşturduğumuz karakter dizisini etkilemez. Yani:
>>> a = 'istihza'
>>> a + '.com'
'istihza.com'
Burada sanki a adlı özgün karakter dizisini değiştirmişiz ve ‘istihza.com’ değerini elde etmişiz gibi görünüyor. Ama aslında a‘nın durumunda hiçbir değişiklik yok:
>>> a
'istihza'
Gördüğünüz gibi, a değişkeninin değeri hâlâ ‘istihza’. Bu durumun nedeni, birleştirme işlemlerinin bir değiştirme işlemi olmamasıdır. Yani mesela iki karakter dizisini birleştirdiğinizde birleşen karakter dizileri üzerinde herhangi bir değişiklik olmaz. Bu durumda yapabileceğimiz tek şey, karakter dizisine eklemek istediğimiz öğeyi de içeren yeni bir karakter dizisi oluşturmaktır. Yani:
>>> a = 'istihza'
>>> a = a + '.com'
>>> print(a)
istihza.com
Burada sanki değeri ‘istihza’ olan a adlı bir değişkene ‘.com’ değerini eklemişiz gibi görünüyor, ama aslında biz burada a değişkenini yok edip, ‘istihza.com’ değerini içeren, a adlı başka bir değişken tanımladık. Bu durumu nasıl teyit edeceğinizi biliyorsunuz:
>>> a = 'istihza'
>>> id(a)
15063200
>>> a = a + '.com'
>>> id(a)
15067960
Burada
fonksiyonunu kullanarak karakter dizilerinin kimliklerini sorguladık. Gördüğünüz gibi, isimleri aynı da olsa, aslında ortada iki farklı a değişkeni var. Kimlik numaralarının farklı olmasından anladığımıza göre, ilk başta tanımladığımız a değişkeni ile
satırıyla oluşturduğumuz a değişkeni birbirinden farklı.
Bu arada, eğer istersek yukarıdaki değer atama işlemini, önceki bölümlerde öğrendiğimiz değer atama işleçleri yardımıyla kısaltabileceğimizi de biliyorsunuz:
>>> a += '.com'
İşte ilk_metin ile ikinci_metin değişkenleri arasındaki farklı harfleri yalnızca birer kez yazdırmak için kullandığımız kodlarda da yukarıdaki işlemi yaptık:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
fark = ''
for s in ikinci_metin:
if not s in ilk_metin:
if not s in fark:
fark += s
print(fark)
Gördüğünüz gibi, önce boş bir fark değişkeni oluşturduk. Daha sonra bu değişkene
döngüsü içinde yeni değerler atayabilmek (daha doğrusu atarmış gibi yapmak) için
gibi bir kod kullandık. Böylece for döngüsünün her dönüşünde s adını verdiğimiz herbir öğeyi tek tek fark değişkenine yolladık. Böylece program sonunda elimizde, farklı öğeleri yalnızca birer kez içeren fark adlı bir değişken olmuş oldu. Dediğimiz gibi, ilk başta tanımladığımız boş fark değişkeni ile, program sonunda farklı değerleri içeren fark değişkeni aslında aynı değil. Yani biz ilk fark değişkenine döngünün her dönüşünde yeni bir öğe eklemek yerine, döngünün her dönüşünde yeni bir fark değişkeni oluşturmuş oluyoruz. Ama programın sonunda sanki fark değişkenine her defasında yeni bir değer atamışız gibi görünüyor ve bu da bizim işimizi görmemize yetiyor...
Programın başındaki ve sonundaki fark değişkenlerinin aslında birbirinden farklı olduğunu teyit etmek için şu kodları kullanabilirsiniz:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
fark = ""
print("fark'ın ilk tanımlandığı zamanki kimlik numarası: ", id(fark))
for s in ikinci_metin:
if not s in ilk_metin:
if not s in fark:
fark += s
print("fark'ın program sonundaki kimlik numarası: ", id(fark))
Gördüğünüz gibi, gerçekten de ortada iki farklı fark değişkeni var. Bu durumu
fonksiyonu yardımıyla doğrulayabiliyoruz.
Peki bu bilginin bize ne faydası var?
Şimdilik şu kadarını söyleyelim: Eğer o anda muhatap olduğunuz bir veri tipinin mizacını, huyunu-suyunu bilmezseniz yazdığınız programlarda çok kötü sürprizlerle karşılaşabilirsiniz. Birkaç bölüm sonra başka veri tiplerini de öğrendikten sonra bu durumu daha ayrıntılı bir şekilde inceleyeceğiz.
Bu arada, tahmin edebileceğiniz gibi yukarıdaki
döngüsünü şöyle de yazabilirdik:
for s in ikinci_metin:
if not s in ilk_metin and not s in fark:
fark += s
Burada iki farklı
deyimini iki farklı satırda yazmak yerine, bu deyimleri and işleci ile birbirine bağladık.
Bu örnek ile ilgili söyleyeceklerimiz şimdilik bu kadar. Gelin biz şimdi isterseniz bilgilerimizi pekiştirmek için başka bir örnek daha yapalım.
Dosyaların İçeriğini Karşılaştırma
Bir önceki örnekte karakter dizilerinin içeriğini nasıl karşılaştırabileceğimizi gösteren bir örnek vermiştik. Şimdi de, gerçek hayatta karşınıza çıkması daha olası bir durum olması bakımından, dosyaların içeriğini nasıl karşılaştıracağımıza dair bir örnek verelim.
Esasında karakter dizilerinin içeriğini birbirleriyle nasıl karşılaştırıyorsak, dosyaların içeriğini de benzer şekilde karşılaştırabiliriz. Mesela içeriği şu olan isimler1.txt adlı bir dosyamız olduğunu varsayalım:
Ahmet
Mehmet
Sevgi
Sinan
Deniz
Ege
Efe
Ferhat
Fırat
Zeynep
Hazan
Mahmut
Celal
Cemal
Özhan
Özkan
Yine içeriği şu olan bir de isimler2.txt adlı başka bir dosya daha olduğunu düşünelim:
Gürsel
Mehmet
Sevgi
Sami
Deniz
Ege
Efe
Ferhat
Fırat
Tülay
Derya
Hazan
Mahmut
Tezcan
Cemal
Özhan
Özkan
Özcan
Dilek
Amacımız bu iki dosyanın içeriğini karşılaştırıp, farklı öğeleri ortaya sermek. Dediğimiz gibi, bir önceki örnekte izlediğimiz yolu burada da takip edebiliriz. Dikkatlice bakın:
d1 = open("isimler1.txt") # dosyayı açıyoruz
d1_satırlar = d1.readlines() # satırları okuyoruz
d2 = open("isimler2.txt")
d2_satırlar = d2.readlines()
for i in d2_satırlar:
if not i in d1_satırlar:
print(i)
d1.close()
d2.close()
Gerçekten de mantığın bir önceki örnekle tamamen aynı olduğunu görüyorsunuz. Biz henüz Python’da dosyaların nasıl işleneceğini öğrenmedik, ama daha önce gördüğümüz
fonksiyonu yardımıyla en azından dosyaları açabilecek kadar biliyoruz dosya işlemlerinin nasıl yürütüleceğini...
Burada farklı olarak
adlı bir metot görüyoruz. Biz burada bu metodun ayrıntılarına inmeyeceğiz, ama şimdilik dosya içeriğinin satırlar halinde okunmasını sağladığını bilelim yeter.
Bu arada, eğer çıktıda Türkçe karakterleri düzgün görüntüleyemiyorsanız
fonksiyonunun encoding adlı bir parametresi vasıtasıyla içeriği UTF-8 olarak kodlayabilirsiniz:
d1 = open("isimler1.txt", encoding="utf-8") # dosyayı açıyoruz
d1_satırlar = d1.readlines() # satırları okuyoruz
d2 = open("isimler2.txt", encoding="utf-8")
d2_satırlar = d2.readlines()
for i in d2_satırlar:
if not i in d1_satırlar:
print(i)
d1.close()
d2.close()
Bu şekilde Türkçe karakterleri düzgün bir şekilde görüntüleyebiliyor olmanız lazım. Eğer Windows’ta Türkçe karakterleri hala düzgün görüntüleyemiyorsanız encoding parametresinde ‘utf-8’ yerine ‘cp1254’ adlı dil kodlamasını kullanmayı deneyebilirsiniz:
encoding = "cp1254"
Yukarıdaki örneklerde bir içerik karşılaştırması yapıp, farklı öğeleri ayıkladık. Aynı şekilde benzer öğeleri ayıklamak da mümkündür. Bu işlemin nasıl yapılacağını az çok tahmin ettiğinizi zannediyorum:
d1 = open("isimler1.txt")
d1_satırlar = d1.readlines()
d2 = open("isimler1.txt")
d2_satırlar = d2.readlines()
for i in d2_satırlar:
if i in d1_satırlar:
print(i)
d1.close()
d2.close()
Burada bir öncekinden farklı olarak
kodu yerine, doğal olarak,
kodunu kullandığımıza dikkat edin.
Dosyalar üzerinde yaptığımız işlemleri tamamladıktan sonra
metodu ile bunları kapatmayı unutmuyoruz:
d1.close()
d2.close()
Karakter Dizisindeki Karakterleri Sayma
Yukarıdaki örneklerde içerik karşılaştırmaya ilişkin birkaç örnek verdik. Şimdi yine bilgilerimizi pekiştirmek için başka bir konuya ilişkin örnekler verelim.
Mesela elimizde şöyle bir metin olduğunu varsayalım:
Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı
tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,
isminin Python olmasına aldanarak, bu programlama dilinin, adını piton
yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama
dilinin adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini,
The Monty Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying
Circus adlı gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar
gerçek böyle olsa da, Python programlama dilinin pek çok yerde bir yılan
figürü ile temsil edilmesi neredeyse bir gelenek halini almıştır.
Yapmamız gereken bir istatistik çalışması gereğince bu metinde her harfin kaç kez geçtiğini hesaplamanız gerekiyor.
Bunun için şöyle bir program yazabiliriz:
metin = """Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı
tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,
isminin Python olmasına aldanarak, bu programlama dilinin, adını piton
yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama dilinin
adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini, The Monty
Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying Circus adlı
gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar gerçek böyle olsa
da, Python programlama dilinin pek çok yerde bir yılan figürü ile temsil
edilmesi neredeyse bir gelenek halini almıştır."""
harf = input("Sorgulamak istediğiniz harf: ")
sayı = ''
for s in metin:
if harf == s:
sayı += harf
print(len(sayı))
Burada öncelikle metnimizi bir değişken olarak tanımladık. Ardından da kullanıcıya hangi harfi sorgulamak istediğini sorduk.
Bu kodlarda tanımladığımız sayı adlı değişken, sorgulanan harfi, metinde geçtiği sayıda içinde barındıracaktır. Yani mesela metin 5 tane a harfi varsa sayı değişkeninin değeri aaaaa olacaktır.
Sonraki satırlarda
döngümüzü tanımlıyoruz:
for s in metin: # metin içinde 's' adını verdiğimiz herbir öğe için
if harf == s: # eğer kullanıcıdan gelen harf 's' ile aynıysa
sayı += harf # kullanıcıdan gelen bu harfi sayı değişkenine yolla
Dediğimiz gibi, sayı değişkeni, sorgulanan harfi, metinde geçtiği sayıda barındırıyor. Dolayısıyla bir harfin metinde kaç kez geçtiğini bulmak için sayı değişkeninin uzunluğunu yazdırmamız yeterli olacaktır:
print(len(sayı))
Dilerseniz yukarıdaki programı yazmak için daha farklı bir mantık da kullanabilirsiniz. Dikkatlice bakın:
metin = """Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı
tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,
isminin Python olmasına aldanarak, bu programlama dilinin, adını piton
yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama dilinin
adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini, The Monty
Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying Circus adlı
gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar gerçek böyle olsa
da, Python programlama dilinin pek çok yerde bir yılan figürü ile temsil
edilmesi neredeyse bir gelenek halini almıştır."""
harf = input("Sorgulamak istediğiniz harf: ")
sayı = 0
for s in metin:
if harf == s:
sayı += 1
print(sayı)
Burada sayı değişkeninin ilk değeri 0 olarak belirledik. Döngü içinde de, sorgulanan harfin metin içinde her geçişinde sayı değişkeninin değerini 1 sayı artırdık. Dolayısıyla sorgulanan harfin metinde kaç kez geçtiğini bulmak için sayı değişkeninin son değerini yazdırmamız yeterli oldu.
Dosya içindeki Karakterleri Sayma
Dilerseniz bir önceki örnekte kullandığımız metnin program içinde bir değişken değil de, mesela bir dosyadan okunan bir metin olduğunu varsayalım şimdi:
hakkında = open("hakkında.txt", encoding="utf-8")
harf = input("Sorgulamak istediğiniz harf: ")
sayı = 0
for karakter_dizisi in hakkında:
for karakter in karakter_dizisi:
if harf == karakter:
sayı += 1
print(sayı)
hakkında.close()
Burada yaptığımız ilk iş elbette dosyamızı açmak oldu:
hakkında = open("a1.txt", encoding="utf-8")
Bu komutla, hakkında.txt adlı dosyayı UTF-8 kodlaması ile açtık. Daha sonra kullanıcıya, sorgulamak istediği harfi soruyoruz:
harf = input("Sorgulamak istediğiniz harf: ")
Ardından da sorgulanan harfin dosyada kaç kez geçtiği bilgisini tutacak olan sayı adlı bir değişken tanımlıyoruz:
sayı = 0
Sıra geldi
döngümüzü tanımlamaya:
for karakter_dizisi in hakkında:
for karakter in karakter_dizisi:
if harf == karakter:
sayı += 1
Bu döngüyü anlamakta bir miktar zorlanmış olabilirsiniz. Her zaman söylediğimiz gibi, Python’da bir kod parçasını anlamanın en iyi yöntemi, gerekli yerlere
fonksiyonları yerleştirerek, programın verdiği çıktıları incelemektir:
for karakter_dizisi in hakkında:
print(karakter_dizisi)
#for karakter in karakter_dizisi:
# if harf == karakter:
# sayı += 1
Gördüğünüz gibi, ilk
döngüsünün hemen sonrasına bir
fonksiyonu yerleştirerek bu döngünün verdiği çıktıları inceliyoruz. Bu arada, amacımıza hizmet etmeyen satırları da yorum içine alarak etkisizleştirdiğimize dikkat edin.
Çıktıya baktığımız zaman, şöyle bir durumla karşılaşıyoruz:
Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı
tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,
isminin Python olmasına aldanarak, bu programlama dilinin, adını piton
yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama dilinin
adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini, The Monty
Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying Circus adlı
gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar gerçek böyle olsa
da, Python programlama dilinin pek çok yerde bir yılan figürü ile temsil
edilmesi neredeyse bir gelenek halini almıştır.
Burada herbir satır ayrı bir karakter dizisidir. Eğer herbir satırın ayrı bir karakter dizisi olduğunu daha net bir şekilde görmek istiyorsanız
adlı özel bir fonksiyondan yararlanabilirsiniz:
for karakter_dizisi in hakkında:
print(repr(karakter_dizisi))
#for karakter in karakter_dizisi:
# if harf == karakter:
# sayı += 1
Bu kodlar bu kez şöyle bir çıktı verir:
'Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı\n'
'tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,\n'
'isminin Python olmasına aldanarak, bu programlama dilinin, adını piton\n'
'yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama dilinin\n'
'adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini, The Monty\n'
'Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying Circus adlı\n'
'gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar gerçek böyle olsa\n'
'da, Python programlama dilinin pek çok yerde bir yılan figürü ile temsil\n'
'edilmesi neredeyse bir gelenek halini almıştır.'
Bu çıktıya çok dikkatlice bakın.
fonksiyonu sayesinde Python’ın alttan alta neler çevirdiğini bariz bir biçimde görüyoruz. Karakter dizisinin başlangıç ve bitişini gösteren tırnak işaretleri ve \n kaçış dizilerinin görünür vaziyette olması sayesinde herbir satırın ayrı bir karakter dizisi olduğunu daha net bir şekilde görebiliyoruz.
Biz yazdığımız kodlarda, kullanıcıdan bir harf girmesini istiyoruz. Kullandığımız algoritma gereğince bu harfi metindeki karakter dizileri içinde geçen herbir karakterle tek tek karşılaştırmamız gerekiyor.
metodu aracılığıyla kullanıcıdan tek bir karakter alıyoruz. Kullandığımız
döngüsü ise bize bir karakter yerine her satırda bir karakter dizisi veriyor. Dolayısıyla mesela kullanıcı ‘a’ harfini sorgulamışsa, ilk
döngüsü bu harfin karşısına ‘Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcın’ adlı karakter dizisini çıkaracaktır. Dolayısıyla bizim bir seviye daha alta inerek, ilk
döngüsünden elde edilen değişken üzerinde başka bir
döngüsü daha kurmamız gerekiyor. Bu yüzden şöyle bir kod yazıyoruz:
for karakter_dizisi in hakkında:
for karakter in karakter_dizisi:
...
Böylece iç içe iki
döngüsü oluşturmuş oluyoruz. İsterseniz bu anlattığımız şeyleri daha net görmek için yine
fonksiyonundan yararlanabilirsiniz:
hakkında = open("hakkında.txt", encoding="utf-8")
harf = input("Sorgulamak istediğiniz harf: ")
sayı = 0
for karakter_dizisi in hakkında:
for karakter in karakter_dizisi:
print(karakter)
# if harf == karakter:
# sayı += 1
#print(sayı)
karakter değişkenin değerini ekrana yazdırarak Python’ın alttan alta neler çevirdiğini daha net görebiliyoruz.
Kodların geri kalanında ise, kullanıcının sorguladığı harfin,
döngüsü ile üzerinden geçtiğimiz karakter_dizisi adlı değişken içindeki karakterlerle eşleşip eşleşmediğini denetliyoruz. Eğer eşleşiyorsa, her eşleşmede sayı değişkeninin derini 1 sayı artırıyoruz. Böylece en elimizde sorgulanan harfin metin içinde kaç kez geçtiği bilgisi olmuş oluyor.
Son olarak da, ilk başta açtığımız dosyayı kapatıyoruz:
hakkında.close()
kaynak:http://belgeler.istihza.com/py3/donguler.html
Kod:
range(10)
Kod:
range(10)
Kod:
for
Kod:
range(10)
Kod:
for
Kod:
print()
Kod:
range()
>>> print(*range(10))
0 1 2 3 4 5 6 7 8 9
Kod:
print()
>>> print(*range(10), sep=", ")
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Böylece
Kod:
range()
pass Deyimi
pass kelimesi İngilizcede ‘geçmek, pas geçmek’ gibi anlamlara gelir. Python’daki kullanımı da bu anlama oldukça yakındır. Biz bu deyimi Pyhon’da ‘görmezden gel, hiçbir şey yapma’ anlamında kullanacağız.
Dilerseniz
Kod:
pass
Hatırlarsanız yukarıda şöyle bir örnek vermiştik:
while True:
parola = input("parola belirleyin: ")
if not parola:
print("parola bölümü boş geçilemez!")
elif len(parola) in range(3, 8): #eğer parolanın uzunluğu 3 ile 8 karakter
#aralığında ise...
print("Yeni parolanız", parola)
break
else:
print("parola 8 karakterden uzun 3 karakterden kısa olmamalı")
Burada mesela eğer kullanıcı parolayı boş bırakırsa ‘parola bölümü boş geçilemez!’ uyarısı gösteriyoruz. Şimdi o
Kod:
if
while True:
parola = input("parola belirleyin: ")
if not parola:
pass
elif len(parola) in range(3, 8): #eğer parolanın uzunluğu 3 ile 8 karakter
#aralığında ise...
print("Yeni parolanız", parola)
break
else:
print("parola 8 karakterden uzun 3 karakterden kısa olmamalı")
Burada, eğer kullanıcı parolayı boş bırakırsa programımız hiçbir şey yapmadan yoluna devam edecektir. Yani burada
Kod:
pass
Alıntı:Eğer kullanıcı parolayı boş geçerse görmezden gel. Hiçbir şey yapmadan yoluna devam et!Başka bir örnek daha verelim:
while True:
sayı = int(input("Bir sayı girin: "))
if sayı == 0:
break
elif sayı < 0:
pass
else:
print(sayı)
Burada eğer kullanıcı 0 sayısını girerse programımız sona erer (
Kod:
break
Kod:
pass
Yukarıda anlatılan durumların dışında,
Kod:
pass
Kod:
pass
Kod:
if
if .....:
böyle yap
elif .....:
şöyle yap
else:
pass
Burada henüz
Kod:
else
Kod:
pass
Sözün özü,
Kod:
pass
Kod:
pass
break Deyimi
Python’da
Kod:
break
>>> while True:
... parola = input("Lütfen bir parola belirleyiniz:")
... if len(parola) < 5:
... print("Parola 5 karakterden az olmamalı!")
... else:
... print("Parolanız belirlendi!")
... break
Burada, eğer kullanıcının girdiği parolanın uzunluğu 5 karakterden azsa, Parola 5 karakterden az olmamalı! uyarısı gösterilecektir. Eğer kullanıcı 5 karakterden uzun bir parola belirlemişse, kendisine ‘Parolanız belirlendi!’ mesajını gösterip,
Kod:
break
Gördüğünüz gibi,
Kod:
break
Kod:
break
SyntaxError: 'break' outside loop
Yani:
SözDizimiHatası: ``break`` döngü dışında ..
continue Deyimi
Kod:
continue
Kod:
continue
while True:
s = input("Bir sayı girin: ")
if s == "iptal":
break
if len(s) <= 3:
continue
print("En fazla üç haneli bir sayı girebilirsiniz.")
Burada eğer kullanıcı klavyede iptal yazarsa programdan çıkılacaktır. Bunu;
if s == "iptal":
break
satırıyla sağlamayı başardık.
Eğer kullanıcı tarafından girilen sayı üç haneli veya daha az haneli bir sayı ise,
Kod:
continue
>>> print("En fazla üç haneli bir sayı girebilirsiniz.")
satırı es geçilecek ve döngünün en başına gidilecektir.
Eğer kullanıcının girdiği sayıdaki hane üçten fazlaysa ekrana:
En fazla üç haneli bir sayı girebilirsiniz.
cümlesi yazdırılacaktır.
Dolayısıyla buradan anladığımıza göre,
Kod:
continue
Kod:
continue
Örnek Uygulamalar
Python programlama dilinde döngülerin neye benzediğini öğrendik. Bu bölünde ayrıca döngülerle birlikte kullanabileceğimiz başka araçları da tanıdık. Şimdi dilerseniz bu öğrendiklerimizi pekiştirmek için birkaç ufak çalışma yapalım.
Karakter Dizilerinin İçeriğini Karşılaştırma
Diyelim ki elinizde şöyle iki farklı metin var:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
Siz burada, ilk_metin adlı değişken içinde bulunan, ama ikinci_metin adlı değişken içinde bulunmayan öğeleri ayıklamak istiyorsunuz. Yani bu iki metnin içeriğini karşılaştırıp, farklı öğeleri bulmayı amaçlıyorsunuz. Bu işlem için, bu bölümde öğrendiğimiz döngülerden ve daha önce öğrendiğimiz başka araçlardan yararlanabilirsiniz. Şimdi dikkatlice bakın:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
for s in ilk_metin:
if not s in ikinci_metin:
print(s)
Bu kodları bir dosyaya kaydedip çalıştırdığımızda şu çıktıyı alıyoruz:
a
a
ş
ş
a
Demek ki ilk_metin adlı değişkende olup da ikinci_metin adlı değişkende olmayan öğeler bunlarmış...
Bu kodlarda anlayamayacağınız hiçbir şey yok. Ama dilerseniz biz yine de bu kodları tek tek inceleyelim.
İlk olarak değişkenlerimizi tanımladık:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
Amacımız ilk_metin‘de olan, ama ikinci_metin‘de olmayan öğeleri görmek. Bunun için ilk_metin‘deki öğeleri tek tek ikinci_metin‘deki öğelerle karşılaştırmamız gerekiyor. Tahmin edebileceğiniz gibi, bir metnin bütün öğelerine tek tek bakabilmenin en iyi yolu
Kod:
for
for s in ilk_metin: #ilk_metin'deki, 's' adını verdiğimiz bütün öğeler için
if not s in ikinci_metin: #eğer 's' adlı bu öğe ikinci_metin'de yoksa
print(s) #'s' adlı öğeyi ekrana bas
Gördüğünüz gibi, döngüleri (
Kod:
for
Kod:
if
Kod:
for
- ilk_metin içindeki bütün öğelerin üzerinden geçiyoruz,
- Bu öğeleri belli bir ölçüte göre süzüyoruz,
- Ölçüte uyan öğeleri ekrana basıyoruz.
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
for s in ikinci_metin: #ikinci_metin'deki, 's' adını verdiğimiz bütün öğeler için
if not s in ilk_metin: #eğer 's' adlı bu öğe ilk_metin'de yoksa
print(s) #'s' adlı öğeyi ekrana bas
Bu da bize şu çıktıyı veriyor:
u
ı
o
r
y
e
u
ı
r
u
e
e
e
u
Gördüğünüz gibi, yaptığımız tek şey, ilk_metin ile ikinci_metin‘in yerlerini değiştirmek oldu. Kullandığımız mantık ise değişmedi.
Bu arada, yukarıdaki çıktıda bizi rahatsız eden bir durum var. Çıktıda bazı harfler birbirini tekrar ediyor. Aslında temel olarak sadece şu harfler var:
u
ı
o
r
y
e
Ama metin içinde bazı harfler birden fazla sayıda geçtiği için, doğal olarak çıktıda da bu harfler birden fazla sayıda görünüyor. Ama tabii ki, eğer biz istersek farklı olan her harften yalnızca bir tanesini çıktıda görmeyi de tercih edebiliriz. Bunun için şöyle bir kod yazabiliriz:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
fark = ""
for s in ikinci_metin:
if not s in ilk_metin:
if not s in fark:
fark += s
print(fark)
Burada da anlayamayacağımız hiçbir şey yok. Bu kodlardaki bütün parçaları tanıyoruz. Herzamanki gibi öncelikle değişkenlerimizi tanımladık:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
Daha sonra fark adlı boş bir karakter dizisi tanımlıyoruz. Metinler içindeki farklı karakter dizilerini fark adlı bu karakter dizisi içinde depolayacağız.
Ardından da
Kod:
for
for s in ikinci_metin: # ikinci_metin'de 's' dediğimiz bütün öğeler için
if not s in ilk_metin: # eğer 's' ilk_metin'de yoksa
if not s in fark: # eğer 's' fark'ta da yoksa
fark += s # bu öğeyi fark değişkenine ekle
print(fark) # fark değişkenini ekrana bas
Uyguladığımız mantığın ne kadar basit olduğunu görüyorsunuz. Bu kodlarda basitçe şu işlemleri yapıyoruz:
- ikinci_metin değişkeni içindeki bütün öğelerin üzerinden tek tek geç,
- Eğer bu değişkendeki herhangi bir öğe ilk_metin‘de ve fark‘ta yoksa o öğeyi fark‘a ekle.
- Son olarak da fark‘ı ekrana bas.
Python programlama dilinde önceden oluşturduğumuz bir karakter dizisini başka bir karakter dizisi ile birleştirdiğimizde bu işlem ilk oluşturduğumuz karakter dizisini etkilemez. Yani:
>>> a = 'istihza'
>>> a + '.com'
'istihza.com'
Burada sanki a adlı özgün karakter dizisini değiştirmişiz ve ‘istihza.com’ değerini elde etmişiz gibi görünüyor. Ama aslında a‘nın durumunda hiçbir değişiklik yok:
>>> a
'istihza'
Gördüğünüz gibi, a değişkeninin değeri hâlâ ‘istihza’. Bu durumun nedeni, birleştirme işlemlerinin bir değiştirme işlemi olmamasıdır. Yani mesela iki karakter dizisini birleştirdiğinizde birleşen karakter dizileri üzerinde herhangi bir değişiklik olmaz. Bu durumda yapabileceğimiz tek şey, karakter dizisine eklemek istediğimiz öğeyi de içeren yeni bir karakter dizisi oluşturmaktır. Yani:
>>> a = 'istihza'
>>> a = a + '.com'
>>> print(a)
istihza.com
Burada sanki değeri ‘istihza’ olan a adlı bir değişkene ‘.com’ değerini eklemişiz gibi görünüyor, ama aslında biz burada a değişkenini yok edip, ‘istihza.com’ değerini içeren, a adlı başka bir değişken tanımladık. Bu durumu nasıl teyit edeceğinizi biliyorsunuz:
>>> a = 'istihza'
>>> id(a)
15063200
>>> a = a + '.com'
>>> id(a)
15067960
Burada
Kod:
id()
Kod:
a = a + '.com'
Bu arada, eğer istersek yukarıdaki değer atama işlemini, önceki bölümlerde öğrendiğimiz değer atama işleçleri yardımıyla kısaltabileceğimizi de biliyorsunuz:
>>> a += '.com'
İşte ilk_metin ile ikinci_metin değişkenleri arasındaki farklı harfleri yalnızca birer kez yazdırmak için kullandığımız kodlarda da yukarıdaki işlemi yaptık:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
fark = ''
for s in ikinci_metin:
if not s in ilk_metin:
if not s in fark:
fark += s
print(fark)
Gördüğünüz gibi, önce boş bir fark değişkeni oluşturduk. Daha sonra bu değişkene
Kod:
for
Kod:
fark += s
Programın başındaki ve sonundaki fark değişkenlerinin aslında birbirinden farklı olduğunu teyit etmek için şu kodları kullanabilirsiniz:
ilk_metin = "asdasfddgdhfjfdgdşfkgjdfklgşjdfklgjdfkghdfjghjklsdhajlsdhjkjhkhjjh"
ikinci_metin = "sdfsuıdoryeuıfsjkdfhdjklghjdfklruseldhfjlkdshfljskeeuf"
fark = ""
print("fark'ın ilk tanımlandığı zamanki kimlik numarası: ", id(fark))
for s in ikinci_metin:
if not s in ilk_metin:
if not s in fark:
fark += s
print("fark'ın program sonundaki kimlik numarası: ", id(fark))
Gördüğünüz gibi, gerçekten de ortada iki farklı fark değişkeni var. Bu durumu
Kod:
id()
Peki bu bilginin bize ne faydası var?
Şimdilik şu kadarını söyleyelim: Eğer o anda muhatap olduğunuz bir veri tipinin mizacını, huyunu-suyunu bilmezseniz yazdığınız programlarda çok kötü sürprizlerle karşılaşabilirsiniz. Birkaç bölüm sonra başka veri tiplerini de öğrendikten sonra bu durumu daha ayrıntılı bir şekilde inceleyeceğiz.
Bu arada, tahmin edebileceğiniz gibi yukarıdaki
Kod:
for
for s in ikinci_metin:
if not s in ilk_metin and not s in fark:
fark += s
Burada iki farklı
Kod:
if
Bu örnek ile ilgili söyleyeceklerimiz şimdilik bu kadar. Gelin biz şimdi isterseniz bilgilerimizi pekiştirmek için başka bir örnek daha yapalım.
Dosyaların İçeriğini Karşılaştırma
Bir önceki örnekte karakter dizilerinin içeriğini nasıl karşılaştırabileceğimizi gösteren bir örnek vermiştik. Şimdi de, gerçek hayatta karşınıza çıkması daha olası bir durum olması bakımından, dosyaların içeriğini nasıl karşılaştıracağımıza dair bir örnek verelim.
Esasında karakter dizilerinin içeriğini birbirleriyle nasıl karşılaştırıyorsak, dosyaların içeriğini de benzer şekilde karşılaştırabiliriz. Mesela içeriği şu olan isimler1.txt adlı bir dosyamız olduğunu varsayalım:
Ahmet
Mehmet
Sevgi
Sinan
Deniz
Ege
Efe
Ferhat
Fırat
Zeynep
Hazan
Mahmut
Celal
Cemal
Özhan
Özkan
Yine içeriği şu olan bir de isimler2.txt adlı başka bir dosya daha olduğunu düşünelim:
Gürsel
Mehmet
Sevgi
Sami
Deniz
Ege
Efe
Ferhat
Fırat
Tülay
Derya
Hazan
Mahmut
Tezcan
Cemal
Özhan
Özkan
Özcan
Dilek
Amacımız bu iki dosyanın içeriğini karşılaştırıp, farklı öğeleri ortaya sermek. Dediğimiz gibi, bir önceki örnekte izlediğimiz yolu burada da takip edebiliriz. Dikkatlice bakın:
d1 = open("isimler1.txt") # dosyayı açıyoruz
d1_satırlar = d1.readlines() # satırları okuyoruz
d2 = open("isimler2.txt")
d2_satırlar = d2.readlines()
for i in d2_satırlar:
if not i in d1_satırlar:
print(i)
d1.close()
d2.close()
Gerçekten de mantığın bir önceki örnekle tamamen aynı olduğunu görüyorsunuz. Biz henüz Python’da dosyaların nasıl işleneceğini öğrenmedik, ama daha önce gördüğümüz
Kod:
open()
Burada farklı olarak
Kod:
readlines()
Bu arada, eğer çıktıda Türkçe karakterleri düzgün görüntüleyemiyorsanız
Kod:
open()
d1 = open("isimler1.txt", encoding="utf-8") # dosyayı açıyoruz
d1_satırlar = d1.readlines() # satırları okuyoruz
d2 = open("isimler2.txt", encoding="utf-8")
d2_satırlar = d2.readlines()
for i in d2_satırlar:
if not i in d1_satırlar:
print(i)
d1.close()
d2.close()
Bu şekilde Türkçe karakterleri düzgün bir şekilde görüntüleyebiliyor olmanız lazım. Eğer Windows’ta Türkçe karakterleri hala düzgün görüntüleyemiyorsanız encoding parametresinde ‘utf-8’ yerine ‘cp1254’ adlı dil kodlamasını kullanmayı deneyebilirsiniz:
encoding = "cp1254"
Yukarıdaki örneklerde bir içerik karşılaştırması yapıp, farklı öğeleri ayıkladık. Aynı şekilde benzer öğeleri ayıklamak da mümkündür. Bu işlemin nasıl yapılacağını az çok tahmin ettiğinizi zannediyorum:
d1 = open("isimler1.txt")
d1_satırlar = d1.readlines()
d2 = open("isimler1.txt")
d2_satırlar = d2.readlines()
for i in d2_satırlar:
if i in d1_satırlar:
print(i)
d1.close()
d2.close()
Burada bir öncekinden farklı olarak
Kod:
if not i in d2_satırlar
Kod:
if i in d2_satırlar
Dosyalar üzerinde yaptığımız işlemleri tamamladıktan sonra
Kod:
close()
d1.close()
d2.close()
Karakter Dizisindeki Karakterleri Sayma
Yukarıdaki örneklerde içerik karşılaştırmaya ilişkin birkaç örnek verdik. Şimdi yine bilgilerimizi pekiştirmek için başka bir konuya ilişkin örnekler verelim.
Mesela elimizde şöyle bir metin olduğunu varsayalım:
Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı
tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,
isminin Python olmasına aldanarak, bu programlama dilinin, adını piton
yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama
dilinin adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini,
The Monty Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying
Circus adlı gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar
gerçek böyle olsa da, Python programlama dilinin pek çok yerde bir yılan
figürü ile temsil edilmesi neredeyse bir gelenek halini almıştır.
Yapmamız gereken bir istatistik çalışması gereğince bu metinde her harfin kaç kez geçtiğini hesaplamanız gerekiyor.
Bunun için şöyle bir program yazabiliriz:
metin = """Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı
tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,
isminin Python olmasına aldanarak, bu programlama dilinin, adını piton
yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama dilinin
adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini, The Monty
Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying Circus adlı
gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar gerçek böyle olsa
da, Python programlama dilinin pek çok yerde bir yılan figürü ile temsil
edilmesi neredeyse bir gelenek halini almıştır."""
harf = input("Sorgulamak istediğiniz harf: ")
sayı = ''
for s in metin:
if harf == s:
sayı += harf
print(len(sayı))
Burada öncelikle metnimizi bir değişken olarak tanımladık. Ardından da kullanıcıya hangi harfi sorgulamak istediğini sorduk.
Bu kodlarda tanımladığımız sayı adlı değişken, sorgulanan harfi, metinde geçtiği sayıda içinde barındıracaktır. Yani mesela metin 5 tane a harfi varsa sayı değişkeninin değeri aaaaa olacaktır.
Sonraki satırlarda
Kod:
for
for s in metin: # metin içinde 's' adını verdiğimiz herbir öğe için
if harf == s: # eğer kullanıcıdan gelen harf 's' ile aynıysa
sayı += harf # kullanıcıdan gelen bu harfi sayı değişkenine yolla
Dediğimiz gibi, sayı değişkeni, sorgulanan harfi, metinde geçtiği sayıda barındırıyor. Dolayısıyla bir harfin metinde kaç kez geçtiğini bulmak için sayı değişkeninin uzunluğunu yazdırmamız yeterli olacaktır:
print(len(sayı))
Dilerseniz yukarıdaki programı yazmak için daha farklı bir mantık da kullanabilirsiniz. Dikkatlice bakın:
metin = """Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı
tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,
isminin Python olmasına aldanarak, bu programlama dilinin, adını piton
yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama dilinin
adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini, The Monty
Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying Circus adlı
gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar gerçek böyle olsa
da, Python programlama dilinin pek çok yerde bir yılan figürü ile temsil
edilmesi neredeyse bir gelenek halini almıştır."""
harf = input("Sorgulamak istediğiniz harf: ")
sayı = 0
for s in metin:
if harf == s:
sayı += 1
print(sayı)
Burada sayı değişkeninin ilk değeri 0 olarak belirledik. Döngü içinde de, sorgulanan harfin metin içinde her geçişinde sayı değişkeninin değerini 1 sayı artırdık. Dolayısıyla sorgulanan harfin metinde kaç kez geçtiğini bulmak için sayı değişkeninin son değerini yazdırmamız yeterli oldu.
Dosya içindeki Karakterleri Sayma
Dilerseniz bir önceki örnekte kullandığımız metnin program içinde bir değişken değil de, mesela bir dosyadan okunan bir metin olduğunu varsayalım şimdi:
hakkında = open("hakkında.txt", encoding="utf-8")
harf = input("Sorgulamak istediğiniz harf: ")
sayı = 0
for karakter_dizisi in hakkında:
for karakter in karakter_dizisi:
if harf == karakter:
sayı += 1
print(sayı)
hakkında.close()
Burada yaptığımız ilk iş elbette dosyamızı açmak oldu:
hakkında = open("a1.txt", encoding="utf-8")
Bu komutla, hakkında.txt adlı dosyayı UTF-8 kodlaması ile açtık. Daha sonra kullanıcıya, sorgulamak istediği harfi soruyoruz:
harf = input("Sorgulamak istediğiniz harf: ")
Ardından da sorgulanan harfin dosyada kaç kez geçtiği bilgisini tutacak olan sayı adlı bir değişken tanımlıyoruz:
sayı = 0
Sıra geldi
Kod:
for
for karakter_dizisi in hakkında:
for karakter in karakter_dizisi:
if harf == karakter:
sayı += 1
Bu döngüyü anlamakta bir miktar zorlanmış olabilirsiniz. Her zaman söylediğimiz gibi, Python’da bir kod parçasını anlamanın en iyi yöntemi, gerekli yerlere
Kod:
print()
for karakter_dizisi in hakkında:
print(karakter_dizisi)
#for karakter in karakter_dizisi:
# if harf == karakter:
# sayı += 1
Gördüğünüz gibi, ilk
Kod:
for
Kod:
print()
Çıktıya baktığımız zaman, şöyle bir durumla karşılaşıyoruz:
Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı
tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,
isminin Python olmasına aldanarak, bu programlama dilinin, adını piton
yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama dilinin
adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini, The Monty
Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying Circus adlı
gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar gerçek böyle olsa
da, Python programlama dilinin pek çok yerde bir yılan figürü ile temsil
edilmesi neredeyse bir gelenek halini almıştır.
Burada herbir satır ayrı bir karakter dizisidir. Eğer herbir satırın ayrı bir karakter dizisi olduğunu daha net bir şekilde görmek istiyorsanız
Kod:
repr()
for karakter_dizisi in hakkında:
print(repr(karakter_dizisi))
#for karakter in karakter_dizisi:
# if harf == karakter:
# sayı += 1
Bu kodlar bu kez şöyle bir çıktı verir:
'Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı\n'
'tarafından 90’lı yılların başında geliştirilmeye başlanmıştır. Çoğu insan,\n'
'isminin Python olmasına aldanarak, bu programlama dilinin, adını piton\n'
'yılanından aldığını düşünür. Ancak zannedildiğinin aksine bu programlama dilinin\n'
'adı piton yılanından gelmez. Guido Van Rossum bu programlama dilini, The Monty\n'
'Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying Circus adlı\n'
'gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar gerçek böyle olsa\n'
'da, Python programlama dilinin pek çok yerde bir yılan figürü ile temsil\n'
'edilmesi neredeyse bir gelenek halini almıştır.'
Bu çıktıya çok dikkatlice bakın.
Kod:
repr()
Biz yazdığımız kodlarda, kullanıcıdan bir harf girmesini istiyoruz. Kullandığımız algoritma gereğince bu harfi metindeki karakter dizileri içinde geçen herbir karakterle tek tek karşılaştırmamız gerekiyor.
Kod:
input()
Kod:
for
Kod:
for
Kod:
for
Kod:
for
for karakter_dizisi in hakkında:
for karakter in karakter_dizisi:
...
Böylece iç içe iki
Kod:
for
Kod:
print()
hakkında = open("hakkında.txt", encoding="utf-8")
harf = input("Sorgulamak istediğiniz harf: ")
sayı = 0
for karakter_dizisi in hakkında:
for karakter in karakter_dizisi:
print(karakter)
# if harf == karakter:
# sayı += 1
#print(sayı)
karakter değişkenin değerini ekrana yazdırarak Python’ın alttan alta neler çevirdiğini daha net görebiliyoruz.
Kodların geri kalanında ise, kullanıcının sorguladığı harfin,
Kod:
for
Son olarak da, ilk başta açtığımız dosyayı kapatıyoruz:
hakkında.close()
kaynak:http://belgeler.istihza.com/py3/donguler.html
[img=0x200]http://i.hizliresim.com/vL7jVO.png[/img]