Maison  >  Article  >  développement back-end  >  Explication détaillée de la différence entre Python3.x et Python2.x

Explication détaillée de la différence entre Python3.x et Python2.x

巴扎黑
巴扎黑original
2017-04-05 14:00:332514parcourir

Python3.x est une mise à niveau révolutionnaire de Python, qui supprime de nombreuses fonctionnalités précédentes et introduit de nouvelles fonctionnalités. Pas entièrement compatible avec l'ancien code de 1.x et 2.x.

Python2.x est rétrocompatible et la dernière version est Python 2.7. Parmi elles, les versions 2.6 et 2.7 ont été publiées pour permettre à Python de passer en douceur à 3.X, et ont également ajouté certaines fonctionnalités 3.X.

Actuellement, de nombreuses bibliothèques ne supportent pas 3.x (par exemple : Django, wxPython), et la plupart des applications sont toujours basées sur 2.x. Il est recommandé aux débutants d'utiliser la version 2.7.

Voici quelques différences principales entre Python 3.X et 2.X

1. Performances
Py3.0 exécute le benchmark Pystone 30 % plus lentement que Py2.5. Guido pense que Py3.0 a une grande marge d'optimisation et peut effectuer des opérations sur des chaînes et des entiers
pour obtenir de bons résultats d’optimisation.
Les performances de Py3.1 sont 15 % plus lentes que celles de Py2.5, et il reste encore beaucoup à faire.

2. Encodage
Les fichiers de code source Py3.X utilisent le codage utf-8 par défaut, ce qui rend le code suivant légal :
>>> Chine = 'chine'
>>>imprimer (Chine)
Chine

3. Grammaire
1) Supprimé <> et tout remplacé par !=
2) Supprimez `` et utilisez repr()
à la place. 3) Ajoutez as et with comme mots-clés, ainsi que Vrai, Faux, Aucun
4) La division entière renvoie un nombre à virgule flottante. Pour obtenir un résultat entier, veuillez utiliser //
. 5) Ajoutez une instruction non locale. Les variables périphériques (non globales) peuvent être affectées directement en utilisant noclocal x
6) Supprimez l’instruction print et ajoutez la fonction print() pour obtenir la même fonction. Il en va de même pour l'instruction exec, qui a été remplacée par la fonction exec()
Par exemple :
2.X : imprimer "La réponse est", 2*2
3.X : print("La réponse est", 2*2)
2.X : imprimer x, 3.X : print(x, end=" ") # Utilisez des espaces pour remplacer les lignes
                                                                                                                        2.X : print >>sys.stderr, "erreur fatale"
3.X : print("erreur fatale", file=sys.stderr)
2.X : imprimer (x, y) 3.X : print((x, y)) # Différent de print(x, y) !
7) Modification du comportement des opérateurs séquentiels, tels que x 8) La fonction input a changé, raw_input a été supprimé et remplacé par input :
2.X:guess = int(raw_input('Entrez un entier : ')) # Méthode pour lire la saisie au clavier
3.X: devinez = int (input ('Entrez un entier : '))

9) Supprimez le déballage des paramètres de tuple. Vous ne pouvez pas définir la fonction comme def(a, (b, c)):pass
10) Pour la nouvelle variable mot octal, la fonction oct() a été modifiée en conséquence.
2.La méthode de X est la suivante :
>>>0666
438
>>> octobre(438)
'0666'
3.X aime ça :
>>>0666
SyntaxError : jeton invalide (, ligne 1)
>>>0o666
438
>>> octobre(438)
'0o666'
11) Ajout des littéraux binaires et de la fonction bin()
>>> bac(438)
'0b110110110'
>>> _438 = '0b110110110'
>>> _438
'0b110110110'
12) Déballage itérable étendu. Dans Py3. Les objets et les séquences sont itérables.
13) Le nouveau super() ne peut plus passer de paramètres à super(),
>>> classe C(objet) :
             def __init__(self, a):
                                   print('C', a)
>>> classe D(C) :
             def __init(self, a):
                 super().__init__(a) # Appeler super() sans paramètres
>>>D(8)
C8
<__main__.D objet à 0x00D7ED90>
14) Nouvelle syntaxe de métaclasse :
Classe Foo(*bases, **kwds) :
Passer
15) Décorateur de classe de soutien. L'utilisation est la même que celle de la fonction décorateur :
>>> def foo(cls_a):
              def print_func(self):
                                                      print('Bonjour tout le monde !')
            cls_a.print = print_func
            return cls_a
>>> @foo
Classe C(objet) :
Passer
>>>C().print()
Bonjour tout le monde !
Le décorateur de classe peut être utilisé pour jouer le tour de transformer le chat civette en prince. Pour plus d'informations, veuillez vous référer au PEP 3129

4. Chaînes et chaînes d'octets 1) Il n'existe désormais qu'un seul type de chaîne, str, mais c'est presque le même que la version 2.x d'Unicode.

2) Concernant les chaînes d'octets, veuillez vous référer au point 2 de "Type de données"

