arşiv

yazılar buna göre etiketlendi; ‘Python’

Python 3 ve Python 2

Çarşamba, 28 Tem 2010

Python 3.x serisinin ilk kararlı sürümü 3 Aralık 2008 tarihinde yayımlandı. Ancak Python 3 eski sürümlerle uyumlu olmadığı için insanlar hala Python 3′e geçmekte tereddüt ediyor. Çünkü hem etraftaki Python programları, hem Python’la ilgili kaynaklar hem de önemli üçüncü şahıs modülleri henüz Python 3′e taşınmadı. Dolayısıyla, henüz Python 3′e taşınmamış modüllere bağımlılık duyan Python programlarının yazarları 3.x’e geçiş konusunda (haklı olarak) ayak diretiyor.

Python geliştiricileri, bir yandan Python 3′ü geliştirmekle uğraşırken, bir yandan da insanların Python 3′e geçişini hızlandırmak ve korkuları gidermek için bilgilendirici ve yüreklendirici makaleler yayımlıyor. Bu yüreklendirici makalelerden biri de http://wiki.python.org/moin/Python2orPython3 adresinde bulunuyor. Bu makalede, Python kullanıcılarının sıklıkla sorduğu “Python 3′ü mü yoksa Python 2′yi mi kullanmalıyım?” sorusuna bir cevap vermeye çalışıyor Python geliştiricileri…

Bu soruyu İngilizce bilmeyenlerin de sorduğunu dikkate alarak, yukarıdaki bağlantıda verdiğim makaleyi Türkçe’ye çevirdim.

İşinize yaraması dileğiyle…

Not: Özgün makaleyi hızlı bir şekilde Türkçe’ye çevirdiğim için çeviride bazı aksaklıklar gözünüze çarpabilir. Çeviri metin üzerinde iyileştirme çalışmaları yapmaya devam edeceğim. Ayrıca özgün metin üzerinde değişiklikler olursa, bu değişiklikleri çeviri metne de yansıtacağım. O yüzden bu günlük girdisini zaman zaman ziyaret etmenizde fayda olabilir…

Fırat Özgül

************************************

Geliştirme çalışmalarım için Python 2’yi mi yoksa Python 3’ü mü kullanmalıyım?

Bu ikisinin farkı nedir?

Kısa cevap: Python 2.x dilin süregelen durumunu temsil eder. Python 3.x ise yepyeni, pırıl pırıl bir dildir.

Bu makalenin yazıldığı sırada (4 Temmuz 2010) Python’ın kararlı 2.7 sürümü yayımlanmış, serinin bu son sürümünün uzun süre destekleneceği de ifade edilmişti. 2.7’den sonra 2.x serisinde artık başka bir ana sürüm olmayacak. 3.x serisi etkin bir şekilde geliştirilmeye devam ediyor. Bu serinin 3.1 sürümü yayımlandı. 3.2 sürümü ise bu yılın sonuna doğru yayımlanacak.

3.x, Python’un en yeni dalı olup bu dilin geleceğidir. Python programlama dilinin baş geliştiricisi Guido Van Rossum, 2.x serisindeki sürümlerin aksine geriye dönük uyumluluğu gözardı ederek Python 2.x üzerinde adamakıllı bir temizlik yapmaya karar verdi. Bu yaklaşım sayesinde dilin bazı temel yönleri (mesela print ve exec’in birer deyim olması, tamsayılarda taban bölme kullanılması), bu dili yeni öğrenenler için daha kolay anlaşılır bir hale getirilebilme imkanına kavuşurken, bu yönlerin dilin geri kalanıyla da daha uyumlu olması sağlanabilecek. Böylelikle dile yakın zamanda eklenmiş özelliklerin (mesela döngü kurucular) dilde eskiden beri varolan özelliklere uyarlanması da mümkün olacak (mesela range gömülü fonksiyonunun 2.x serisinde liste döndürürken, 3.x serisinde döngü kurucu döndürmesi).

Python 3.0’daki Yenilikler adlı belgede dildeki başlıca değişiklikler ve mevcut 2.x kodlarıyla olan muhtemel uyumsuzluklar gayet güzel bir şekilde özetleniyor.

Geçen yıllar içinde geniş Python ekosistemi çok sayıda kaliteli yazılım ortaya çıkardı. 3.x serisiyle birlikte geriye dönük uyumluluğun ortadan kaldırılmasının dezavantajı, bu yazılımların 3.x serisinde çalışmaz hale gelecek olmasıdır.

O halde hangi sürümü kullanmalıyım?

Hangi sürümü kullanmanız gerektiği, çoğunlukla amacınızın ne olduğuna bağlıdır.

Yapmak istediğiniz şeyi Python 3.x ile yapabiliyorsanız ne ala! Python 3.x’te nispeten kısıtlı sayıda kütüphane desteği olması ve mevcut GNU/Linux dağıtımları ile Mac’lerin hala öntanımlı olarak 2.x sürümleriyle birlikte gelmesi gibi birkaç dezavantaj dışında Python 3.x bir dil olarak her yönüyle kullanıma hazırdır. Python 3.x’in kullanıcılarınızın bilgisayarlarında bulunduğu (bu makaleyi okuyan pek çok kişinin sadece kendi için veya denetleyebildikleri bir hedef kitle için geliştirme yaptığını düşünürsek bunu sağlamak pek de zor olmasa gerek) ve üçüncü şahıs yazılımların eksikliğinin ayak bağı olmadığı (veya ihtiyacınız olan paketlerin Python 3’ü desteklediğini bildiğiniz) durumlarda Python 3.x kusursuz bir seçimdir. Ayrıca şu anda öntanımlı sürüm olarak kullanmasalar da pek çok GNU/Linux dağıtımı son kullanıcılar için Python 3.x paketleri sunabilmektedir.

