Comparé à des langages tels que Perl, Python possède un nombre limité de constructions de contrôle:
- seulement
if
et non unless
,
- seulement
for
que itère sur des séquences et pas foreach
ou C-style for
,
- seulement
while
cela vérifie une condition à chaque boucle et non do-while
,
- seulement
if-elif
et non switch
,
- il n'y a qu'une seule construction de commentaire, le
#
, et pour chaque ligne, vous pouvez dire si elle est commentée ou non, sans regarder les lignes précédentes.
En outre, il existe presque une façon d'indenter votre source; la plupart des cas d'indentation créative sont syntaxiquement exclus.
Cela facilite l'analyse d'une source Python pour les humains.
Il existe des tentatives pour être minimal mais complet dans les types intégrés et la bibliothèque standard.
- pour la liste mutable, vous utilisez le seul type intégré
list
; c'est O (1) pour la plupart des opérations, et vous n'avez jamais à choisir la bonne implémentation,
- pour les listes immuables, vous devez également utiliser le
tuple
type,
- pour les cartes, vous utilisez le seul
dict
outil intégré qui est sacrément efficace dans la plupart des cas, inutile de vous demander quelle implémentation utiliser.
Python 3 étend cela aux entiers: quelle que soit la taille de votre entier, vous utilisez le même type et ne vous souciez jamais de la contrainte.
Python essaie d'éviter le sucre syntaxique. Mais parfois, il ajoute du sucre syntaxique simplement pour mettre en évidence le moyen évident. Vous pouvez écrire if foo is not None
au lieu de if not (foo is None)
parce que 'is not' est une casse spéciale. Lit toujours foo is not None
facilement, ne peut pas être mal interprété, et vous n'avez pas à penser, vous écrivez simplement la chose évidente.
Bien sûr, la plupart des choses plus complexes en Python peuvent être effectuées de plusieurs manières. Vous pouvez ajouter des méthodes aux classes par déclaration ou par simple affectation d’emplacement, vous pouvez transmettre des arguments à des fonctions de différentes manières, etc. Tout simplement parce que les éléments internes du langage sont principalement exposés.
La clé est qu'il y a toujours un moyen qui se veut être le meilleur, le "cover-all". Si d'autres moyens existent, ils n'ont pas été ajoutés en tant qu'alternatives égales (comme if
et unless
), mais ont simplement exposé le fonctionnement interne. Lentement mais sûrement, de telles alternatives sont obsolètes (pas éliminées!) En améliorant le meilleur mécanisme connu.
Les décorateurs encapsulent les appels de fonction AOP. Avant la version 2.6, vous deviez utiliser __metaclass__
membre magique pour déclarer la métaclasse d'une classe. Maintenant, vous pouvez aussi utiliser la même syntaxe de décorateur. Avant la version 3.0, vous disposiez de deux types de chaînes, orientées octets et Unicode, que vous pouviez mélanger par inadvertance. Vous avez maintenant le seul Unicode str
et le seul transparent binaire bytes
, que vous ne pouvez pas mélanger par erreur.
"""
commentaires (docstrings). Celles-ci s'étendent sur plusieurs lignes.__doc__
qu'attribut. Mais les chaînes de caractères constituent un domaine dans lequel Python fournit définitivement de nombreuses «méthodes correctes»: utilisez des guillemets simples, doubles ou triples, joignez implicitement les littéraux adjacents, utilisez-lesr
pour les littéraux bruts, etc.Voici deux autres exemples:
len()
est une fonction au lieu d’une méthode présente dans chaque séquence; si vous comparez avec Java que vous avez.length
,.size()
,.getSize()
et d' autres méthodes pour trouver le nombre d'éléments dans une séquence.Un autre exemple est le fait qu'il
.join()
s'agit d'unestring
méthode et non d'une méthode présente dans chaque séquence. Vous n'avez pas besoin de savoir si le paramètre join est une liste, un ensemble, une compréhension ou quoi que ce soit d'autre, cela fonctionnera.la source
En C, il y a plusieurs façons d'augmenter la valeur d'une variable d'une unité:
Chaque finit par augmenter la valeur
i
par1
, mais chacun d' eux est légèrement différente.En Python, il n'y a vraiment qu'un seul moyen; il suffit d'en ajouter un.
Et bien qu'il existe plus d'une façon syntaxiquement valide de faire cela (par exemple
i = i + 1
), vous faites la même chose avec les mêmes effets secondaires.la source
i = i + 1
c'est une cession, pas un incrément. En python, un incrément esti += 1
. Dans les langues de style C vous pouvez écrirei++
,++i
eti += 1
.i += 1
, BTW) produisent exactement le même résultat. La seule fois où je vois des gens devenir confus, c'est quand ils pré-incrémentent ou post-incrémentent une variable dans le cadre d'une expression plus grande, ce qui est généralement corrigé rapidement en lisant la section appropriée de la référence du langage. Personnellement, j'aurais compris le fait que vous pouvez faire référence au cinquième caractère d'une chaîne à la foisstr[4]
ou*(str+4)
, mais peut-être que c'était trop facile ...max(i++, ++i)
ne peuvent pas être rapidement résolus. C a beaucoup de cas de comportement "non définis" et "dépendants de la mise en oeuvre", le tout pour une bonne raison - mais chacun peut créer un piège.Une autre possibilité pourrait être la compréhension de liste. En Python, vous pouvez faire ceci:
Mais la manière "évidente" (si vous êtes néerlandais ou êtes plus familier avec Python) de le faire serait d'utiliser une liste de compréhension:
C'est plus court, la new_list est créée en une étape, elle court plus vite, je crois, et elle est élégante. En revanche, on pourrait dire que cela semble moins explicite, mais je pense qu'une fois que vous vous y êtes habitué, c'est tout aussi explicite.
la source