Python Dersleri

Merhaba dostlar,

Şu yazımda Python programlama diline ait ders vereceğimden bahsetmiştim. Ders içeriklerini paylaştıkça, bu yazıyı da güncelleyeceğim.

Geri bildirimlere göre ders içeriğini değiştirecek veya güncelleyeceğim,
Şimdiden iyi seyirler!

  1. [Ders 1] – Python Programlama Dersleri – Kurulum
  2. [Ders 2] – Python Programlama Dersleri – Hızlıca Python Programlama Dili Temelleri

 

Enis Kurtay YILMAZ

Python Ödevleri, Dersleri, Kod örnekleri hakkında

Merhaba dostlar,

Bu yazıyı okuyorsanız muhtemelen Google’da Python Kod Örnekleri yazarak beni buldunuz.

İletişim sayfasından beni arıyorsunuz, mesaj atıyorsunuz, WhatsApp uygulamasından yazıyorsunuz, farkındayım.

Kimisi sınav esnasında arıyor veya mesaj atıyor,
Kimisi ödev teslim tarihi yaklaşınca arıyor veya mesaj atıyor,
Kimisi ise gerçekten Python programlama dilini merak etmiş, bu yüzden arıyor veya mesaj atıyor.

Takdir edeceğiniz üzere, benim de bir iş hayatım ve özel hayatım var.
Yazdığınız zaman, sorunlarınıza veya isteklerinize hemen cevap veremiyorum, bunu her zaman anlayışla karşıladığınız için teşekkür ederim.

Bu konuya istinaden iki(2) yeni haberim var.

  1. Bundan sonra sitede python kod örnekleri ile python programlama dersleri yayınlayacağım. Duruma göre belki Django ile web site nasıl yapılır, ilerleyen derslerde bunu da ele alacağım. Artık dersler başladı. Şu linkten takip edebilirsiniz.
  2. Ödevlerinizde veya projelerinizde iki farklı şekilde yardımcı olacağım (Ödevlerinizde teslim süresinden en az 2-3 gün önce veya kurumsal projelerinizde büyüklüğüne  göre tahmini bitme süresinden önce haberleşme şartı ile):  
    1. Ücretli
    2. Ücretsiz

 

Neye göre ücretli, neye göre ücretsiz diye soruyor olabilirsiniz kendi kendinize.

  • Eğer ödeviniz veya projeniz tüm kodları teslim etmeye yönelik ise, elbette ücretli olacaktır.
    • Ödev, kurumsal projelere göre daha hızlı yapılabileceğinden ve öğrenci olduğunuzdan dolayı kedi tarifesinde olacaktır. Kedi tarifesi derken, sizden  elde edeceğim ücret, Kadıköy’deki ofisin bahçesinde gönül vermiş olduğumuz 19 kedinin günlük yemek ihtiyacını karşılayacaktır. Ödev büyüklüğüne göre iki(2), üç(3) günlük yemek tarifesi talep edebilirim. Kedi tarifesi en az 50 TL’dir, tarife değişiklik gösterebilir. Tamamlanması yirmi-dört (24) saatten az olan bütün ödevler bir(1) günlük sayılır. Bunun sebebi, sizin yapmanız gereken ödevi sizin yapmamanız ve mevcut vaktimi size ayırmam sebebim iledir. Ayrıca şunu da belirtmek isterim, madem öğrenci arkadaşlar görüyor, bilinçlensin isterim. Programlama derslerinin eğitimi ve sınavı, kağıt üstünde olmamalıdır. Gerekirse dilekçe yazın, uygulamalı ders olarak isteyin dersi ve sınavı. Çünkü bu yöntem ile sağlık bir eğitim almanız neredeyse imkansızdır. (Yakında bununla ilgili bir makale paylaşacağım).
    • Kurumsal Projeler, içeriği farklı, planlı ve daha çok vakit aldığından dolayı ücret tarifesi daha farklı olacaktır. Onu da karşılıklı istişare ile belirleyeceğiz.
  • Eğer ödeviniz veya projeniz bilgi almaya yönelik ise, elbette ücretsiz olacaktır.
    1. Ödev veya kurumsal proje içeriğinden bahsediniz, varsa örnekleri de gönderiniz.
    2. Hangi metotları kullanmalısınız, nasıl bir algoritma izlemelisiniz, varsa alternatifleri veya önceden yapılmışları vb. konuları tarafınıza söylerim. Kısacası şirket içerisinde kahve almaya giderken, kahve makinesi önünde karşılaşmış, “Geçen söyle bir sorun oldu.. şöyle yaptım, çözüldü..” kafasında iki yazılımcı gibi karşılıklı konuşuruz. Ödev veya projenizde bu konuşulanları uygular veya uygulamazsınız. (Amerika’dayken çok derlerdi, It’s up to you).

 

