Utilisation de one liners en Python
Un one liner est un programme dont les instructions ne tiennent que sur une seule ligne.
Selon moi, un one liner (en Python en tout cas), peut désigner aussi certaines parties du programme (list comprehension, boucle, structure de contrôle) qui peuvent s'écrire en une ligne.
Ce qui fait qu'un script peut contenir plusieurs one liners, ce terme ne désignant plus le programme lui même.
Le code devient plus 'dense', ce qui a pour avantage de réduire le nombre de lignes, les instructions sont plus rapides à écrire notamment. Le seul bémol, est que l'on peut perdre en lisibilité. Après, c'est peut-être une question d'habitude...
On va commencer doucement et simplement.
Ici l'on veut multiplier les nombres de la liste par 3 par exemple.
a = [45, 18, 13, 90]
On procéderait ainsi :
for number in a: a[a.index(number)] = number * 3
Ou avec l'usage de la fonction enumerate()
for index, number in enumerate(a): a[index] = number * 3
En une ligne
a = [number*3 for number in a]
Maintenant on voudrait multiplier que les nombres impairs.
for index, number in enumerate(a): if number%2: a[index] = number*3
En une ligne
a = [number*3 for number in a if number%2]
Et si l'on veut que cette fois, les nombres pairs soient divisé par 2
for index, number in enumerate(a): if number%2: a[index] = number*3 else: a[index] = number/2
En une ligne
a = [number*3 if number%2 else number/2 for number in a]
On notera que dans cet exemple, la structure de contrôle 'if' a été déplacée vers la gauche car il y a un 'else'. Autrement, si vos conditions sont à droite, votre programme déclenchera une erreur.
Rien ne vous empêche d'ailleurs, d'imbriquer plusieurs boucles d'affilé. Prenons une chaîne de caractères avec du code html.
html ='<div><span>koukou</span>Hello</div><div><span>kikou</span>World</div>'
On veut afficher le contenu de nos div sans prendre en compte ce qu'il y a entre les balises span.
for element in html.split('<div>'): for item in element.split('</span>')[1::2]: print item.split('</div>')[0]
En une seule ligne (bon c'est un peu tirer par les cheveux, mais je vous montre comment ça se fait)
print [i.split('</div>')[0].split('</span>')[-1] for i in [a for a in html.split('<div>')]][1:]
On pourrait même simplifier le code si l'on attaquait directement les balises span à la place des div lors du premier split.
for element in html.split('</span>')[1:]: print element.split('</div>')[0]
En une seule ligne
print [element.split('</div>')[0] for element in html.split('</span>')[1:]]
Ici, voici une structure de contrôle en une seule ligne :
if a: b=10 #une seule condition a = 10 if a else my_function() #structure if/else
Il y a aussi la manipulation de fichier, dont la syntaxe habituelle (celui que j'utilisais, il n'y a pas encore si longtemps de cela)
fichier = open('file.txt', 'r') data = fichier.read() data.fichier close()
Peut simplement s'écrire ainsi :
with open('file.txt', 'r') as fichier: data = fichier.read()
Cette syntaxe est même préconisée par le site officiel de Python