Python 2.x vs. Python 3.x! Avantajları, Farkları Neler?

Python, programlamaya başlamak için söz dizimi olarak çok uygun bir dil. Basit kuralları var, noktalı virgül ile kapatılma zorunluluğu yok, parantezlerin olmaması kimine göre kolaylık vs. Bu kolaylıklar listesini bölecek ilk zorluklardan biri bu küçük versiyon karmaşası.

İlk akla gelen hangisini kullanmalıyım sorusuna şurada Python’un resmi cevabı var. Python için kısaca; 2.x bir miras, 3.x ise şimdisi ve geleceği.

Bunun dışında Python 3.x bir sürümü tercih etmek daha mantıklı olacaktır çünkü Python 2.x için son ana sürümü olan 2.7’den sonra artık ana bir sürüm çıkarılmayacağı duyuruldu ve 3.x kaldığı yerden devam edecek. An itibariyle; 2.7.13 sürümü 17 Aralık 2016 tarihinde yayınlanmış. 3.6.1 sürümü ise 21 Mart 2017 tarihinde.

__future__ Modülü

Python 3.x çıkarıldığında içerisinde Python 2.x sürümü içinde bulunmayan bazı anahtar kelimeler barındırdığı için Python 2.x içerisine __future__ adında bir built-in modül eklendi. Bu yolla 2.x kodları kısmen de olsa 3.x söz diziminde yazıldığında çalışacaktır.

print Fonksiyonu

En meşhur değişimdir. 2.x sürümündeki print ifadesi, 3.x’de print() fonksiyonuna döndü. Burada parantez kullanmamız 2.x için sorun oluşturmasa da parantezsiz kullanım 3.x sürümünde SyntaxError verecektir.

Dikkat edilmesi gereken diğer nokta da 2.x için parantezli kullanımda bir kaç parametre vermeye çalışmak. Burada print bir ifade olduğu için parantez içini bir tuple olarak görecektir.

# 2.x
print "Python 2.x sürümü için ekrana yazma"
print "Bir", "İki"
print("2.x için parantezli kullanım")
# 2.x için aşağıdaki örnek iki satır yerine bir tuple nesnesi yazacaktır.
print("Bir", "İki")

# 3.x
print("Python 3.x sürümü için ekrana yazma")
print ("Bir", "İki")

Tam Sayı Bölümü

Sürümler arasındaki bu fark bir SyntaxError vermeyeceği için biraz tehlikeli. Özellikle 3.x kodunuzu 2.x bir ortamda çalıştırırken.
Fark tam olarak şu; 2.x sürümünde iki tam sayıyı bölerseniz sonuç yine tam sayıdır. Yani 3/2=1 gibi. Ama 3.x buna izin vermez, 3/2=1.5 tir. Burada sayılardan birini float yani ondalık sayı türüne çevirirsek sorun kalkar.

# Sürüm 2.x
print 3/2 
# 1
print float(3)/2
# 1.5
print 3/2.0
# 1.5

# Sürüm 3.x
print 3/2 
# 1.5

Unicode

ASCII, Amerikan tabanlı bir karakter kodlaması sistemidir, yani Türkçe’de bulunan “üğışçö” ya da aksanlı harfler dedikleri “é” gibi Amerikan alfabesinde olmayan harfler yok. Tabi ki bu 1968 için bir sorun değildi zira o kadar global düşünülmemiş ve mevcut bilgisayarlar için hafıza olarak, 0-127 arasında bir değere ihtiyaç duyduğu için, ASCII çok uygunmuş.

Sonraları 8-bit bilgisayarlar yaygınlaşınca ve bilgisayar kullanımı daha küresel hale gelince, arada kalan 128-255 değerlerine bu eksik olan harfler de eklenmeye başlandı ve sonra Unicode denilen ve neredeyse her harfin bulunduğu bir standart oluşturuldu.