Şimdiden anlayışınız için teşekkür ederim.

Enis Kurtay YILMAZ

Python ile Anagram oluşturma

Merhaba dostlar.

Bugün, akşamüstü vakitlerinde Google’da “Python örnek kodlar” ve “Python örnekleri” diye arattırdım. Sonuçlar içerisinde bir web sitesine denk geldim ve Python ile Anagram (Bkz. Anagram Nedir?) oluşturduğunu iddia eden bir makale okudum. Mantık olarak çok az doğru gidilse de istenilen sonuca ulaşması imkansızdı iddia edilen makalede. Çünkü pek çok detay atlanmış ve düzensiz bir değer ortaya çıkıyordu. Bende emin olmak için kendim yapmaya karar verdim.

Yazının sonlarına doğru, Anagram tekniğinin doğru algoritmasını ve bunun kodlarını göreceksiniz. Ama “Ben hepsini okuyamam, kodu görsem anlarım arkadaş! Sen sadece kodları ver” diyorsan, tıkla bakalım.

Şimdi bahsettiğim web sitesini ve yukarıda yazdıklarımı bir kenara bırakıp; TÜBİTAK’ın yayınlamış olduğu aşağıdaki soruları nasıl cevaplarız, buna odaklanalım.

Görüntü 011
(Kaynak: TÜBİTAK UEKAE)

 

Önce algoritmayı ele alalım ve neyin ne ifade ettiğini bir kavrayalım.

Anagram tekniğinde; belirtilen cümle veya kelime içerisinde kaç adet harf olduğu tespit edilir ve ardından boşluk karakterler dikkate alınmaksızın, bulunan sonuç alfabetik sıraya alınarak yazılır. Örneğin “merhaba” kelimesini ele alalım. Kelime içerisindeki harfleri, adetleri ile beraber vermiş olduğumuz kelime bazında sıralayacak olursak şu sonuçları elde ederiz (Tablo 1).

Tablo 1: "merhaba" kelimesindeki harfler ve kaç adet olduğunun gösterilmesi
Tablo 1

Yukarıda Anagram için bulunan harf ve adetlerde alfabetik sıralama yaptığından da bahsetmiştik. Tablo 1’deki verileri alfabetik sıralamaya alacak olursak şöyle bir sonuç alacağız, “2a1b1e1h1m1r”.

Peki bu sonuç yeterli mi? Cevap kesinlikle hayır! Çünkü Anagram tekniğinde kodlanacak olan kelime veya cümle içerisindeki harflerden sadece bir tane varsa, sayısal değeri yazılmaz. Haliyle sonucumuz “2abehmr” şeklinde olmalıdır.

Bu nereden anlıyoruz?
TÜBİTAK’ın vermiş olduğu örneği tekrar inceleyelim. “Dünya güneşin etrafında döner” cümlesini ele alalım. İçerisindeki harfleri alfabetik bazında sıralayacak olursak, sonuç aşağıdaki gibi olacaktır (Tablo 2).

Tablo 2: "Dünya güneşin etrafında döner" kelimesindeki harfler ve kaç adet olduğunun gösterilmesi
Tablo 2

