Δημοσιεύτηκε: 23 Φεβ 2012, 23:29
από lucinos
Ένα σημαντικό στοιχείο που πρέπει να έχουν υπόψιν τους όλοι είναι ότι υπάρχει μια νέα έκδοση τής Python η python3 γνωστή και σαν py3k (σε αντιδιαστολή με την py2k) και αυτό είναι πολύ σημαντικό για όλους επειδή είναι ασύμβατες. Δεν θα επαναλάβω φυσικά εδώ την τεκμηρίωση τής py3k αλλά νομίζω 3-4 πραγματάκια είναι χρήσιμα. Νομίζω αξίζει να έχουμε υπόψιν μας τις πιο εξόφθαλμες διαφορές.

1) η print είναι πλέον συνάρτηση,. Έτσι:
py2k:
Κώδικας: Επιλογή όλων
>>> print "Hello Nurse!"
Hello Nurse!
>>>

py3k:
Κώδικας: Επιλογή όλων
>>> print("Hello Nurse!")
Hello Nurse!
>>>


πλεονεκτήματα:
η print τής py3k είναι συνεπέστερη και εκφραστικότερη (μπορείς για παράδειγμα να δηλώσεις με όρισμα το τέλος ή τα χωρίσματα μεταξύ τών ορισμάτων, το ,end='' είναι μάλλον πιο αυτονόητο από το σκέτο κόμμα για την ίδια δουλειά.
μειονεκτήματα:
μισώ τις παρενθέσεις, μισώ τις παρενθέσεις, μισώ τις παρενθέσεις. (αν δεν γενικευτεί αυτή η τάση μικρό το κακό)

2) η διαίρεση επιστρέφει αριθμό κινητής υποδιαστολής. Έτσι:
py2k:
Κώδικας: Επιλογή όλων
>>> print 3/2, 3./2, 3//2, 3.//2
1 1.5 1 1.0
>>>

py3k:
Κώδικας: Επιλογή όλων
>>> print (3/2, 3./2, 3//2, 3.//2)
1.5 1.5 1 1.0
>>>


η ακέραια διαίρεση γίνεται με τον νέο τελεστή // ο οποίος υπάρχει πλέον και στην py2k (χαρακτηριστικός και στο sage).
πλεονεκτήματα: είναι πολύ πιο σίγουρο ότι δεν θα γίνει αριθμητικό λάθος μόνο και μόνο επειδή δεν ελέγξαμε να είναι αριθμοί κινητής υποδιαστολής τα ορίσματα.
μειονεκτήματα: χαλάει μια παράδοση και από κάποιες απόψεις ήταν συνεπέστερο.

3)φοβερή υποστήριξη unicode στην py3k. Αυτή εκφράζεται με πολλούς τρόπους αλλά ο πιο ακραίος είναι ο ακόλουθος:
py3k:
Κώδικας: Επιλογή όλων
>>> βάρος = 100.3
>>> print ("το βάρος είναι",βάρος,"κιλά")
το βάρος είναι 100.3 κιλά
>>>

γενικά είμαι εξαιρετικά αρνητικός στην χρήση μη ASKII χαρακτήρων στον συνήθη προγραμματισμό αλλά καθώς η python χρησιμοποιείται και σαν βάση για περιπτώσεις όπως το sage ακόμα και αυτή η ακραία περίπτωση μπορεί να είναι εξαιρετικά χρήσιμη. Δυστυχώς το sage ακόμα βασίζεται στην python2.
πλεονεκτήματα: πολύ σημαντικά, εμφανή και λιγότερο εμφανή και άλλα που θα τα βρούμε στην πορεία.
μειονεκτήματα: πιθανότητα κατάχρησης σε κάποιες ακραίες περιπτώσεις.

4)θα αναφέρω και την περίπτωση τής range
py2k:
Κώδικας: Επιλογή όλων
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> type(range(10))
<type 'list'>
>>> xrange(10)
xrange(10)
>>> type(xrange(10))
<type 'xrange'>
>>>

py3k:
Κώδικας: Επιλογή όλων
>>> range(10)
range(0, 10)
>>> type(range(10))
<class 'range'>
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> tuple(range(10))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>>


Η range τής py2k δημιουργούσε μια λίστα. Στην py3k βρίσκεται σημασιολογικά κοντύτερα στην xrange τής py2k. Αυτό είναι βελτίωση από την άποψη ότι καθοδηγεί τον προγραμματιστή να προγραμματίσει σωστά. Επίσης η range τής py3k δεν ταυτίζεται εντελώς με την xrange τής py2k. Είναι μάλλον εκφραστικότερη αλλά και σε δοκιμές που έκανα διαπίστωσα διαφορές στις επιδώσεις. Για την range τής py3k βρήκα καλύτερες επιδώσεις στις πιο κοινές περιπτώσεις και από την range τής py2k και από την xrange τής py2k. Σε ακραίες περιπτώσεις βρήκα ότι μπορεί να υπολείπεται αλλά όχι απελπιστικά (ίδια τάξη μεγέθους με την καλύτερη τής py2k). Αυτό σε καμμία περίπτωση δεν είναι μειονέκτημα καθώς κάποιος που θέλει να κάνει βελτιστοποίηση σε τέτοιες ακραίες περιπτώσεις έτσι και αλλιώς πρέπει να φύγει από την python.

Υπάρχουν φυσικά και άλλες διαφορές αλλά νομίζω ότι αυτές είναι εξαιρετικά σημαντικό να τις έχει αμέσως κάποιος υπόψιν του, ενώ οι άλλες είναι περισσότερο ειδικευμένο θέμα τεκμηρίωσης.

Ποια να προτιμήσετε;
Αν θέλετε να μάθετε python η γνώμη μου είναι ασχοληθείτε πρώτα με την python3.
Η py3k είναι το μέλλον οπότε αν μαθαίνετε χωρίς κάποια άμεση ανάγκη είναι η προφανής επιλογή.
Ακόμα και αν έχετε κάποια άμεση ανάγκη για python2 είναι σημαντικό να έχετε υπόψιν την python3 καθώς θα βοηθήσει να γράψετε καλύτερο και πιο σύγχρονο κώδικα ο οποίος θα μεταφερθεί μελλοντικά ευκολότερα σε python3.
Από την άλλη η py2k δεν πρόκειται να μάς εγκαταλείψει σύντομα. Η μη συμβατότητα των δύο κάνει την μετάβαση μη άμεση και υπάρχει ακόμα πολύς και απαραίτητος κώδικας σε python2 (ιδιαιτέρως στο λίνουξ, όχι τόσο στα ms windows). Οπότε το λογικό είναι ότι θα συνεχίσει όχι μόνο να υπάρχει αλλά και να εξελίσσεται τα επόμενα χρόνια παράλληλα με την python3. Οπότε σε αρκετές (αλλά εξειδικευμένες) περιπτώσεις η py2κ συνεχίζει να είναι χρήσιμη. Επίσης ένα ακόμα πλεονέκτημα τής python2 είναι η υπάρχουσα βιβλιογραφία. Σε κάθε περίπτωση με τον χρόνο η python3 θα επικρατεί όλο και περισσότερο, αλλά θα χρειαστούν αρκετά χρόνια για την πλήρη μετάβαση.