Ancak yine de Python 3 yerine Python 2 kullanmanızı gerektiren bazı ciddi meselelerle karşılaşabilirsiniz.

Birincisi, eğer programınız denetiminiz dışındaki bir ortamda çalışacaksa, kullanacağınız Python sürümünü seçme özgürlüğünüz olmayabilir. Böyle bir durumda belli bir Python sürümü kullanmak durumunda kalabilirsiniz.

İkincisi, eğer henüz Python 3 ile uyumlu bir sürümü yayımlanmamış belli bir üçüncü şahıs paketi ya da uygulaması kullanmak istiyorsanız, üstelik bu paketi Python 3.x sürümüne taşımak hiç de kolay bir iş değilse, o paketten yararlanabilmek için Python 2’yi kullanmayı tercih edebilirsiniz.

Python 3’ü desteklemeyen önemli uygulamalar arasında Twisted (ağ programlama ve başka pek çok şey için kullanılan bir kütüphane), gevent (Twisted’a benzeyen, ama farklı özellikleri olan bir kütüphane), Django ve Pylons (web siteleri hazırlamaya yardımcı uygulamalar), PyGTK ve PySide (grafik arayüz tasarımı), py2exe (programlarınızı Windows için paketlemeye yarayan bir kütüphane), PIL (resim işleme) ve numpy (sayı işlemleri) sayılabilir…

Bu kütüphanelerin çoğu için Python 3.x uyumluluğu üzerinde, farklı aşamalara gelmiş birtakım çalışmalar yürütülüyor. Örneğin numpy üzerindeki çalışmalar tamamlanmak üzere. Bazı kütüphanelerde ise durum bir öncelik meselesinden ibaret. Mesela Twisted çoğunlukla üretim boyutundaki sunucuları hedeflediği için, dilde büyük değişiklikler getiren bir sürüme destek vermek şöyle dursun, Python’un eski sürümlerini desteklemek dahi büyük önem taşıyor. (Twisted, 3.x’e taşıma işleminin hiç de kolay olmadığı paketler denince akla gelen başlıca örnektir.)

Elbette 3.x’e taşınmış pek çok paket de var. Örneğin yazdıkları programlara grafik arayüz eklemek isteyenler PyGTK yerine PyQT veya standart kütüphane içinde gelen Tkinter’i kullanabilir. Python 3.x kullanmak istiyor, ama bir bağımlılıktan ötürü bundan çekiniyorsanız öncelikle biraz araştırma yapmak iyi bir fikir olabilir. Kütüphaneleri taşıma işlemi devam eden bir süreçtir. Ayrıca bu wiki sayfası da zaman zaman güncellenebilir.

Python 3’e geçişle ilgili başka bir sorun da referans kitaplar ve internet üzerindeki pek çok belgenin (örnek kodlar da dahil) hep Python 2.x üzerine olmasıdır. Bu sebeple Python 3 kullanabilmek için kaynaklarda bazı düzenlemeler yapmak gerekebilir. Aynı şekilde IRC üzerinden yardım almaya alışmış kişiler için konuşmak gerekirse, #python kanalının müdavimleri, henüz 3.x’e taşınmamış, eskiden beri kullanılan yazılımlara bel bağlayan güngörmüş geliştiricilerdir (Burada örnek olarak akla Twisted, Zope ve daha önce bahsettiğimiz paketler geliyor). Sonuç olarak, IRC üzerindeki geliştiriciler size Python 3.x ile ilgili veya Python 3.x’e taşınmış kütüphaneler ile ilgili sorunlar konusunda, Python 2.x konularında yardımcı olabildikleri kadar yardımcı olamayabilir. Aynı şey #python kanalı dışındaki ortamlar için de geçerlidir. Elbette bu durum yavaş yavaş düzeliyor. Ayrıca bazı problemler zannettiğiniz kadar 3.x’e özgü olmayabilir. Dolayısıyla #python kanalından veya alternatif kaynaklardan yardım istemek yine de iyi bir fikir olabilir. Her şeye rağmen, comp.lang.python gibi, 3.x kullanıcılarının bolca bulunduğu ve sorunlarınız için yardım alabileceğiniz önemli kanallar da mevcuttur.

Ama 2.x sürümünü bir kenara bırakmak en iyisi değil mi? Ne de olsa bu, pek çok hata barındıran eski bir dil. Üstelik bütün bu hatalar ortadan kalksın diye koca bir sürüm yayımlandı.

Aslında pek de öyle değil. İyi haber şu ki, sırf 2.x kullanıyorsunuz diye 3.x’in bütün nimetlerinden mahrum kalacaksınız diye bir kaide yok. 3.0 ile uygulamaya giren pek çok yenilik 2.6’ya da aktarıldı. Üstelik 3.0, 3.1 ve yakında yayımlanacak olan 3.2 ile gelen daha pek çok yenilik de 2.7 sürümüne aktarılacak. 2.x’te yapamayıp da 3.x’te yapabileceğiniz şeyler çok azdır. Ama 2.x ile yapabilecekleriniz, 3.x ile yapabilecekleriniz kadar şık ve zarif değildir. Yalnızca 3.x sürümlerinde bulunan ve muhtemelen 2.x serisine taşınmayacak olan bazı özellikler şöyle sınıflandırılabilir:

  1. Açıklamalı Fonksiyon Parametreleri (function annotations)
  2. Sadece isimli argümanlardan oluşan fonksiyonlara ait sözdizimi
  3. Genişletilmiş demet çözme
  4. Yerel olmayan değişken tanımlama