Tablo 2’yi tek satırlık bir düzene sokacak olursak bizim bulduğumuz sonuç “3a3D3e1f1g1ı1i5n1ö2r1ş1t2ü1y” şeklinde olacaktır. Peki TÜBİTAK’ın bu soruya vermiş olduğu cevap neydi? Sayfanın en başına gelerek bakıyoruz, bize verdiği cevap, “3a3d3efgıi5nö2rşt2üy” olarak belirtilmiş. Buradan iki sonuç çıkar:

  1. Dikkat ederseniz kelime içerisindeki f,g,ı,i,ş,y harflerinin başında 1 yazmamaktadır, yani sayısal değerini belirtmemiştir. Bu demek oluyor ki, kelime veya cümle içerisindeki tek harfler için sayısal değerini yazmamalıyız.
  2. Bulduğumuz sonuç ile TÜBİTAK’ın bulduğu sonuç arasında bir harf farkı vardır. “Dünya güneşin etrafında döner” cümlesindeki “D” harfi büyüktür. Bulduğumuz sonuç içerisinde “D” büyük iken, TÜBİTAK’ın verdiği sonuç içerisindeki “d” harfi küçüktür. Bu demek oluyor ki, kelime veya cümle içerisindeki harflerin hepsini küçük harf olarak dikkate almalıyız.

 

Buraya kadar Anagram tekniğinin inceliklerini fark etmişsinizdir.

Şimdi, Python’da yazdığım kodları ve bulduğu sonuçları paylaşıyorum. Detaylı anlatım devam edecektir..

Python ile TÜBİTAK sorusunun cevabını bulan kod.

# -*- coding: cp1254 -*-
__author__ = 'EnisKurtay'
import locale
locale.setlocale(locale.LC_ALL, "Turkish_Turkey.1254")
 
def anagram(cumle):
    cumle = cumle.lower()
    liste = []
    for s in set(cumle):
        if (str(s).isspace() == False) and (str(s).isalpha() == True):
            liste.append(s)
    liste.sort(key = locale.strxfrm)
 
    if (liste.__contains__("ı") == True) and (liste.__contains__("i") == True):
        liste.remove("i")
        liste.insert(liste.index("ı") + 1,"i")
 
    sonuc = ""
    for d in liste:
        if cumle.count(d) == 1:
            sonuc = sonuc + "{0}".format(d)
        else:
            sonuc = sonuc + "{0}{1}".format(cumle.count(d), d)
    return sonuc
 
#Birinci sorunun cevabı
print "TÜBİTAK Cevapları..\n(i) : {0}".format(anagram("Dünya güneşin etrafında döner"))
 
#Ikinci sorunun cevabı
tubitakCumleler = ["Su molekülünde üç atom vardır", "Yanma oksijen gerektirir", "Elmas karbondan oluşur"]
for s in tubitakCumleler:
    if anagram(s) == "2a3eg3ij2km2no3rsty":
        print "(ii): {0}".format(s)

Bulduğumuz cevabı da kanıtlayalım.

Görüntü 015


Detaylı Anlatım

Öncelikle anagram adında bir parametrik fonksiyon tanımladım:

def anagram(cumle):

Ardından “cumle” parametresine gelecek değeri, içerisinde bulunan harfleri tekrarlamayacak şekilde döngüye alıp bir listeye aktarıyorum. Fakat listeye aktarmadan önce, gelen değerin harf mi yoksa boşluk karakteri mi olduğuna dikkat ederek listeye aktarıyorum. Hemen bunun sonrasında bu listeyi alfabetik olarak sıralıyorum.

    cumle = cumle.lower()
    liste = []
    for s in set(cumle):
        if (str(s).isspace() == False) and (str(s).isalpha() == True):
            liste.append(s)
 
    #Aşağıdaki sort() fonksiyonun içerisindeki parametreyi birazdan açıklayacağım
    liste.sort(key = locale.strxfrm)

Ancak burada bir şey dikkatimi çekmişti, sizlerle paylaşmak isterim. Python ile Türkçe’de bulunan tüm harfleri içeren bir diziyi sıralamaya doğrudan aldığımda, Türkçe’de bulunan işaretli (ç, ö, ü, ş gibi) karakterlerin sıralamada en sonlarda belirdiğini gözlemledim. İnternette locale kullanarak türkçe karakterli işlemlerde setlocale yapmamız gerektiğini belirten bir yazıyla karşılaştım. Bu yüzden önce locale tanımlarımı yaptım ve ardından sort() fonksiyonun içerisinde böyle bir parametre yazdım.

locale ettikkten sonra herşeyin düzenli ancak “i” harfinin, “ı” harfinden önce geldiğini gördüm. İnternette bu sefer tam bir derinlemesine araştırma yaptım ve bunun çözümü ile alakalı pek çok şey okudum. Hiçbiri istediğim sonucu vermedi. UTF-8, Unicode yöntemleriyle çözmeye çalışıyorlardı fakat bana Windows – 1254 gerekiyordu. Düşünsenize bir kelime içerisindeki harfleri alfabetik sıraya soktunuz ve “cç”, “gğ”, “oö”, “sş”, “uü” harfleri düzenli & doğru gelirken, “iı” düzensiz geliyor(!) Tam bir saçmalık ve kabul edilemez bir durum!

Bende daha fazla vakit harcamamak ve bunun önüne geçmek için kısa bir çözüm buldum. Eğer bulduğum kelimelerin içerisinde “ı” ve “i” harfleri varsa, yerlerini değiştirmem benim için yeterliydi. Çünkü “ı” harfi yoksa, mantıklı olarak “i” harfi aslında olması gereken yerdedir alfabetik sıralamada. 🙂

if (liste.__contains__("ı") == True) and (liste.__contains__("i") == True):
        liste.remove("i")
        liste.insert(liste.index("ı") + 1,"i")

Ardından fonksiyonumuzun geri kalanını yazdım. Aşağıdaki kodlarda her harfin, kaç adet olduğunun bilgisini değişkene ekleyerek, fonksiyon içerisinde bulduğum sonucu “return” deyimi döndürdük.

sonuc = ""
    for d in liste:
        if cumle.count(d) == 1:
            sonuc = sonuc + "{0}".format(d)
        else:
            sonuc = sonuc + "{0}{1}".format(cumle.count(d), d)
    return sonuc

Geriye artık fonksiyonumuzu çağırmak kaldı. Tek yapmamız gereken fonksiyonu çağırırken içine parametre vermektir. Bende TÜBİTAK’ın verdiği soruları çözen kodları yazdım. Eğer siz sadece Anagram’daki değeri görmek istiyorsanız ‘print anagram(“cümle veya kelimenizi buraya yazın”)‘ demeniz yeterlidir.

#Birinci sorunun cevabı
print "TÜBİTAK Cevapları..\n(i) : {0}".format(anagram("Dünya güneşin etrafında döner"))
 
#Ikinci sorunun cevabı
tubitakCumleler = ["Su molekülünde üç atom vardır", "Yanma oksijen gerektirir", "Elmas karbondan oluşur"]
for s in tubitakCumleler:
    if anagram(s) == "2a3eg3ij2km2no3rsty":
        print "(ii): {0}".format(s)

Bir sonraki makalede görüşmek üzere.

Bu makalede geçen kodlar için : https://github.com/eniskurtayyilmaz/Python27/blob/master/anagram.py
Enis Kurtay YILMAZ

Python ile temel dosya işlemleri

Merhaba dostlar.
Bugünkü makalede Python programlama dili ile temel dosya işlemlerini, yeni öğrenenler açısından basit düzeyde gerçekleştireceğiz.

Programlama ile uğraşıyorsanız, er yada geç uğraşacağınız şeyden biri de dosyalardır. Dosyalar içerisinde yapmak isteyeceğiniz işlemlerdir. Bir dosya içerisine veri yazmak veya okumak olabilir bunlar. Bunun için “IO” (input and output) bileşenini kullanmanız gerekmektedir. Bir dosya ile bağlantı kurmak için önce open() fonksiyonunu kullanacağız. Python ile hadi kodlayalım!

dosya = open("yazi.txt", "w")

Yukarıdaki örnekte çalıştığınız dizin üzerinde “yazi.txt” dosyası ile bağlantıyı dosya değişkenine aktararak bağlantısını gerçekleştiriyoruz. Eğer çalıştığınız dizin üzerinde “yazi.txt” diye bir dosya yoksa yeni bir tane oluşturacaktır. Bunun sebebi ise IO bileşeni içerisindeki tanımlanmış mode’tur. Yukarıda “w” yazdığımız yer, aslında bizim tanımladığımız bir mode. Dosya içerisine yazı yazabileceğimizi belirtir.