5.Type de données 1) Py3.X a supprimé le type long, et il n'y a désormais qu'un seul type entier - int, mais il se comporte comme le 2. 2) Un nouveau type d'octets est ajouté, correspondant à la chaîne d'octets de la version 2.X. La méthode de définition d'un littéral d'octets est la suivante :
. >>> b = b'chine'
>>> tapez(b)

Les objets str et les objets bytes peuvent être convertis les uns aux autres à l'aide de la méthode .encode() (str -> bytes) ou .decode() (bytes -> str).
>>> s = b.decode()
>>> 'Chine'
>>> b1 = s.encode()
>>>b1
b'china'
3) Les méthodes .keys(), .items et .values() de dict renvoient des itérateurs, tandis que les précédentes iterkeys() et d'autres fonctions ont été abandonnées. Également supprimé est
dict.has_key(), remplacez-le par in

6. Orienté objet
1) Introduire les classes de base abstraites (Abstract Base Classes, ABC).
2) Les classes de conteneurs et les classes d'itérateurs sont ABC, il y a donc beaucoup plus de types dans le module cellections que dans Py2.5.
>>> importer des collections
>>> print('n'.join(dir(collections)))
Appelable
Conteneur
Hachable
ArticlesView
Itérable
Itérateur
ClésView
Cartographie
MappingView
MutableMapping
Séquence Mutable
MutableSet
NomméTuple
Séquence
Ensemble
Taille
ValeursVoir
__tous__
__builtins__
__doc__
__fichier__
__nom__
_abcoll
_itemgetter
_sys
dict par défaut
deque
De plus, les types numériques sont également de taille ABC. Sur ces deux points, voir PEP 3119 et PEP 3141.
3) La méthode next() de l'itérateur est renommée en __next__() et la fonction intégrée next() est ajoutée pour appeler la méthode __next__() de l'itérateur
4) Deux décorateurs, @abstractmethod et @abstractproperty, ont été ajoutés pour faciliter l'écriture de méthodes abstraites (propriétés).

7. Anomalie
1) Toutes les exceptions sont héritées de BaseException et StardardError
est supprimé 2) Suppression du comportement de séquence et de l'attribut .message de la classe d'exception
3) Utilisez raise Exception(args) au lieu de raise Exception, syntaxe args
4) Modifications de syntaxe pour détecter les exceptions, le mot-clé as est introduit pour identifier les instances d'exception, dans Py2.5 :
>>> essayez :
...     raise NotImplementedError('Error')
... sauf NotImplementedError, erreur :

... ... imprimer erreur.message
...
Erreur
Dans Py3.0 :
>>> essayez :
Augmenter NotImplementedError('Erreur')
         sauf NotImplementedError comme erreur : #Faites attention à cela car
                                print(str(erreur))
Erreur
5) Chaîne d'exceptions, car __context__ n'est pas implémenté dans la version 3.0a1

8. Modifications des modules
1) Le module cPickle a été supprimé et peut être remplacé par le module pickle. A terme nous aurons un module transparent et efficace.
2) Suppression du module imageop
3) Suppression de audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2,
modules rexec, sets, sha, stringold, strop, sunaudiodev, timing et xmllib
4) Suppression du module bsddb (publié séparément, disponible sur http://www.jcea.es/programacion/pybsddb.htm)
5) Nouveau module supprimé
6) Les fonctions os.tmpnam() et os.tmpfile() sont déplacées vers le module tmpfile
7) Le module tokenize fonctionne désormais avec les octets. Le point d'entrée principal n'est plus generate_tokens, mais tokenize.tokenize()

9. Autres
1) xrange() est renommé range(). Si vous souhaitez utiliser range() pour obtenir une liste, vous devez l'appeler explicitement :
. >>> liste(plage(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2) L'objet bytes ne peut pas hacher et ne prend pas en charge les méthodes b.lower(), b.strip() et b.split(), mais pour les deux dernières, vous pouvez utiliser b.strip(b'
ntr f') et b.split(b'') pour atteindre le même objectif
3) zip(), map() et filter() renvoient tous des itérateurs. Et apply(), callable(), coerce(), execfile(), reduction() et reload
() les fonctions ont été supprimées

Vous pouvez maintenant utiliser hasattr() pour remplacer callable(). La syntaxe de hasattr() est : hasattr(string, '__name__')

.

4) string.letters et les .lowercase et .uppercase associés ont été supprimés, veuillez utiliser string.ascii_letters à la place
5) Si x < y ne peut pas être comparé, une exception TypeError est levée. La version 2.x renvoie une valeur booléenne pseudo-aléatoire
6) Les membres de la série __getslice__ sont abandonnés. a[i:j] est converti en a.__getitem__(slice(I, j)) ou __setitem__ et
selon le contexte __delitem__ appelle
7) La classe file est abandonnée, en Py2.5 :
>>>fichier

Dans Py3.X :
>>>fichier
Retraçage (dernier appel le plus récent) :
Fichier "", ligne 1, dans
        fichier
NameError : le nom 'fichier' n'est pas défini

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn