Je garde une liste mise à jour continuellement des tips'n tricks que Python nous réserve. Si vous avez d'autres cas intéressants, n'hésitez pas à poster un commentaire et je la mettrai à jour.
Vous pouvez sécifier un séparateur des milliers pour format :
>>> format(123456789, ",")
'123,456,789'
>>> format(123456789, "_")
'123_456_789'
Idem pour les f-strings :
>>> f"{123456789:,}"
'123,456,789'
>>> f"{123456789:_}"
'123_456_789'
pow peut prendre un 3ème argument pour calculer
pow(x, y) % z
:x, y, z = 123456789, 2345678, 17
# Option 1: not efficient at all
res = pow(x, y) % z # Does not end in more than 1 minute!
# Option 2: here we can talk!
res = pow(x, y, z) # Instantly
re.sub peut être utilisée pour remplacer plusieurs caractères dans un texte (évitant ainsi d'avoir à enchaîner les appels à str.replace ou au plus coûteux str.translate (benchmark) :
from re import compile, sub
fname = "Ça, c'est un nom de fichier (2).odt"
pattern = compile(r'([/:"|*<>?\\])')
fname_sanitized = sub(pattern, "-", fname)
str.startswith et str.endswith peuvent prendre un
tuple
en paramètre :text = 'azerty'
# Option 1: basic usage, not efficient
if text.startswith('a') or text.startswith('b') or text.startswith('c'):
...
# Option 2: best usage, efficient
if text.startswith(('a', 'b', 'c')):
...
Résumé du benchmark des 2 utilisations :
# text = 'azerty', the 1st condition is True
Option 1: 0.171 usec
Option 2: 0.174 usec
# text = 'czerty', the last condition is True
Option 1: 0.498 usec
Option 2: 0.200 usec
# text = 'nzerty', all conditions are False
Option 1: 0.472 usec
Option 2: 0.186 usec
Vous pouvez supprimer les zéros ajoutés pour les différentes fonctions du module time qui prennent un format en entrée (valable pour datetime également) :
>>> import datetime, time
>>> today = datetime.datetime.now().timetuple()
>>> time.strftime('%Y-%m-%d', today)
'2017-12-06'
>>> time.strftime('%Y-%m-%-d', today) # Check the '%-d'
'2017-12-6'