Modlardan genel olarak bahsedelim biraz. Aslında mode, bir dosya ile yapacağımız işlemden önce erişim tanımlamaktır. Örneğin bir dosyayı sadece okuma işlemleri için modunu “r” yapmamız (read/okuma) yeterlidir. Bu sayede ilgili dosya ile sadece okuma işlemi yapacağımızı belirtmiş oluruz. Doğal olarak okuma modunda açtığımız için, üzerine yazma gibi bir durumumuz söz konusu değildir. Biraz onlardan ve özelliklerinden bahsedelim bahsedelim bu esnada.

Mode Tanım & Açıklama
“r” Read/Okumak anlamına gelir. Bu Mode ile sadece okuma işlemleri yapılır. Eğer böyle bir mode tanımlamış ve ileriki kodunuzda yazma işlemi yapmaya çalıştığınızda hata alırsınız.

Eğer belirttiğiniz dizinde dosya yok ise, hata alırsınız.

“w” Write/Yazmak anlamına gelir. Bu mode ile yazma işlemi yapılır. Eğer belirttiğiniz dizinde dosya yok ise, yeni dosya yaratır.

Eğer belirttiğiniz dizinde dosya var ise önce içindekini siler, ardından tekrardan yeni dosya yaratır.

Örneğin a.txt dosyası içerisinde “Merhaba” yazıyor olsun. Yeni bir “Naber” satırı yazma işlemi gerçekleştirdiğinizde, dosyanız aşağıdaki gibi gözükür.

Naber

“a” Append/Eklemek anlamına gelir. Bu Mode ile mevcut olanın üzerine eklemeler yapar. Eğer belirttiğiniz dizinde dosya yok ise, yeni dosya yaratır.

Eğer belirttiğiniz dizinde dosya var ise dosya içerisindeki yazanlara bir hamlede bulunmaz, yazacağınız yeni içeriği dosyaya ilave eder.

Örneğin a.txt isminde bir dosyanız olsun içerisinde “Merhaba” yazıyor olsun. Siz “a” modunda bağlanıyorsanız ve dosya içerisine yeni bir “Naber” satırı yazma işlemi gerçekleştirdiğinizde, dosyanız aşağıdaki gibi gözükür.

Merhaba
Naber

Bu modlara ek olarak, “w+”, “a+” gibi tanımlarda vardır. Temel anlamda gittiğimiz için başka bir makalede bunlardan bahsedeceğim.

Şimdi Python ile yazi.txt diye bir dosya oluşturalım ve ardından “merhaba\nnaber” yazdıralım. Bildiğiniz üzere “\n” kaçış dizisi ile “naber” yazısının bir alt satıra inmesini sağlayacağız.

dosya = open("yazi.txt","w")
dosya.write("merhaba\nnaber")
dosya.close()

Yukarıdaki kod ile yazi.txt adında bir dosya oluşturuyoruz, tanımladığımız “w” mode ile. Ardından write() fonksiyonunu alt alta gelecek şekilde yazımızı yazdırıyoruz. Dosyaya girip, baktığınızda aşağıdaki gibi gözükecektir.

merhaba
naber

En sondaki close() fonksiyonu ise bu dosya ile işimizin bittiğini, mevcut bağlantının ise sonlandırılmasını belirtiyoruz.

Peki mevcut olan bu dosyayı nasıl okutturabiliriz?

dosya = open("yazi.txt","r")
icerik = dosya.read()
dosya.close()
print satir

Yukarıda fark ettiyseniz, “r” yani okuma modunda dosyaya bağlandım. Ardından icerik adındaki değişkene, read() fonksiyonunu kullanarak dosya içerisindeki tüm verileri aktardım, dosya bağlantısını sonlandırdım. Son satırda da icerik adındaki değişkenin içerisindekini ekrana yazdırdım. Karşınıza aşağıdaki sonuç çıkacaktır.

merhaba
naber

Son bir örnek daha yapalım, bu sefer “a” modunda olsun yani mevcut olanın üzerine eklemeler yapalım “Append” ile.

