Salut,
L’objet files est défini comme une “liste par compréhension“, c’est à dire par une propriété de ses éléments, et non pas par énonciation de ceux-ci.
La propriété est Cette propriété doit être vérifiée sur les éléments obtenus d’une autre liste: c’est la partie
for f in os.listdir(directory)
(Il doit toujours y avoir une partie for.... dans une liste par compréhension)
La propriété vérifiée sur un élément f de os.listdir(directory) permet d’enregistrer dans la liste files l’élément
( os.stat(f)[ST_CTIME] , f )
Cet objet est un tuple, un couple plus précisément, composé des deux éléments
os.stat(f)[ST_CTIME
et f
files est donc une liste de couples.
Il y a des cas où les parenthèses d’un tuple peuvent ne pas être mises. C’est le cas pour le s,f dans la ligne de return. Il faut lire en fait:
return [f for (s,f) in files]
Cette ligne retourne une liste définie par compréhension, à nouveau.
f est l’élément du couple (s,f) qui est gardé pour constituer la liste.
Ici la propriété est implicite: on garde le premier élément de (s,f) dans la liste.
On pourrait aussi écrire cette ligne:
return [ c[1] for c in files]
Soit dit en passant, je pense que dans la précédente liste définie on pourrait écrire
files = [os.stat(f)[ST_CTIME], f for f in...etc
mais de mon point de vue ça ne présente pas d’intérêt.
Pendant qu’on y est, noter que ce qui caractérise un tuple est la présence de virgules entre ses éléments.
C’est d’ailleurs pourquoi (s,f) peut s’écrire s,f : ce n’est pas les parenthèses qui sont importantes mais la virgule.
S’il n’y a qu’un élément, on est obligé de mettre une virgule terminale pour faire un tuple , par exemple
(salsifis,) # est un tuple
(salsifis) # nest pas un tuple mais un générateur de chaîne
,
(123.4) # estun générateur de nombre
etc
Pour les tuples à plusieurs éléments, la virgule terminale est facultative puisqu’il y en a entre les éléments.
Même si personne n’écrit ainsi, (’orange’,’banane’,’framboise’,) est aussi un tuple.
Partager