Python 2.x içinde bir metin değişkeni ASCII olarak kaydediliyor. Bunu unicode fonksiyonu ile sararak unicode türünde bir değişkene çevirebilirsiniz. Ama bu da yanında sorunlar getiriyor. ASCII olan bir str türünde değişkeni unicode türünde bir değişkenle birleştiremiyorsunuz örneğin. Ama bu iki tür de basestring‘den türediği için count, find, replace gibi metotları kullanabiliyorsunuz.

Python 3.x ile bu durum ortadan kaldırıldı ve UTF-8 desteği ile oluşturulan her string türündeki değişken unicode desteklemeye başladı.

xrange

2.x sürümünde bulunan xrange fonksiyonu ile tembel şekilde tekrarlayan nesneler oluşturabiliyoruz. Tembel ile söylenmek istenen fonksiyon her çağırıldığında değer üretiliyor, ilk çağırımda değil (Generator Fonksiyonlar).

Python3.x ile xrange fonksiyonu kaldırıldı ve range fonksiyonu aynı işlevi yapacak şekilde tasarlandı. Fakat burada 3.x sürümünün dezavantajı 2.x sürümündeki xrange metodundan daha yavaş çalışıyor olması.

Hata Belirtme

Print fonksiyonu benzeri bir parantez durumu burada da mevcut. Bir hata durumu belirtirken kullandığımız raise ifadesi ile kullandığımız hata fonksiyonları 3.x sürümünde parantez gerektiriyor. Yine aynı şekilde 2.x paranteze karşı hoş görülü olup ses çıkarmazken, 3.x, parantezsiz kullanım için SyntaxError veriyor.

# 2.x
raise IOError, "Okuma hatası"

# 3.x
raise IOError("Okuma hatası")

Hataları Yakalama

Burada da 3.x sürümü ile gelen, except anahtar kelimesinde, bir as anahtar kelimesi kullanma zorunluluğu var.

next fonksiyonu ve metodu

Generator fonksiyonlarda kullanılabilen next fonksiyonu ve Generator nesnesine ait next metodu 3.x sürümüyle birlikte değişti ve metot olan kaldırıldı.

For döngüsü değişken sızması

2.x sürümünde kısa bir şekilde liste oluşturulduğunda kullanılan değişken isimleri global olarak atanıyordu. Ama 3.x ile bu sızma engelleniyor artık.

# 2.x
i = 1
print [i for i in range(5)]
# [0,1,2,3,4]
print i
# 4

# 3.x
j = 1
print [j for j in range(5)]
# [0,1,2,3,4]
print j
# 1

Karşılaştırılamaz Tipler

2.x sürümünde bir metin ile tam sayıyı karşılaştırabilir ve hata almazsınız fakat 3.x sürümünde bu değişti ve artık TypeError hatası alırsınız.

# 2.x
print "üç" > 2
# False


# 3.x
print "üç" > 2
# TypeError

Diğer

– 2.x sürümünde komut satırında alacağınız bir değişkeni her zaman str türünde almak için raw_input kullanılır, input fonksiyonu gelen değerin tipini kendi belirler ve tam sayıya vs. çevirebilir.

– Bazı fonksiyonlar 3.x ile list nesnesi dönmüyor. Yani type(range(5)), verecektir bize. zip, map ve filter fonksiyonları da bu şekilde.

– 3.x üzerinde yuvarlama işlemi değişik bir standarda uyarlandı. Küsüratı tam olarak .5 olan değerler en yakın çift sayıya yuvarlanıyor. Yani round(6.5) == 6

Başka kaynaklar;

http://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html#the-__future__-module
https://www.pythontr.com/makale/kendi-gelisimim-icin-python-2-yi-mi-yoksa-pyt-215
https://www.pythontr.com/makale/python-2-ve-3-arasindaki-farklar-541
http://ysar.net/python/surumler-arasi-gecis-rehberi.html


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir