Quelles sont les fonctionnalités moins connues mais utiles du langage de programmation Python?
- Essayez de limiter les réponses au noyau Python.
- Une fonctionnalité par réponse.
- Donnez un exemple et une brève description de la fonction, pas seulement un lien vers la documentation.
- Étiquetez l'entité en utilisant un titre comme première ligne.
Liens rapides vers les réponses:
- Déballage des arguments
- Un appareil dentaire
- Chaînage des opérateurs de comparaison
- Décorateurs
- Arguments par défaut Gotchas / Dangers of Mutable Arguments par défaut
- Descripteurs
.get
Valeur par défaut du dictionnaire- Tests de docstring
- Ellipsis Slicing Syntax
- Énumération
- Pour / sinon
- Fonction comme argument iter ()
- Expressions de générateur
import this
- Échange de valeur sur place
- Liste pas à pas
__missing__
articles- Regex multiligne
- Formatage des chaînes nommées
- Liste imbriquée / compréhension de générateur
- Nouveaux types à l'exécution
.pth
des dossiers- Encodage ROT13
- Débogage Regex
- Envoi aux générateurs
- Compléter la tabulation dans l'interpréteur interactif
- Expression ternaire
try/except/else
- Déballage +
print()
fonction with
déclaration
python
hidden-features
compie
la source
la source
(< 1 x 10)
. Vous pouvez même les appliquer à des arguments uniques, comme(= 10)
: cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/…Obtenez l'arbre d'analyse des expressions rationnelles python pour déboguer votre expression régulière.
Les expressions régulières sont une grande fonctionnalité de python, mais leur débogage peut être pénible, et il est trop facile de se tromper en termes d'expression régulière.
Heureusement, python peut imprimer l'arbre d'analyse rationnelle, en passant le drapeau caché, expérimental et non documenté
re.DEBUG
(en fait, 128) àre.compile
.Une fois que vous avez compris la syntaxe, vous pouvez repérer vos erreurs. Là , nous pouvons voir que j'ai oublié d'échapper à la
[]
dans[/font]
.Bien sûr, vous pouvez le combiner avec les indicateurs que vous souhaitez, comme les expressions rationnelles commentées:
la source
énumérer
Enveloppez un itérable avec énumérer et il donnera l'élément avec son index.
Par exemple:
Références:
enumerate
la source
Création d'objets générateurs
Si vous écrivez
vous pouvez sortir le générateur et l'affecter à x. Maintenant, cela signifie que vous pouvez faire
L'avantage de ceci est que vous n'avez pas besoin de stockage intermédiaire, dont vous auriez besoin si vous le faisiez
Dans certains cas, cela peut entraîner une accélération importante.
Vous pouvez ajouter de nombreuses instructions if à la fin du générateur, en répliquant essentiellement les boucles imbriquées:
la source
iter () peut prendre un argument appelable
Par exemple:
La
iter(callable, until_value)
fonction appellecallable
et produit son résultat à plusieurs reprises jusqu'à ce qu'elleuntil_value
soit renvoyée.la source
lambda
mot-clé est nécessaire ici?Soyez prudent avec les arguments par défaut modifiables
Au lieu de cela, vous devez utiliser une valeur sentinelle indiquant "non fourni" et remplacer par le mutable que vous souhaitez par défaut:
la source
foo.func_defaults
. Qui, étant un tuple, est immuable.Envoi de valeurs dans les fonctions du générateur . Par exemple, avoir cette fonction:
Vous pouvez:
la source
Si vous n'aimez pas utiliser les espaces pour désigner les étendues, vous pouvez utiliser le style C {} en émettant:
la source
L'argument step dans les opérateurs de tranche. Par exemple:
Le cas spécial
x[::-1]
est un idiome utile pour «x inversé».la source
Décorateurs
Décorateurs permettent d'encapsuler une fonction ou une méthode dans une autre fonction qui peut ajouter des fonctionnalités, modifier des arguments ou des résultats, etc. Vous écrivez des décorateurs une ligne au-dessus de la définition de la fonction, en commençant par un signe "at" (@).
L'exemple montre un
print_args
décorateur qui affiche les arguments de la fonction décorée avant de l'appeler:la source
La syntaxe for ... else (voir http://docs.python.org/ref/for.html )
Le bloc "else" sera normalement exécuté à la fin de la boucle for, sauf si le break est appelé.
Le code ci-dessus pourrait être émulé comme suit:
la source
À partir de la version 2.5, les pronostics ont une méthode spéciale
__missing__
qui est appelée pour les éléments manquants:Il existe également une sous-classe dict dans
collections
calleddefaultdict
qui fait à peu près la même chose mais appelle une fonction sans arguments pour les éléments non existants:Je recommande de convertir de tels dict en dicts réguliers avant de les passer à des fonctions qui n'attendent pas de telles sous-classes. Beaucoup de code utilise
d[a_key]
et attrape KeyErrors pour vérifier si un élément existe qui ajouterait un nouvel élément au dict.la source
m={}; m.setdefault('foo', []).append(1)
.defaultdict
est également plus puissant que lasetdefault
méthode dans d'autres cas. Par exemple, pour une contre -dd = collections.defaultdict(int) ... dd[k] += 1
contred.setdefault(k, 0) += 1
.Échange de valeur sur place
Le côté droit de l'affectation est une expression qui crée un nouveau tuple. Le côté gauche de l'affectation décompresse immédiatement ce tuple (non référencé) aux noms
a
etb
.Après l'affectation, le nouveau tuple n'est pas référencé et marqué pour la récupération de place, et les valeurs liées à
a
etb
ont été échangées.Comme indiqué dans la section du didacticiel Python sur les structures de données ,
la source
Expressions régulières lisibles
En Python, vous pouvez fractionner une expression régulière sur plusieurs lignes, nommer vos correspondances et insérer des commentaires.
Exemple de syntaxe verbeuse (de Dive into Python ):
Exemples de correspondances de nommage (tirées du HOWTO sur les expressions rationnelles )
Vous pouvez également écrire verbalement une expression régulière sans utiliser
re.VERBOSE
grâce à la concaténation littérale de chaîne.la source
Déballage des arguments de fonction
Vous pouvez décompresser une liste ou un dictionnaire comme arguments de fonction en utilisant
*
et**
.Par exemple:
Raccourci très utile car les listes, tuples et dict sont largement utilisés comme conteneurs.
la source
ROT13 est un codage valide pour le code source, lorsque vous utilisez la bonne déclaration de codage en haut du fichier de code:
la source
cevag h"Uryyb fgnpxbiresybj!"
Créer de nouveaux types de manière entièrement dynamique
qui est exactement le même que
Probablement pas la chose la plus utile, mais agréable à savoir.
Edit : le nom fixe du nouveau type devrait être
NewType
exactement la même chose qu'avec l'class
instruction.Modifier : Ajustement du titre pour décrire plus précisément la fonction.
la source
Gestionnaires de contexte et
with
déclaration " "Introduit dans PEP 343 , un gestionnaire de contexte est un objet qui agit comme un contexte d'exécution pour une suite d'instructions.
Comme la fonctionnalité utilise de nouveaux mots clés, elle est introduite progressivement: elle est disponible en Python 2.5 via la
__future__
directive. Python 2.6 et supérieur (y compris Python 3) le propose par défaut.J'ai beaucoup utilisé la déclaration "with" car je pense que c'est une construction très utile, voici une démo rapide:
Ce qui se passe ici dans les coulisses, c'est que l' instruction "with" appelle les méthodes spéciales
__enter__
et__exit__
sur l'objet fichier. Les détails des exceptions sont également transmis à__exit__
si une exception a été déclenchée à partir du corps de l'instruction with, permettant ainsi la gestion des exceptions.Dans ce cas particulier, cela a pour effet de garantir la fermeture du fichier lorsque l'exécution sort du cadre de la
with
suite, que cela se produise normalement ou qu'une exception soit levée. Il s'agit essentiellement d'un moyen d'abstraire le code de gestion des exceptions commun.D'autres cas d'utilisation courants pour cela incluent le verrouillage avec des threads et des transactions de base de données.
la source
withs
:)with open('filea') as filea and open('fileb') as fileb: ...
with open('filea') as filea, open('fileb') as fileb: ...
Les dictionnaires ont une méthode get ()
Les dictionnaires ont une méthode 'get ()'. Si vous faites d ['clé'] et que la clé n'est pas là, vous obtenez une exception. Si vous faites d.get ('clé'), vous récupérez Aucun si 'clé' n'est pas là. Vous pouvez ajouter un deuxième argument pour récupérer cet élément au lieu de Aucun, par exemple: d.get ('key', 0).
C'est génial pour des choses comme l'addition de nombres:
sum[value] = sum.get(value, 0) + 1
la source
get(key, None)
. Je n'avais aucune idée quiNone
était fournie par défaut.Descripteurs
Ils sont la magie derrière tout un tas de fonctionnalités principales de Python.
Lorsque vous utilisez l'accès en pointillé pour rechercher un membre (par exemple, xy), Python recherche d'abord le membre dans le dictionnaire d'instances. S'il n'est pas trouvé, il le recherche dans le dictionnaire de classe. S'il le trouve dans le dictionnaire de classe et que l'objet implémente le protocole de descripteur, au lieu de simplement le renvoyer, Python l'exécute. Un descripteur est une classe qui implémente les
__get__
,__set__
ou les__delete__
méthodes.Voici comment implémenter votre propre version (en lecture seule) de la propriété à l'aide de descripteurs:
et vous l'utiliseriez comme la propriété intégrée ():
Les descripteurs sont utilisés en Python pour implémenter des propriétés, des méthodes liées, des méthodes statiques, des méthodes de classe et des emplacements, entre autres. Les comprendre permet de comprendre facilement pourquoi beaucoup de choses qui ressemblaient auparavant à des «bizarreries» de Python sont ce qu'elles sont.
Raymond Hettinger a un excellent tutoriel qui fait un bien meilleur travail de description que moi.
la source
foo = property(lambda self: self.__foo)
property
lui-même est implémenté avec des descripteurs, ce qui était le point de mon message.Affectation conditionnelle
Il fait exactement ce que cela ressemble: "attribuez 3 à x si y est 1, sinon affectez 2 à x". Notez que les parens ne sont pas nécessaires, mais je les aime pour la lisibilité. Vous pouvez également l'enchaîner si vous avez quelque chose de plus compliqué:
Mais à un certain point, ça va un peu trop loin.
Notez que vous pouvez utiliser if ... else dans n'importe quelle expression. Par exemple:
Ici func1 sera appelé si y est 1 et func2, sinon. Dans les deux cas, la fonction correspondante sera appelée avec les arguments arg1 et arg2.
De façon analogue, ce qui suit est également valable:
où class1 et class2 sont deux classes.
la source
x = ((y == 1) ? 3 : 2)
plus de sens pour moiDoctest : documentation et tests unitaires à la fois.
Exemple extrait de la documentation Python:
la source
locals()
ensuite dans votre doctorat dolocals().update(setUp())
= DFormatage nommé
Le formatage% prend un dictionnaire (applique également la validation% i /% s etc.).
Et comme locals () est également un dictionnaire, vous pouvez simplement le passer comme dict et avoir des sous-positions% à partir de vos variables locales. Je pense que cela est mal vu, mais simplifie les choses ..
Mise en forme d'un nouveau style
la source
Pour ajouter plus de modules python (en particulier ceux de tiers), la plupart des gens semblent utiliser des variables d'environnement PYTHONPATH ou ils ajoutent des liens symboliques ou des répertoires dans leurs répertoires de packages de sites. Une autre façon consiste à utiliser des fichiers * .pth. Voici l'explication officielle du doc python:
la source
Clause d' exception sinon :
L'utilisation de la clause else est préférable à l'ajout de code supplémentaire à la clause try, car elle évite d'attraper accidentellement une exception qui n'a pas été déclenchée par le code protégé par l'instruction try ... except.
Voir http://docs.python.org/tut/node10.html
la source
Relancer les exceptions :
L'instruction 'raise' sans argument dans un gestionnaire d'erreur indique à Python de relancer l'exception avec le retraçage d'origine intact , vous permettant de dire "oh, désolé, désolé, je ne voulais pas attraper cela, désolé, désolé. "
Si vous souhaitez imprimer, stocker ou jouer avec le traçage d'origine, vous pouvez l'obtenir avec sys.exc_info (), et l'imprimer comme le ferait Python se fait avec le module 'traçage'.
la source
raise e
place, ce qui ne conserve pas la trace d'origine.exc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2]
est équivalent à cela, mais vous pouvez changer ces valeurs (par exemple, changer le type d'exception ou le message)Messages principaux :)
Décrypté :
la source
print s.translate("".join(chr(64<i<91 and 65+(i-52)%26 or 96<i<123 and 97+(i-84)%26 or i) for i in range(256)))
et ça a l'air beaucoup mieux maintenant !! :-DAchèvement de l'onglet d'interpréteur interactif
Vous devrez également définir une variable d'environnement PYTHONSTARTUP.
la source
easy_install ipdb
- alors vous pouvez utiliserimport ipdb; ipdb.set_trace()
readline.parse_and_bind ("bind ^I rl_complete")
Compréhensions de listes imbriquées et expressions de générateur:
Ceux-ci peuvent remplacer d'énormes morceaux de code en boucle imbriquée.
la source
for
déclarations doit être écrit dans l'ordre que vous attendez qu'elles soient écrites dans une boucle standard, de l'extérieur vers l'intérieur.for
s et deif
s avecyield x
inside. Pour convertir cela en une expression de générateur, déplacez-vous d'x
abord, supprimez tous les deux-points (et leyield
) et entourez le tout entre parenthèses. Pour faire une liste de compréhension à la place, remplacez les parens extérieurs par des crochets.Surcharge d'opérateur pour le
set
builtin:Plus de détails dans la référence de bibliothèque standard: Définir les types
la source