GNT sans publicité, site mobile, fonctionnalitées exclusives...

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 ?
Lire les 13 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Guillaume Bouchard
Le #434343
JBB wrote:
Est il sage de sortir d'un 'for' avec 'break' ?


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

Existe il des bouquins sur le bon usage du python ? regles de codages ?


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.

Jean Baptiste Renard
Le #434341

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


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 ;)

F. Petitjean
Le #434338
JBB wrote:
Est il sage de sortir d'un 'for' avec 'break' ?


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


Remarque très judicieuse.

Existe il des bouquins sur le bon usage du python ? regles de codages ?
Pour les règles de codage, style .. je pense que c'est PEP numéro 8.


Pour les formulations idiomatiques en Python, il me semble que le
MartelliBot est un des meilleurs (voir ses livres).

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))


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 ?

- 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.


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.

Self = [] cela va forcement merder à un moment.


Cela ne fait pas ce que vous pensez, c'est tout.

Bref, pleins de questions que je n'ai pas envis de poser mais auquelle
je cherche une reponse.


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.


Guillaume Bouchard
Le #434298
F. Petitjean wrote:
Je pense que oui, sinon le petit mot clef else pour les for n'aurait pas
été crée :
Remarque très judicieuse.



Bien que je n'ai encore jamais trouvé d'exemple d'utilisation, je ne
desespere pas d'en trouver un.

Pour les règles de codage, style .. je pense que c'est PEP numéro 8.


Trés interessant.

Pour les formulations idiomatiques en Python, il me semble que le
MartelliBot est un des meilleurs (voir ses livres).


Je regarderais ça.

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 ?


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.

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.


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.

Self = [] cela va forcement merder à un moment.



Cela ne fait pas ce que vous pensez, c'est tout.


On n'en parle plus, je suis bete, c'est tout.

Bref, pleins de questions que je n'ai pas envis de poser mais auquelle
je cherche une reponse.



N'hésitez pas à poser ce genre de bonnes questions.


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.


F. Petitjean
Le #434232
On n'en parle plus, je suis bete, c'est tout.


Non non, un peu étourdi, cela arrive à tout le monde.

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 ?


L'inversion de paramètres de __add__(self, other) c'est soit
__radd__(self, other) soit other + self.

J'écrirais :
class ListeAdditive(list):
... def __add__(self, other):



... 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
...
l1 = range(4)
l2 = range(1, 9)
# l1: 0 1 2 3



# l2: 1 2 3 4 5 6 7 8
# ++ 1 3 5 7 5 6 7 8
ListeAdditive(l1) + ListeAdditive(l2)
[1, 3, 5, 7, 5, 6, 7, 8]



ListeAdditive(l2) + ListeAdditive(l1)
[1, 3, 5, 7, 5, 6, 7, 8]



ListeAdditive(l2) + ListeAdditive(l2)
[2, 4, 6, 8, 10, 12, 14, 16]




On peut pinailler et écrire return ListeAdditive(res) dans __add__ et
ajouter __repr__ et __str__(self) mais cela vous savez faire.

Cordialement.



Publicité
Suivre les réponses
Poster une réponse
Anonyme