2.x’e taşınan özelliklere ilişkin ayrıntılı bilgi için bkz. Python 2.6’daki Yenilikler ve Python 2.7’deki Yenilikler

İyi yazılmış bir 2.x kodu 3.x koduna benzer. Ancak bunu sağlamak için bazı şeylere de dikkat etmeniz gerekecektir. Mesela yeni tipte sınıfları kullanmak, print’in eski ve küflenmiş kullanımlarından uzak durmak, mümkün olduğunca liste/demet/sözlük üreteçlerinden yararlanmak gibi… Buna şöyle bir örnek verebiliriz: İyi bir 2.x kodunda range yerine xrange kullanılır. xrange 3.x’teki range’e çok benzer (Tabii Python 3’teki range çok daha yeteneklidir, çünkü sys.maxint’in gösterdiği değerden çok daha fazlasını kullanabilir).

Her şeyden öte, 2.x’ten 3.x’e geçişin olabildiğince sancısız olabilmesi için iyi kod yazmaya odaklanmanızı öneriyoruz. Bununla, eksiksiz birim testleri yazmayı ve Unicode’u düzgün kullanabilmeyi kastediyoruz (Python 3.x, Unicode ve baytlar konusunda 2.x’e kıyasla daha tavizsizdir. Bu tavizsizlik iyi bir şey olarak kabul edilir, ama bu durum bazı yazılımların 3.x’e aktarılmasını da epey zorlaştırabilir).

Python 3’ü kullanmak istiyorum, ama elimde sadece Python 2.x ile çalışabilen küçük bir kütüphane var. Acaba Python 2 ile devam mı etmeliyim, yoksa o kütüphaneyi kullanmaktan vaz mı geçmeliyim?

Halihazırda Python 3’ü destekleyen alternatif bir paket bulamadığınızı varsayarsak, yine de önünüzde birkaç seçenek var:

  1. O kütüphaneyi 3.x’e taşıyabilirsiniz (“Taşımak”, o kütüphaneyi 3.x üzerinde çalışabilir hale getirmek demektir.)
  2. Eğer taşıma işlemi çok zor olacaksa ve programınızın öteki bütün bağımlılıkları 2.x ile çalışıyorsa siz de 2.x üzerinde çalışmaya devam edebilirsiniz. Başka yerlerde de ifade edildiği gibi, bütün bağımlılıklar başarıyla 3.x’e taşındıktan sonra, iyi yazılmış bir 2.x kodunu 3.x’e taşımak sancısız bir süreç olacaktır.
  3. O kütüphanenin kattığı özelliğin ne kadar önemli olduğunu kafanızda tartın. Kimbilir belki o kütüphaneyi programınızdan çıkarsanız da olur.

Arzu edilen, o kütüphaneyi 3.x’e taşımaktır. Genellikle birileri zaten bu iş üzerinde çalışıyordur. Değilse, kütüphanenin geliştiricileri bu konuda yardım teklifinizi çoğunlukla geri çevirmeyecektir. Çünkü taşıma işlemi hem özgün yazılım içindeki hataların bulunmasını sağlar, hem de özgün yazılımın ve 3.x’e taşınmış halinin kalitesini yükseltir. Taşıma işlemi her zaman o kadar kolay değildir. Ancak taşımak sıfırdan yazmaktan kolaydır.

Taşıma işleminin nasıl yapılacağı PEP 3000‘de açıklanmıştır. Ana fikir, söz konusu kütphanenin 2.x sürümünü alıp, Python 3’le uyumlu bir sürüm elde etmek için 2to3 adlı dönüşüm betiğini kullanmak ve bütün birim testlerinin 3.x sürümünde de geçer olup olmadığını kontrol etmektir. Eğer testler geçersizse özgün 2.x kaynağını düzenleyip aynı işlemi tekrar edin. Bu yaklaşım sayesinde tek bir 2.x kod tabanı üzerinden hem 2.x’i hem de 3.x’i kolayca destekleyebilirsiniz. Bu, 2.x ve 3.x dallarını ayrı ayrı desteklemekten çok daha kolaydır (Bunu bir de Python geliştiricilerine sorun. Ne de olsa onlar bu işi yıllardır yapıyor!).

Eğer kütüphane içinde C eklenti modülleri de varsa taşıma işlemi karmaşık bir hal alabilir, ancak böyle bir durumda bile muhtemelen taşıma işlemi kendi paketinizi sıfırdan yazmaktan kolay olacaktır.

Python vikisinde bu konuya ilişkin daha ayrıntılı kılavuzlar bulabilirsiniz: Python’u Py3k’ya Taşımak, Eklenti Modüllerini Py3k’ya Taşımak

3.x ile bir şeyler yazmaya karar verdim, ama şimdi bu yazdığım şeyi elinde sadece 2.x bulunan biri kullanmak istiyor. Ne yapmalıyım?

2.x kaynak kodlarından 3.x kodları üretilmesine olanak tanıyan 2to3 adlı aracın yanısıra, 3.x kodlarını 2.x koduna dönüştürmeyi amaçlayan 3to2 adlı bir betik de vardır. Teorik olarak, 3.x’te daha az pürüzlü nokta olduğu için (ne de olsa geriye dönük uyumluluğu kırmanın ana sebeplerinden biri de bu pürüzlü noktaları olabildiğince gidermekti!) 3to2 aracı daha iyi sonuç verecektir. Ancak 3.x’e özgü özellikleri (mesela açıklamalı fonksiyon parametreleri veya genişletilmiş demet çözme) bolca kullanan kodların başarıyla 2.x’e dönüştürülmesinin de pek mümkün olmayacağı bilinmelidir.

Ayrıca şu anda 3to2 aracının, 2to3 aracına kıyasla daha az kullanıldığını söyleyebiliriz. Dolayısıyla 3to2 aracında bazı aksaklıklarla karşılaşabilirsiniz. Ancak eğer 3.x kodları yazmak istiyorsanız elbette bu araç denemeye değer…

Python 2 ile Python 3 arasında seçim yapmanıza yardımcı olabilecek başka kaynaklar

#python tayfasından öğütler (aynı zamanda bu makalenin de ilham kaynağıdır): http://python-commandments.org/python3.html

Özellikle Python 3 üzerinden programlama öğretimi konusunda Nick Efford’un bazı önerileri var: http://www.comp.leeds.ac.uk/nde/papers/teachpy3.html

Mark Pilgrim Dive Into Python’ın Python 3’ü temel alan sürümünü yayımladı: http://diveintopython3.org/whats-new.html

“IronPython kullanıcılarının Python 3 hakkında bilmesi gerekenler”: http://www.itworld.com/development/104506/python-3-and-ironpython

istihza Python, istihza.com , , , ,

this Modülü İçindeki Şifreli Metin

Çarşamba, 16 Haz 2010

Python’daki sürpriz yumurtalar içinde en bilineni herhalde şudur:

>>> import this

Bu komutu verdiğinizde, Python’un felsefesini anlatan bir metin görürsünüz:

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

Ancak “this” modülü yukarıdaki metinden ibaret değildir. Bu modülün başka özellikleri de bulunur. Peki nedir bu özellikler?

Yukarıdaki çıktıyı veren “this” adlı modülün içeriğine baktığımızda şöyle bir şeyle karşılaşıyoruz:

>>> dir(this)
 
['__builtins__', '__doc__', '__file__', '__name__',
 '__package__', 'c', 'd', 'i', 's']

Demek ki “this” modülünün içinde “c”, “d”, “i” ve “s” adlı dört adet nitelik var. Ben bu yazıda sizin dikkatinizi “s” ve “d” niteliklerine çekmek istiyorum.

Önce “this” modülünün “s” niteliğini kontrol edelim:

>>> this.s
 
"Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf 
orggre guna htyl.\nRkcyvpvg vf orggre guna 
vzcyvpvg.\nFvzcyr vf orggre guna pbzcyrk.\nPbzcyrk 
vf orggre guna pbzcyvpngrq.\nSyng vf orggre guna 
arfgrq.\nFcnefr vf orggre guna qrafr.\nErnqnovyvgl 
pbhagf.\nFcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx 
gur ehyrf.\nNygubhtu cenpgvpnyvgl orngf chevgl.
\nReebef fubhyq arire cnff fvyragyl.\nHayrff rkcyvpvgyl 
fvyraprq.\nVa gur snpr bs nzovthvgl, ershfr gur grzcgngvba 
gb thrff.\nGurer fubhyq or bar-- naq cersrenoyl bayl bar 
--boivbhf jnl gb qb vg.\nNygubhtu gung jnl znl abg or boivbhf 
ng svefg hayrff lbh'er Qhgpu.\nAbj vf orggre guna arire.
\nNygubhtu arire vf bsgra orggre guna *evtug* abj.\nVs 
gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
\nVs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n 
tbbq vqrn.\nAnzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f 
qb zber bs gubfr!"

Karşımıza anlamsız gibi görünen bir karakter dizisi çıktı… Aslında bu karmaşık ve anlamsız görünen kelime yumağının, en başta verdiğimiz “The Zen of Python” adlı metnin “şifrelenmiş” hali olduğunu az çok tahmin edebiliyoruz. Peki bundan nasıl emin olabiliriz?

Herhangi bir adım atmadan önce bir de “this” modülünün “d” niteliğine bakalım:

>>> this.d
 
{'A': 'N', 'C': 'P', 'B': 'O', 'E': 'R', 'D': 'Q', 'G': 'T',
 'F': 'S', 'I': 'V', 'H': 'U', 'K': 'X', 'J': 'W', 'M': 'Z', 
 'L': 'Y', 'O': 'B', 'N': 'A', 'Q': 'D', 'P': 'C', 'S': 'F', 
 'R': 'E', 'U': 'H', 'T': 'G', 'W': 'J', 'V': 'I', 'Y': 'L',
 'X': 'K', 'Z': 'M', 'a': 'n', 'c': 'p', 'b': 'o', 'e': 'r',
 'd': 'q', 'g': 't', 'f': 's', 'i': 'v', 'h': 'u', 'k': 'x',
 'j': 'w', 'm': 'z', 'l': 'y', 'o': 'b', 'n': 'a', 'q': 'd',
 'p': 'c', 's': 'f', 'r': 'e', 'u': 'h', 't': 'g', 'w': 'j',
 'v': 'i', 'y': 'l', 'x': 'k', 'z': 'm'}

“d” niteliği ise, anahtarları ve değerleri alfabetik karakterler olan bir sözlük barındırıyor. Gördüğünüz gibi bu sözlükte belli harfler belli harflerle eşleştirilmiş.

Bu alfabetik sözlüğün de yukarıdaki şifreli metinle bir bağlantısı olduğunu kestirmek çok zor değil. Hemen bir kaç deneme yapalım:

>>> this.d[this.s[0]]
 
'T'

Burada this.s adlı karmaşık karakter dizisinin ilk harfini this.d adlı sözlüğe anahtar olarak verdik. this.s karakter dizisinin ilk harfi “G”. Dolayısıyla şöyle bir şey yapmış olduk:

>>> this.d["G"]

Tabii this.d sözlüğünde “G” harfinin karşılığı “T” harfi olduğu için çıktıda “T” harfini aldık. O halde şöyle bir şey yazabiliriz:

>>> for i in this.s:
...     print this.d[i]

Buradan şöyle bir çıktı alırız:

T
h
e
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyError: ' '

Bu çıktı bize iki önemli bilgi verdi:

Birincisi, şifreli metnin ilk kelimesini elde ettik. Buna göre ilk kelime “The”. Yani doğru yoldayız!

İkincisi, sözlükte sadece alfabe harfleri olduğu için, for döngüsü bir boşluk karakteriyle karşılaştığında doğal olarak KeyError hatası veriyor. Yani kelimeleri birbirinden ayıran boşluk karakterlerinin ve hatta satırları bitiren “yeni satır” (newline — \n) karakterlerinin icabına bakmamız gerekiyor. Bunun için şöyle bir şey yazılabilir:

>>> a = ""
>>> for i in this.s:
...     try:
...         a += this.d[i]
...     except KeyError as k:
...         a += str(k)
...
>>> print a

Burada öncelikle a adlı boş bir karakter dizisi tanımladık. Biraz sonra bir for döngüsü ile alacağımız bütün harfleri bu a adlı karakter dizisi içinde toplayacağız.

Sonraki satırda for döngümüzü yazıyoruz. Burada yaptığımız şey şu: this.s adlı karakter dizisi içindeki bütün karakterleri tek tek this.d sözlüğü içinde sorgulayıp, hepsini a adlı karakter dizisine atıyoruz. Ancak this.s adlı karakter dizisi içinde, this.d adlı sözlükte herhangi bir karşılığı olmayan boşluk ve yeni satır karakterleri de olduğu için, KeyError hatası alma ihtimaline karşı, hata veren bütün karakterleri de tek tek a adlı karakter dizisine gönderiyoruz. Böylece şifreli karakter dizisi içindeki bütün boşlukları ve satır başlarını muhafaza etmiş oluyoruz. Eğer bu boşluk ve satır başlarını a karakter dizisine göndermek yerine mesela pass gibi bir deyimle görmezden gelirsek şifreli metindeki boşlukları ve satır başlarını kaybetmiş oluruz. O zaman a adlı karakter dizisindeki bütün harfler çıktıda birbirine bitişik görüneceği için yine anlaşılması zor bir metin ortaya çıkmış olur…

Son olarak da a adlı karakter dizisini ekrana yazdırıyoruz…

Bakalım bu kodlar bize ne çıktı veriyor:

The’ ‘Zen’ ‘of’ ‘Python’,” ‘by’ ‘Tim’ ‘Peters’\n”
\n’Beautiful’ ‘is’ ‘better’ ‘than’ ‘ugly’.”\n’Explicit’
‘is’ ‘better’ ‘than’ ‘implicit’.”\n’Simple’ ‘is’ ‘better’
‘than’ ‘complex’.”\n’Complex’ ‘is’ ‘better’ ‘than’
‘complicated’.”\n’Flat’ ‘is’ ‘better’ ‘than’ ‘nested’.
”\n’Sparse’ ‘is’ ‘better’ ‘than’ ‘dense’.”\n’Readability’
‘counts’.”\n’Special’ ‘cases’ ‘aren”‘”t’ ‘special’ ‘enough’
‘to’ ‘break’ ‘the’ ‘rules’.”\n’Although’ ‘practicality’ ‘beats’ ‘purity’.”\n’Errors’ ‘should’ ‘never’ ‘pass’ ‘silently’.
”\n’Unless’ ‘explicitly’ ‘silenced’.”\n’In’ ‘the’ ‘face’ ‘of’
‘ambiguity’,” ‘refuse’ ‘the’ ‘temptation’ ‘to’ ‘guess’.
”\n’There’ ‘should’ ‘be’ ‘one’-”-” ‘and’ ‘preferably’
‘only’ ‘one’ ”-”-’obvious’ ‘way’ ‘to’ ‘do’ ‘it’.”\n’Although’
‘that’ ‘way’ ‘may’ ‘not’ ‘be’ ‘obvious’ ‘at’ ‘first’ ‘unless’
‘you”‘”re’ ‘Dutch’.”\n’Now’ ‘is’ ‘better’ ‘than’ ‘never’.
”\n’Although’ ‘never’ ‘is’ ‘often’ ‘better’ ‘than’ ”*’right’*”
‘now’.”\n’If’ ‘the’ ‘implementation’ ‘is’ ‘hard’ ‘to’ ‘explain’,
” ‘it”‘”s’ ‘a’ ‘bad’ ‘idea’.”\n’If’ ‘the’ ‘implementation’ ‘is’
‘easy’ ‘to’ ‘explain’,” ‘it’ ‘may’ ‘be’ ‘a’ ‘good’ ‘idea’.
”\n’Namespaces’ ‘are’ ‘one’ ‘honking’ ‘great’ ‘idea’
”-”-” ‘let”‘”s’ ‘do’ ‘more’ ‘of’ ‘those’!’

Bingo! Böylece şifreli metni çözmüş olduk…

Şifreli metni çözmemizi sağlayan kodları aslında şu şekilde de yazabilirdik:

>>> a = ""
>>> for i in this.s:
...     a += this.d.get(i, i)
... 
>>> print a

Gördüğünüz gibi, bu defaki çıktımız çok daha zarif…

Burada Python sözlüklerinin get() metodunu kullandık. Bu sayede try…except bloklarıyla uğraşmamıza da gerek kalmadı. get() metodunun ikinci argümanı sayesinde, sözlükte bulunamadığı için hata veren boşluk ve yeni satır karakterlerinin doğrudan a değişkenine eklenmesini sağladık. Bu get() metodunun nasıl çalıştığını daha iyi anlamak için http://www.istihza.com/py2/sozluk.html#get-ve-has-key adresini ziyaret edebilirsiniz.

İyi çalışmalar,

istihza Python , , , ,

Python: Windows’ta Türkçe Karakter Sorunu

Salı, 13 Nis 2010

Diyelim ki elimizde şöyle bir şey var:

#-*- coding: cp1254 -*-
 
def kayit_ekle(isim, soyisim, sehir, meslek, tel, adres):
    kayit = {}
 
    kayit["%s %s" %(isim, soyisim)] = [sehir, meslek, tel, adres]
 
    print "\nBağlantı bilgileri kayıtlara eklendi!\n"
 
    for k, v in kayit.items():
        print k
        print "-"*len(k)
        for i in v:
            print i
 
kayit_ekle(isim = "Abdurrahman",
           soyisim = "Çelebi",
           meslek = "Öğretmen",
           tel = "0212 123 45 67",
           sehir = "İstanbul",
           adres = "Çeliktepe")

Bu kodları (utf-8 ile) GNU/Linux’ta çalıştırırken herhangi bir Türkçe karakter sorunuyla karşılaşmıyoruz. Ancak aynı kodları Windows’ta çalıştırmak istediğimizde şöyle bir çıktı alıyoruz:

Ba­lant² bilgileri kay²tlara eklendi!
 
Abdurrahman Ãelebi
------------------
¦stanbul
Í­retmen
0212 123 45 67
Ãeliktepe

Gördüğünüz gibi bütün Türkçe karakterler birbirine girmiş durumda. Bunun temel sebebi Windows’ta komut satırının öntanımlı yazı tipinin unicode karakterleri gösterememesi. Yani aslında komut satırının kendisi Türkçe karakterleri düzgün bir şekilde algılayabiliyor. Ancak kullanılan öntanımlı yazı tipi bu karakterlerin düzgün bir şekilde gösterilmesine müsaade etmiyor… Ayrıca ortaya çıkan bu durumda, MS-DOS’un öntanımlı kod sayfasının da etkisi var.

Yukarıdaki sorundan kurtulmak için şu işlemleri yapmamız gerekiyor:

1. Önce kullanılan kod sayfasını değiştiriyoruz:

chcp 1254

2. Ardından pencere başlığına sağ tıklayıp “özellikler”e giriyoruz.

3. Yazı Tipi sekmesi içinde yazı tipini “Lucida console” olarak değiştiriyoruz.

4. Tamam’a basıyoruz.

5. Karşımıza çıkan pencerede, “özellikleri sadece geçerli pencereye uygula” seçeneğini işaretliyoruz.

Şimdi en başta verdiğimiz betiği çalıştırdığımızda şu çıktıyı alıyoruz:

Bağlantı bilgileri kayıtlara eklendi!
 
Abdurrahman Çelebi
------------------
İstanbul
Öğretmen
0212 123 45 67
Çeliktepe

istihza Python, Teknik , , ,

Python’la İlgili Bir Soru

Salı, 06 Nis 2010

Python’da platform adlı bir modül bulunur. Bu modül, kullanılan sisteme ilişkin çok önemli bilgiler elde etmemizi sağlar.

platform modülünün system() adlı fonksiyonu GNU/Linux’ta “Linux” çıktısı, Windows XP’de ise “Windows” çıktısı veriyor. Ancak bu fonksiyonun öteki sistemlerde nasıl bir çıktı verdiğinden emin değilim. Dolayısıyla bana kendi sisteminizde şu komutların çıktısının ne olduğunu söyleyebilirseniz memnun olurum:

>>> import platform
 
>>> platform.system()

İlgilenen herkese teşekkürler.

istihza Python , ,

Bir Sözlük Programı: Tercüman

Salı, 06 Nis 2010

istihza.com takipçilerinin Python ile yazdıkları uygulamaları tanıttığımız Python Programları bölümümüzün bugün yeni bir konuğu var: Tercüman

Eren Usturalı tarafından yazılan Tercüman, PyGTK arayüz takımı ile hazırlanmış bir sözlük programı. GNU/Linux üzerinde geliştirilip test edilen bu uygulama, kelime bilgilerini sozluk.web.tr adresinden alıyor ve şık bir biçimde kullanıcılarına sunuyor.

Programın şöyle bir görünümü var:

Her zamanki gibi, bu programı http://www.istihza.com/programlar/icindekiler_programlar.html adresinden indirebilirsiniz.

Programı yazıp bize gönderen Eren Usturalı’ya teşekkür ederim.

istihza Python, Yazılım, istihza.com , , ,

Python Projesi

Pazartesi, 29 Mar 2010

İstanbul’da Boğaziçi Ses Hizmetleri adlı şirketin sahibi Salih Arık, şirket bünyesinde yürütülen bir proje için Python programcısı aradıklarını haber verdi. Projeyle ilgili ayrıntılı bilgileri Salih Bey’den alabilirsiniz, ancak projenin genel olarak VoIP üzerine olduğunu söyleyebilirim.

Proje ve ücret konularını görüşmek için 0532 404 33 68 numaralı telefondan Salih Arık‘ı arayabilir ya da saliharik [at] hotmail.com adresinden kendisine yazabilirsiniz.

istihza Uncategorized , , , ,

Python Kitabı için bir İnceleme Yazısı

Cuma, 05 Mar 2010

Sevgili Emre Şahin, iki hafta önce Kodlab Yayınları‘ndan çıkardığımız Python Kitabı hakkında kendi günlüğünde çok güzel bir inceleme yazısı yazmış. Bu yazıya şu adresten ulaşabilirsiniz:

http://emresahin.org/herkes-icin-python-kitabi/

İlgisi ve desteği için Emre Şahin’e çok teşekkür ederim.

