Python 3.1 Yenilikleri
Python geliştiricileri, yeni nesil 3.x sürümleri üzerindeki çalışmalarını sürdürüyor. Python’un hem 2.x sürümleri hem de 3.x sürümleri devamlı olarak güncellenmeye ve bu sürümlere yeni özellikler eklenmeye devam ediliyor. Bu çalışmaların bir parçası olarak geçenlerde Python’un 3.1 sürümü yayımlandı. GNU/Linux dağıtımları henüz resmi olarak Python’un 2.x sürümlerini destekliyor. Python 3.x paketleri ise sadece birkaç GNU/Linux dağıtımında bulunuyor. Benim bildiğim kadarıyla şu anda sadece Fedora ve Ubuntu dağıtımları Python’un 3.x sürümlerine ait paketleri depolarında tutuyor.
Ubuntu depolarındaki en yeni Python sürümü 3.0. Ancak yakın bir zamanda 3.1 sürümünün de depoya alınacağını tahmin ediyorum… Elbette hem Windows kullanıcıları hem de GNU/Linux kullanıcıları eğer isterlerse Python’un resmi sitesinden Python’un en son sürümünü de indirip bilgisayarlarına kurabilir…
Python’un 3.1 sürümünde, 3.0 sürümüne göre bazı farklılıklar bulunuyor. İsterseniz bu farklılıkların en önemli olanlarına şöyle bir göz gezdirelim:
Python’un 3.1 sürümüne “OrderedDict“, yani “sıralı sözlük” adlı yeni bir sınıf eklendi. Bildiğiniz gibi, Python’daki “dictionary” (sözlük) veri tipi sıralı bir yapı sunmuyor. Yani sözlük elemanlarına, sözlüğe eklenme sırasına göre erişemiyoruz. Sözlükler verileri karışık olarak yerleştiriyor. Python’un 3.1 sürümü ile birlikte gelen OrderedDict sınıfı sayesinde bu kısıtlamadan kurtulmuş oluyoruz. OrderedDict sınıfı Python’daki “collections” adlı modülün bir parçasıdır. “collections” modülü Python’un 2.x sürümlerinde de bulunuyor. Ancak bu modül 3.x sürümleriyle birlikte boyut olarak epey büyüdü. Python’un 2.x sürümlerindeki collections modülüyle 3.x sürümlerindeki collections modülünün içeriğini karşılaştırdığımızda bu fark açık bir şekilde ortaya çıkıyor:
Python 2.6:
>>>import collections >>>dir(collections) ['Callable', 'Container', 'Hashable', 'ItemsView', 'Iterable', 'Iterator', 'Keys
View', 'Mapping', 'MappingView', 'MutableMapping', 'MutableSequence', 'MutableSet', 'Sequence', 'Set', 'Sized', 'ValuesView', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_abcoll', '_iskeyword', '_itemgetter', '_sys', 'defaultdict', 'deque', 'namedtuple']
Python 3.1
>>>import collections >>>dir(collections) ['ByteString', 'Callable', 'Container', 'Counter', 'Hashable', 'ItemsView', 'Ite
rable', 'Iterator', 'KeysView', 'Mapping', 'MappingView', 'MutableMapping', 'MutableSequence', 'MutableSet', 'OrderedDict', 'Sequence', 'Set', 'Sized', 'UserDict', 'UserList', 'UserString', 'ValuesView', '_Link', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_abcoll', '_chain', '_heapq', '_iskeyword', '_itemgetter', '_proxy', '_repeat', '_starmap', '_sys', 'bytearray_iterator', 'bytes_iterator', 'defaultdict', 'deque', 'dict_itemiterator', 'dict_items', 'dict_keyiterator', 'dict_keys', 'dict_proxy', 'dict_valueiterator', 'dict_values', 'list_iterator', 'list_reverseiterator', 'namedtuple', 'range_iterator', 'set_iterator', 'str_iterator', 'tuple_iterator', 'zip_iterator']
Gördüğünüz gibi, 3.1 sürümündeki collections modülü 2.6 sürümündekine göre bir hayli zengin… İşte 3.1 sürümü ile gelen OrderedDict sınıfını kullanabilmek için öncelikle bu collections adlı modülü içe aktarmamız gerekiyor. Bu modülü içe aktardıktan sonra OrderedDict sınıfını şöyle kullanabiliriz:
from collections import OrderedDict >>>sıralı = OrderedDict() >>>sıralı["a"] = 1 >>>sıralı["b"] = 2 >>>sıralı["c"] = 3 >>>sıralı.items() ItemsView(OrderedDict([('a', 1), ('b', 2), ('c', 3)]))
Gördüğünüz gibi, öğeler eklenme sırasına göre veriliyor…
Python’un 3.1 sürümüyle birlikte gelen bir başka önemli yenilik karakter dizilerinin “format()” metoduna ilişkindir. Bu metot Python’a 3.0 sürümüyle birlikte eklenmişti. Python’un 3.0 sürümünde bu metodu şöyle kullanıyorduk:
print(“bir {0}, bir {1} bir de {2} alacağım”.format(“kalem”, “pergel”, “çikolata”))
Burada parantez içinde vereceğimiz her bir öğe için, print() fonksiyonu içindeki karakter dizisinde numaralandırılmış birer alan oluşturmamız gerekiyor… Python’un 3.1 sürümüyle birlikte bu numaralandırma zorunluluğu ortadan kalktı. Yani yukarıdaki kod parçasını artık istersek şöyle de yazabiliyoruz:
print(“bir {}, bir {} bir de {} alacağım”.format(“kalem”, “pergel”, “çikolata”))
Python burada gerekli numaralandırma işini otomatik olarak kendisi halledecektir. Eğer öğeleri normal sırasının dışında yazdırmak istersek elbette kendimiz de öğeleri numaralandırabiliriz:
print(“bir {1}, bir {0} bir de {2} alacağım”.format(“kalem”, “pergel”, “çikolata”))
Python 3.1 ile gelen ve bizim burada inceleyeceğimiz son yenilik yine collections modülü ile ilgilidir…
Yukarıda Python 3.1 altında verdiğimiz dir(collections) çıktısına baktığımızda orada “Counter” adlı bir sınıf olduğunu görüyoruz. İşte o sınıf Python’a 3.1 sürümüyle birlikte girdi… Bu yeni Counter sınıfı, bir dizi içindeki öğelerin sayısını kolay bir şekilde öğrenmemizi sağlıyor:
>>>from collections import Counter
>>> li = ["elma", "armut", "kebap", "armut", "elma", "çilek", "pırasa", "kebap",
"armut", "elma", "pırasa", "armut", "elma", "kebap", "çilek"] >>>Counter(li) Counter({‘elma’: 4, ‘armut’: 4, ‘kebap’: 3, ‘pırasa’: 2, ‘çilek’: 2})
Demek ki “li” adlı liste içinde “elma” öğesi 4 kez, “armut” öğesi 4 kez, “kebap” öğesi 3 kez, “pırasa” öğesi 2 kez, “çilek” öğesi ise 2 kez geçiyormuş…
Aslında Python 3.1 ile gelen yenilikler bu kadarla sınırlı değildir. Ben burada yalnızca en dikkati çeken yeniliklerden birkaçına değinmekle yetindim. Yeri geldiğinde bu yeni özellikleri istihza.com içinde daha ayrıntılı bir biçimde anlatmaya çalışacağım. Şu anda “Fonksiyonlar” konusunu yazıyorum. Birkaç gün içinde onu da Python 3.x bölümüne ekleyeceğim.
İyi çalışmalar,
Fırat
Son Yorumlar