dosya = open("yazi.txt","a")
dosya.write("iyi senden naber?")
dosya.close()

Bu sefer modu “a” yaptık ve dosya içerisine “iyi senden naber?” yazdık. Ardından mevcut bağlantıyı sonlandırdık.

Peki dosya içerisine girdiğimizde ne görmüş olacağız, ona da bakalım dilerseniz. Aşağıdaki gibi veriler gösterilecektir.

merhaba
naberiyi senden naber?

“naber” ve “iyi senden naber?” neden yanyana oldu? Çünkü kaçış dizisi veya boşluk kullanmadığımız için böyle bir şey gerçekleşti. Yukarıda kaçış dizisini hatırlamışsınızdır “\n” şeklindeydi.

Burası önemli! Çünkü buradan bir sonuç daha çıkarabiliriz. Demek ki write() fonksiyonu satır satır yazmıyor. İmlecin son durduğu yerden yazmaya başlıyor demektir. İpucu isterseniz, alt satıra geçmek için “\n” kaçış dizilerini kullanabiliriz.

Bir sonraki makalede görüşmek dileğiyle.

K. YILMAZ

Python ile girilen tek ve çift sayıların toplamı

Uzun bir süreden sonra tekrardan merhabalar..
Hayatımda son gelişmeleri kısaca özetlemek gerekirse, yaklaşık yedi gün önce(12/06/2015) üniversiteyi bitirdim ve bitirdiğimin ertesi haftasında İzmir’de yazılım geliştirme uzmanı olarak işe başladım..

Bu aralar yeni bir programlama dili öğreniyorum (Python) ve başlangıç seviyesindeki (beginner) arkadaşlar için örnek kod teşkil etmek adına bu yazıyı yazıyorum.

Şimdi dilerseniz şöyle bir senaryo düşünelim..
Bir kullanıcı, altı (6) tane sayıyı girerek, bu sayıların tek/çift durumlarına göre toplamlarını öğrenmek istiyor olsun. Başka bir kullanıcı da oniki (12) sayıyı girmek istiyor olsun.

Yazılımcı ve matematikçi gözden bakacak olursak, bir sayının tek veya çift durumu anlamak için “Sayı 2’ye tam bölündüğünde kalan veriyor mu, vermiyor mu?” durumuna bakmak yeterlidir.

Örneğin 4 sayısını ele alalım. 4 sayısını 2’e böldüğünüzde, kalan sıfırdır. Bildiğiniz üzere programlamada bir sayının modunu almak % işareti ile tanımlanmıştır.

Yukarıdaki senaryoyu dikkate alırsak aslında kullanıcının gireceği sayıların farklı ve değişken olma söz konusu vardır. Örneğin bir kullanıcı altı adet sayıyı hesaplamak istiyor, diğer kullanıcı ise oniki sayıyı..
Haliyle ilk olarak yapacağımız şey, kullanıcının kaç sayıyı hesaplamak istediğini bilmemizdir. Hem bu sayede döngüyü kullanarak girilen sayıların, tek mi çift mi olduğunu anlayabiliriz öyle değil mi?

Şimdi size bu senaryoya göre Python dilinde yazdığım kodları paylaşıyorum.
İyi kodlamalar.

# -*- coding: cp1254 -*-
__author__ = 'EnisKurtay'
 
kac_sayigirilecek = raw_input("Kaç sayı gireceksiniz? : ")
sayilar = []
toplam_teksayilar = 0
toplam_ciftsayilar = 0
 
for sayi in range(0,int(kac_sayigirilecek)):
        sayilar.append(int(raw_input("{0}. sayıyı giriniz : ".format(sayi + 1))))
        if sayilar[sayi] % 2 == 0:
            toplam_ciftsayilar = toplam_ciftsayilar + sayilar[sayi]
        else:
            toplam_teksayilar = toplam_teksayilar + sayilar[sayi]
 
print "Tek sayıların toplamı : {0}\n" \
      "Çift sayıların toplamı : {1}\n" \
      "Toplamda {2} sayı girildi.".format(toplam_teksayilar,toplam_ciftsayilar,kac_sayigirilecek)

K. YILMAZ