utilisation des break
Le
JBB
Voici un petit script qui verifie si un fichier finit par la bonne
extension:
EXT = [ ".c",".cpp",".cc"]
monfichier = "toto.c"
for ext in EXT :
if ( monfichier.endswith(ext)):
print " gagné"
break
Ma question (metaphysique) est:
Est il sage de sortir d'un 'for' avec 'break' ?
En C,C++ on m'a toujours dit que ce n'est pas bien (surtour si on
melange break, continu, return ..). Et qu'il faut mieux faire un while.
Du coup en python genre C++ je ferais:
trouve = False
i = 0
while ( not(trouve) and i <len(EXT)) :
if ( monfichier.endswith(EXT[i])):
print " gagné"
trouve = True
i = i + 1
Mais du coup ça force à passer par un index là ou on avait pas besoin.
Et je trouve ça moche.
Qu'en pensez vous?
Existe il des bouquins sur le bon usage du python ? regles de codages ?
En fait je fais une recherche sequentielle sur un tableau.
Peut existe il un methode find qui prendrait en parametre une fonction
de comparaison ?
extension:
EXT = [ ".c",".cpp",".cc"]
monfichier = "toto.c"
for ext in EXT :
if ( monfichier.endswith(ext)):
print " gagné"
break
Ma question (metaphysique) est:
Est il sage de sortir d'un 'for' avec 'break' ?
En C,C++ on m'a toujours dit que ce n'est pas bien (surtour si on
melange break, continu, return ..). Et qu'il faut mieux faire un while.
Du coup en python genre C++ je ferais:
trouve = False
i = 0
while ( not(trouve) and i <len(EXT)) :
if ( monfichier.endswith(EXT[i])):
print " gagné"
trouve = True
i = i + 1
Mais du coup ça force à passer par un index là ou on avait pas besoin.
Et je trouve ça moche.
Qu'en pensez vous?
Existe il des bouquins sur le bon usage du python ? regles de codages ?
En fait je fais une recherche sequentielle sur un tableau.
Peut existe il un methode find qui prendrait en parametre une fonction
de comparaison ?

Poser une question


Je pense que oui, sinon le petit mot clef else pour les for n'aurait pas
été crée :
for ...:
pass
else:
# Si end sans break
Je suis aussi interessé, je me pose toujours un tas de questions:
- Est il sage d'utiliser dans une class directement les operateurs
surchargés (self + other) ou faut il le faire explicitement
(self.__add__(other))
- Dans quel cas peux-t-on utiliser directement self pour le stockage ?
Exemple, self = 5, pour une classe qui surcharge les entiers cela passe
tranquile.
Self = [] cela va forcement merder à un moment.
Bref, pleins de questions que je n'ai pas envis de poser mais auquelle
je cherche une reponse.
--
Guillaume.
A mon avis, Ce code est tout à fait bien et plus lisible pour le second.
et en plus il est plus efficace que le second. Ne change rien, tu es sur la
bonne voie :-)
le mot clé break est fait pour çà. En matière de code, il ne devrait y avoir
qu'une rêgle, la facilité de lecture ;)
Remarque très judicieuse.
Pour les formulations idiomatiques en Python, il me semble que le
MartelliBot est un des meilleurs (voir ses livres).
Si vous définissez __add__(self, other) c'est quand même bien pour que
l'utilisation de votre classe soit plus aisée, non ? ou c'est parce que
cela fait bien de surcharger un opérateur, alors qu'il n'y a aucune
notion d'addition ou de concaténation sous-jacente ?
Là par contre, vous seriez plutôt à côté de la plaque, si je peux me
permettre. Si vous écrivez self = 5 dans une méthode vous redéfinissez
self, variable locale de la méthode qui pour la suite représentera
l'entier cinq et non plus l'instance en cours. Je sais, c'est assez
subtil, et je vous incite à lire ce que dit le Fbot sur les objets.
Cela ne fait pas ce que vous pensez, c'est tout.
N'hésitez pas à poser ce genre de bonnes questions.
--
Vingt fois sur le métier, remettez votre ouvrage,
Polissez-le et le repolissez
Boileau Despréaux l'Art poétique.
Bien que je n'ai encore jamais trouvé d'exemple d'utilisation, je ne
desespere pas d'en trouver un.
Trés interessant.
Je regarderais ça.
C'est pour que l'utilisation EXTERNE de ma classe soit plus aisée, j'ai
toujours eux peur des effets de bords sur ce genre de code. Donc j'ai la
confirmation que c'est bon, merci.
Hum, oui, suije bete... Au passage je rappel qu'il y a une traduction
http://cipcgw.insa-lyon.fr/~gbouchard/python-objects-fr.htm pour ceux
que cela interesse.
On n'en parle plus, je suis bete, c'est tout.
D'autre dans le style :
Imaginons que vous surchargez une fonction dans le style de l'addition.
L'addition etant dans ce cas là commutative, a + b == b + a.
Imaginons qu'e l'on fasse l'addition de deux listes [1,2,3] + [1,2,3,4]
== [2,4,6,4].
La technique consiste à initialiser la nouvelle liste a partir d'une
copie d'une des listes (la plus grande), puis à procédé aux ajouts.
imaginons deux liste, a et b.
Vous feriez :
if len(a) > len(b):
grande,petite = a,b
else:
grande,petite = b,a
Ou alors:
# on considere len(a) > len(b)
if len(a) < len(b):
return b.__add__(a)
Votre avis sur la question ? Deux nouveaux nom ou un rappel de méthode
avec inversion de paramétres ?
--
Guillaume.
Non non, un peu étourdi, cela arrive à tout le monde.
L'inversion de paramètres de __add__(self, other) c'est soit
__radd__(self, other) soit other + self.
J'écrirais :
... if len(self) > len(other):
... return other + self
... res = [item1+item2 for item1, item2 in zip(self, other)]
... res.extend(other[len(self):])
... return res
...
# l2: 1 2 3 4 5 6 7 8
# ++ 1 3 5 7 5 6 7 8
On peut pinailler et écrire return ListeAdditive(res) dans __add__ et
ajouter __repr__ et __str__(self) mais cela vous savez faire.
Cordialement.