Sevgiler,

istihza

istihza Python, istihza.com , , ,

Herkes İçin Python: Bir İnceleme Yazısı

Pazar, 28 Şub 2010

Yaklaşık bir hafta önce piyasaya çıkan “Herkes İçin Python” adlı kitabımız hakkında Sayın Uğur Özyılmazel bir inceleme yazısı yazmış.

İnceleme yazısına http://vigoyla.blogspot.com/2010/02/python-kitab.html adresinden ulaşabilirsiniz.

Kitabı okuyup incelediği için Uğur Özyılmazel’e teşekkür ederim.

istihza Python, istihza.com , , , ,

Python Kitabı Çıktı!

Cumartesi, 20 Şub 2010

Sevgili Arkadaşlar,

Birkaç gün önce duyurduğumuz Python kitabı bugün itibariyle kitapçılardaki yerlerini aldı.

Kitabın duyurusu için http://www.istihza.com/blog/python-kitab.html/ adresini, kitap hakkında bazı teknik ayrıntıları öğrenmek için ise http://www.istihza.com/blog/python-kitabi-hakkinda-teknik-bilgiler.html/ adresini ziyaret edebilirsiniz.

Kitabı yayımlayan KODLAB Yayınevi’ne ve “Math Modülü” adlı makaleyi kitaba almama izin veren Kürşat Örsel’e teşekkür ederim.

Bayinizden ısrarla isteyiniz!.. :)

istihza Python, istihza.com , , ,

Python Kitabı Hakkında Teknik Bilgiler

Çarşamba, 17 Şub 2010

istihza.com‘da yer alan Python 2.x ve Tkinter 2.x bölümlerinin KODLAB Yayınları‘ndan basılı kitap olarak çıkacağını duyurmuştum. Kitap birkaç gün önce internet mağazalarında satılmaya başlandı. Cuma günü de bu kitabı kitapçıların raflarında görmeye başlayacağız…

Dilerseniz şimdi size kitap hakkında biraz teknik bilgi vereyim.

Bildiğiniz gibi, istihza.com’daki belgeleri reStructuredText biçiminde hazırlıyorum. Bu sayede tek bir biçimde hazırladığım belgeleri  daha sonra rahatlıkla HTML ve PDF biçimlerine dönüştürerek okurlara sunabiliyorum. Yazıları reStructuredText olarak hazırlamak sitenin güncellenmesi açısından da bana çok büyük bir kolaylık sağlıyor. reStructuredText’in sade ve temiz yapısı sayesinde asıl işe odaklanabiliyorum.

Dediğim gibi, reStructuredText (ya da başka bir ifadeyle “rst”) biçiminde hazırlanmış belgeleri başka biçimlere çevirmek mümkün olabiliyor. Ben bu çevirme işi için, Python geliştiricilerinin de python.org’daki belgeleri hazırlamada kullandığı Sphinx adlı yazılımdan faydalanıyorum. Bu yazılımı, belgelendirme ile uğraşan herkese gönül rahatlığıyla önerebilirim…

KODLAB Yayınları bana istihza.com’daki Python 2.x ve Tkinter bölümlerini kitaplaştırmayı teklif ettikten sonra benden belgeleri .doc biçiminde istedi. Benim Windows bilgisayarlara erişimim son derece kısıtlı olduğu için elbette benim bu belgeleri doğrudan .doc biçiminde hazırlamam mümkün değildi. Ama OpenOffice’te hazırlanan .odt belgeleri .doc olarak da kaydedilebildiği için bu durum ciddi bir sorun teşkil etmedi. İşin daha da güzel tarafı, docutils paketi içinde rst2odt adlı bir betik bulunuyor. Bu betik yardımıyla reStructuredText olarak hazırlanmış belgeleri tek bir komutla .odt’ye çevirebiliyoruz. Bu belgeleri .odt’ye çevirdikten sonra da belgeyi OpenOffice ile açıp başlık, kod bloğu, paragraf ve benzeri özel alanlara istediğimiz stilleri uygulamak mümkün.

OpenOffice bu .odt belgelerini .doc biçiminde de kaydedebildiği için bunları KODLAB’ın istediği şekilde kendilerine teslim ettim. Yalnız bu noktada şöyle bir durum ortaya çıktı. Ben elimdeki rst belgelerini rst2odt betiği yardımıyla .odt’ye dönüştürdükten ve gerekli stilleri .odt belgesine uyguladıktan sonra metni son haline getirmek için doğrudan .odt belgeleri üzerinde çalıştım. Bu sayede epey zaman kazanmış oldum. Çünkü eğer yapacağım değişiklikleri doğrudan rst üzerinde yapsaydım bu belgeleri tekrar tekrar .odt’ye dönüştürüp, tekrar tekrar gerekli stilleri uygulamam gerekecekti.

Bu nedenle KODLAB’a teslim ettiğim belgelerle istihza.com üzerindeki belgeler arasında bazı metin farklılıkları ortaya çıkmış oldu. Örneğin Python 2.x bölümündeki Fonksiyonlar ve Modüller kısımlarını KODLAB’a teslim ettiğim belgelerde baştan aşağı  yeniden yazdım. Ancak istihza.com takipçilerinin endişelenmesine hiç gerek yok, çünkü değiştirdiğim .odt belgelerini tekrar rst’ye dönüştürüp istihza.com’a ekledim ve eklemeye devam ediyorum. Ancak ne yazık ki “odt2rst” diye bir betik bulunmuyor… Aslında bu ada sahip bir betik var, ama bu betik henüz geliştirme aşamasında olduğu için doğru düzgün çalışmıyor. O yüzden .odt belgelerini .rst’ye elle çevirmem gerekiyor. Bu da zaman alıcı bir işlem olduğu için beni biraz zorluyor.

Bu arada hatırlatmama gerek var mı bilmiyorum, ama söyleyeyim: KODLAB’dan çıkacak Python kitabının içindeki bilgilere ücretsiz olarak istihza.com üzerinden erişebilmeye devam edebileceksiniz. Ben istihza.com’daki bu belgeleri eskisi gibi güncellemeye devam edeceğim. Yukarıda bahsettiğim teknik nedenden ötürü site ve kitap arasında oluşan farklılık çok büyük değil. Zaten ben bu değişiklikleri istihza.com’a aktarıyor olduğum için endişelenmenizi gerektirecek bir durum yok.

Bu arada, kitabı hazırlama sürecinde Samsun Ondokuz Mayıs Üniversitesi Bilgisayar Mühendisliği Bölümü’nden, istihza.com’daki belgeleri üniversitede verilecek Python derslerinde kullanmak için izin isteyen bir mektup aldım. Elbette ben de kendilerine sitedeki belgeleri istedikleri gibi indirip kopyalayabileceklerini söyledim. Ancak bildiğiniz gibi, istihza.com’daki konuları hazırlarken oldukça “teklifsiz” ve “rahat” bir dil kullanıyorum. Bu belgeleri KODLAB’a teslim etmek üzere hazırlarken bazı yerlerde bu rahatlık meselesinin dozunu biraz kaçırmış olduğumu farkettim… :) Ben belgeleri KODLAB’ın istediği şekilde hazırlayıp kendilerine teslim ettiğimde KODLAB da bu konuda beni uyardı. Yukarıda dediğim gibi, kitabın üniversite çevrelerinde kullanılma olasılığı da olduğu için, metinlerdeki ses tonunu bir miktar ciddileştirdim. Kitap için yaptığım değişiklikleri istihza.com’a da aktaracağım için, yakın zamanda bu ses tonu istihza.com’a da yansıyacak. Ancak elbette “ciddi” derken “asık suratlı”yı kastetmiyorum. istihza.com’daki bilgiler yine olabildiğince eğlenceli ve herkesin anlayabileceği tarzda sunulmaya devam edecek.

Gelelim kitabın içeriğine…

Sevgili arkadaşlar, istihza.com’daki bütün bilgileri topladığınız zaman ortaya 1000 sayfaya yakın bir belge bütünü çıkıyor. KODLAB’a teslim ettiğim Python kitabında istihza.com’daki Python 2.x ve Tkinter bölümleri yer alıyor. Ayrıca bu iki bölüme ek olarak, sitede “Özel Konular” başlığı altında sunduğumuz bazı makalelere de yer verdim. Ancak bu makalelerin hepsini kitaba almadım. Çünkü KODLAB’a teslim ettiğim kitap şu haliyle bile tam 544 sayfa oldu. :) Eğer her şeyi kitaba almaya kalksaydım, ortaya hem tuğla gibi, hem de KODLAB açısından haddinden fazla  maliyetli bir kitap çıkmış olacaktı…

Bilirsiniz, eskiden kitap yazarı denince akla oldukça fantastik bir şey gelirdi. Bundan birkaç yıl öncesine kadar kitap yazarları biz okurlar için ulaşılmaz bir konumdaydılar. Yazar kitabı hazırlar ve köşesine çekilirdi. Kitap hakkındaki sorularımız, şüphelerimiz konusunda çaresizdik. Ama bu Python Kitabı’nda durum böyle değil. Kitabın yazarına nereden ulaşacağınızı biliyorsunuz… :) Kitapta gördüğünüz eksiklikleri ve önerilerinizi bildirmek konusunda yalnız ve çaresiz değilsiniz. Kitapla ilgili herhangi bir sorunuz olması durumunda istihza.com’a başvurabilir, kistihza[at]yahoo[nokta]com adresinden bana ulaşabilirsiniz. Bu arada istihza.com’u da takip etmeyi unutmayın. Çünkü kitap dediğiniz şey statik bir ortamdır. istihza.com ise dinamik…

Dediğim gibi, kitabın içindeki bilgilere (ve hatta daha fazlasına) istihza.com üzerinden ücretsiz olarak da erişebilmeye devam edeceksiniz. Bu kitabı çıkarmamızın amacı kitaptan okumayı sevenlerin isteğine yanıt verebilmek. Eğer kitabı satın alırsanız istihza.com’u maddi olarak desteklemiş olursunuz, ancak tabii ki böyle bir zorunluluk asla söz konusu değil. Kitabı satın almak istemiyor olabilirsiniz, maddi gücünüz kitabı almaya yetmiyor olabilir,  ya da bambaşka sebepleriniz olabilir. Hiçbirine itirazım yok. Bu durumda istihza.com’daki bilgileri site üzerinden veya PDF biçiminde indirerek ücretsiz olarak takip etmeye devam edebilirsiniz. Her zaman dediğim gibi, istihza.com projesinin amacı bilgiye erişimi olabildiğince kolaylaştırmaktır. İnsanları kitabı satın almaya yönlendirmek için istihza.com’un geri bırakılması, güncellemeden kaçınılması kesinlikle söz konusu değil. Önümüzdeki günlerde istihza.com gümbür gümbür büyümeye devam edecek… :)

Bu kitapla ortaya güzel ve faydalı bir şey çıkarmaya çalıştık. Python programlama diliyle ilgilenen herkesin bu kitapta kendilerine uygun bir şeyler bulabileceğini ümit ediyorum. Böyle bir projeye omuz verdiği için KODLAB’a da teşekkür ediyorum.

istihza Python, istihza.com , , , , , , , ,