python2 vs python3

...ασύγχρονα μαθήματα python

python2 vs python3

Δημοσίευσηαπό lucinos » 23 Φεβ 2012, 23:29

Ένα σημαντικό στοιχείο που πρέπει να έχουν υπόψιν τους όλοι είναι ότι υπάρχει μια νέα έκδοση τής 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 θα επικρατεί όλο και περισσότερο, αλλά θα χρειαστούν αρκετά χρόνια για την πλήρη μετάβαση.
Τελευταία επεξεργασία από lucinos και 23 Φεβ 2012, 23:39, έχει επεξεργασθεί 1 φορά/ες συνολικά
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση

Re: python2 vs python3

Δημοσίευσηαπό Ilias95 » 23 Φεβ 2012, 23:37

Νομίζω είναι σημαντικό να αναφερθεί ότι υπάρχουν τα from __future__ imports με τα οποία ο κώδικας γίνεται πιο συμβατός.
Πχ να πως μπορούμε να χρησιμοποιήσουμε την print της python3 στην python2:

Κώδικας: Επιλογή όλων
ilias@ilias-pc:~$ python
Python 2.7.2+ (default, Oct  4 2011, 20:03:08)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import print_function
>>> print('Hello World!', end='\n')
Hello World!
>>>


Επίσης άλλη μια διαφορά είναι ότι η raw_input() αντικαταστάθηκε με την input() στην python3.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: python2 vs python3

Δημοσίευσηαπό lucinos » 29 Μαρ 2012, 23:28

@Ilias95 Σημαντική η παρατήρηση με την input.

Επίσης η Python αυτοδιαφημίζεται ότι έχει ισχυρούς τύπους. Αυτό είναι λίγο παραπλανητικό. Έχει σαφώς ισχυρούς τύπους σε σχέση με γλώσσες με αδύναμους τύπους αλλά όχι εντελώς ισχυρούς. Είναι κάπου στην μέση. Στην python3 πάντως είναι λίγο πιο ισχυροί, ιδιαίτερα στις περιπτώσεις που η αδυναμία είχε κριτικαριστεί αρνητικά.

py2k:
Κώδικας: Επιλογή όλων
>>> '3'<4
False
>>>


py3k:
Κώδικας: Επιλογή όλων
>>> '3'<4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() < int()
>>>


Ωστόσο η py3k δεν έχει αλλάξει φιλοσοφία, εξακολουθεί γενικά να έχει μια χαλαρή αντιμετώπιση στο θέμα (υπάρχουν υπέρμαχοι και πολέμιοι), απλά διορθώθηκαν μερικές περιπτώσεις που υπήρχε γενική αντίληψη ότι δεν ήταν καλή η αδυναμία.

Επίσης οι τύποι ονομάζονται κλάσσεις:

py2k:
Κώδικας: Επιλογή όλων
>>> type(3)
<type 'int'>
>>>


py3k:
Κώδικας: Επιλογή όλων
>>> type(3)
<class 'int'>
>>>
Spoiler: show
Γνώσεις → Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Μέτριος
Λειτουργικό → Ubuntu 11.04 natty 64-bit (el_GR.UTF-8)
Προδιαγραφές → CPU: 4x Intel Core i5 CPU 750 2.67GHz ‖ RAM 3953 MiB ‖ ASRock P55DE3
Κάρτες γραφικών: nVidia G92 [GeForce GTS 250] ⎨10de:0615⎬ (rev a2)
Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller ⎨10ec:8168⎬ (rev 03)
Άβαταρ μέλους
lucinos
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 828
Εγγραφή: 12 Δεκ 2010, 22:04
Εκτύπωση


Επιστροφή στο Μαθήματα python

cron