Meilleur façon de répéter N fois un appel
Bonjour
Selon vous, quelle est la meilleur manière de répéter N fois un appel de fonction.
Mes premières tentatives étaient directement inspirées de ce qui se fait en C :
Code:
1 2 3 4 5
|
i=0
while i<10:
ma_fonction()
i = i +1 |
Depuis j'ai un peu changé pour
Code:
1 2 3
|
for i in range(10):
ma_fonction() |
Est-ce qu'il existe une manière encore plus propre ?
Cordialement
Emmanuel
le Python est-il pêcheur ?
Citation:
Est-ce qu'il existe une manière encore plus propre ?
Qu'est ce que ça veut dire «plus propre» ?
Citation:
je cherche seulement une manière élégante de répéter N appels à une fonction
Qu'est ce que ça veut dire «manière élégante» ?
Ce doit être quand «c'est court». Parce que
Citation:
en général plus c'est court mieux c'est.
Mais qu'est ce que ça veut dire «mieux c'est» ?
---------------------
Citation:
Cependant dans les deux cas, j'ai besoin d'une variable i qui ne sert à rien, mise à part compter les itérations.
Ça me fait imaginer la scène suivante: un pêcheur du néolithique (avant l'invention de l'écriture, ce qui exclut une représentation mentale de nombres encore jamais écrits) qui rouspète sur une grève: «Ah lala, que je pêche avec un harpon ou avec un filet, j'ai besoin d'une main qui ne sert à rien, mis à part compter les poissons que je dois obtenir pour mes 3 enfants et ma femme».
C'est un peu tiré par les cheveux, mais c'est pour dire que compter c'est toujours établir une correspondance entre une succession de choses et un ensemble stable d'éléments pris comme référence de comptage, que ce soit les doigts de la main, des petits cailloux assemblés en tas de diverses manières, des noeuds sur des cordelettes, des signes écrits arbitraires ou la représentation mentale de ces signes.
Et que cette représentation va se traduire dans un programme informatique par l'utilisation d'un ensemble ou d'une variable, comment faire autrement ?
Dans tous les exemples ci-dessus, qu'on le perçoive immédiatement ou non, il y a toujours un ensemble ou une variable qui servent à surveiller le déroulement de l'itération, non ?
Par exemple
Code:
1 2
| for f in (ma_fonction,)*10:
f() |
si on fait print (ma_fonction,)*10
on voit qu'il s'agit d'un tuple de 10 objets-fonction. Je suis pas sûr que ce soit mieux que d'itérer i dans range(10).
Je ne connait pas bien eval() mais je subodore que
Code:
eval('mafonction(),'*10)
nous fait un truc du même genre.
Dans
Code:
[MaFonction() for i in range(10)]
aussi il y a un ensemble: range(1) est [0,1,2,3,4,5,6,7,8,9]
---
Par contre, dans
Code:
for i in itertools.repeat(ma_fonction, 10):
et
Code:
cube = (i*i*i for i in xrange(0,10))
ça me semble déjà mieux: il n'y a pas d'ensemble construit en préalable. Il y a un indice i qui prend des valeurs successivement calculées (cf définition de repeat(), l'équivalent contient xrange() ).
Mais ces valeurs appartiennent bien à l'ensemble conceptuel des nombres de 1 à 10. D'une manière ou d'une autre si on veut compter, il y a bien des doigts ou une variable qui intervient quelque part, muette ou pas.
«ça me semble déjà mieux» , ça veut dire quoi ?
Ça veut dire que ça tient moins de place en mémoire.
Un autre critère pour savoir ce qui serait "mieux" serait la vitesse d'exécution de chaque solution proposée.
Bref,
astuce algorithmique, je veux bien, mais élégance d'un code, fondée sur son apparence, je ne vois pas trop ce que ça veut dire.
NB: tout ceci, dit sans acrimonie. Je me pose en fait souvent ce même genre de question un peu stérile
EDIT
au fait, voici une solution dans laquelle il n'y a pas de variable muette et pas de nombre 10. Mais c'est illusoire
Code:
1 2 3 4 5 6
| def f(x):
print 'Je suis la'
return x[:-1]
x = 'abcdefghij'
while x: x = f(x) |