IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Boucle et incrémentation en Python


Sujet :

Python

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut Boucle et incrémentation en Python
    Bonjour à tous.

    Voila, j'ai un petit soucis:
    j'ai un list:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    caractArray = ["0", "1", "2", "3", "4", "5", "6", "7", "8"," 9"
    "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "[ect...]" ]
    et j'aimerai faire un boucle qui incrémente automatiquement une varaible de sorte a ce que ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    1
    2
    3
    4
    5
    6
    [...]
    9
    a
    b
    c
    [...]
    10
    11
    12
    [...]
    1a
    1b
    [...]
    a1df2sdfv
    [...]
    a "l'infini", de sorte que cela puisse donné quelque chose du genre (exemple) "1b23sd" au bout d'un certain temps...

    comment créer ce type de boucle ?

  2. #2
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    Le problème qui se pose, est un problème de mémoire, et encore plus si ta boucle doit être infinie et que les résultats générés doivent grossir ta liste d'origine...

    Voici un generator qui ne tourne pas à l'infini, mais qui suivant la taille de la liste peut faire planter python (j'utilise la fonction product du module itertools, qui n'est pas du tout économe en mémoire):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> from itertools import product
    >>> def bcl(lst):
    	for x in lst:
    		yield [x]
    	for l in xrange(2,len(lst)+1):
    		for x in eval('product(%s)'%(('lst,'*l)[:-1])):
    			yield x
    et voici un exemple de ce que ça donne, ça parlera bien plus qu'une explication écrite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    >>> lst=list('12a')
    >>> for x in bcl(lst): print ''.join(x)
     
    1
    2
    a
    11
    12
    1a
    21
    22
    2a
    a1
    a2
    aa
    111
    112
    11a
    121
    122
    12a
    1a1
    1a2
    1aa
    211
    212
    21a
    221
    222
    22a
    2a1
    2a2
    2aa
    a11
    a12
    a1a
    a21
    a22
    a2a
    aa1
    aa2
    aaa
    Si toutefois, tu veux vraiment une version infinie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> def bcl(lst):
    	for x in lst:
    		yield [x]
    	l=2
    	while True:
    		for x in eval('product(%s)'%(('lst,'*l)[:-1])):
    			yield x
    		l+=1
    EDIT : apparement product n'est pas si gourmand que ça en mémoire... déjà 5 minutes que ça tourne pour une liste de 4 éléments, et la mémoire ram disponible ne baisse pas (en fait ça oscille donc c'est tout comme)

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Salut !

    @N.tox :
    Bien vu, l'appel à product, mais il vaudrait mieux utiliser son argument repeat : cela permet de dire combien de fois product doit "piocher" dans la liste et ça permet aussi d'éviter de faire appel à eval (ce qui est toujours une bonne chose point de vue sécurité).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    from itertools import product
    def bcl(lst):
        r = 1
        while True:
            for x in product(lst, repeat=r):
                yield x
            r += 1
    Au niveau perf, je constate la même chose : ram libre (ou presque) !

    @xxkirastarothxx :

    Si tu n'as que des chiffres et des minuscules, je te conseille ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from string import digits, lowercase
    caracs = list(digits + lowercase)
    Si tu en veux +, le module string comporte aussi :
    * uppercase : les majuscules ;
    * printable : tous les caractères imprimables, y compris les "blancs" (espaces, tabulations et consorts), je conseille alors de prendre printable[:-6] (ce qui donnera tous les caractères imprimables, hors "blancs").

    Ciao !

  4. #4
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    yep,
    Pour je ne sais quelle raison, je croyais que qu'un seul iterable comme argument à product n'avait le même comportement que plusieurs (ce qui après vérif, est complètement erroné...). Et oui c'est vrai ! je ne me rappelais plus de l'argument repeat

    Sinon, juste par curiosité, en quoi eval est-il "critique" pour la sécurité ?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Dans ce cas-ci, je ne pense pas qu'il soit critique, mais eval, comme tu le sais, permet d'interpréter une chaîne de caractères comme du code Python.

    Si jamais tu n'es pas maître à 100% de la string que tu passes à eval, ça veut dire que tu autorises l'interprétation de code que tu ne connais pas et donc potentiellement dangereux.

    Je ne saurais que te citer l'effaçage de fichiers comme exemple, mais parce que :
    1. ça ne m'intéresse pas de faire ce genre de trucs ;
    2. je n'ai pas encore assez de connaissances pour faire des trucs + costauds, du style envoi de mails ou récupération de données sensibles par Python (ni par autre chose, d'ailleurs).

    Mais si c'est faisable par Python, c'est donc exécutable par eval.
    ...
    ...
    ...
    Même si j'avoue que je viens d'essayer et que je n'y arrive pas !

  6. #6
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    ahhh... mais eval() n'est pas exec(), et puis... bah python n'est déjà pas ce qu'il y a de très sécurisé en soi, enfin, ce que mon avis.

  7. #7
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Je ne vois pas en quoi python n'est pas sécurisé ^^

    Si tu penses au fais que tu donnes les sources avec ou que c'est "décompilable", c'est pas un problème de sécurité.

    Pour les sources, c'est le même problème avec tout les langages.

    Pour le "décompilable", c'est pareil en dot.net par exemple et de manière plus difficile avec n'importe quel langage.

    La sécurité correspond au fait, qu'a partir d'entrée standard du logiciel, tu ne puisse lui faire exécuter du code non prévu.

    Une des failles les plus courantes concernant la sécurité et cela indépendamment du langage, est le buffer overflow. Une autre très courante qui tant à disparaître, c'est l'injection de sql dans les site web.

    Juste pour rappel, les sources de linux sont disponible et cela n'empêche pas que linux est sécurisé.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Citation Envoyé par N.tox Voir le message
    ahhh... mais eval() n'est pas exec()
    Volià un exemple de la dangerosité de eval, ici !

    A noter que je n'ai pas assez de connaissances pour vérifier la justesse de cet exemple, mais j'ai déjà vu des exemples d'utilisation d'eval qui permettent de faire quelque chose qui n'était pas prévu à l'origine par le développeur.

    A étudier : l'utilisation des arguments optionnels globals et locals qui permettent de limiter le champ d'action de eval (si j'ai bien tout compris, ce que je ne garantis pas sur ce sujet )

  9. #9
    Membre Expert
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Par défaut
    Au début de paragraphe que tu sites, il est noté :

    Special care must be taken when using eval with data from an untrusted source.
    Eval est dangereux, si tu lui passes n'importe quoi comme valeur sans en avoir vérifier la pertinence ou t'être protégé des effets de bords.

    Mais en gros c'est comme beaucoup de choses en programmation, si tu prends pas toutes les garanties, tu prends des risques ^^

    Toute vulnérabilité n'est pas du aux fonctions que l'on utilisent, mais au fait que l'on ai pas testé l'ensemble des problèmes que pouvaient poser cette fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a = input ("code : ")
    if a=="1":
        format c:
        print "raté vous avez fais le mauvais choix"

  10. #10
    Membre éclairé
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Par défaut
    Ok je m'aperçois que je m'était vraiment pris la tête pour rien, j'en était a une 30aine de ligne pour arriver à un résultat qui marche même pas :p

    Ma chaine ne contient pas que des chiffres et des minuscules, mais tout les caractère ascii ^^

    Je vais faire des tests pour sur les différentes réponses pour voir ce qui tourne le mieux, sachant effectivement que la boucle pourra tourné a l'infinie.

    bien que je sache que je n'ai pas choisis le meilleur langage pour faire le prog que je fait: un break MD5 (pourra être incrémenté pour le SHA1 a l'avenir): (attaque par dico, et si trouve rien, on attaque la boucle qui test x possibilité jusqu'à trouver un équivalent MD5 (mot exacte ou collision de la somme md5)

    je suppose que j'aurai mieux fait d'utilisé le C pour ce type de programme, mais je n'y connais absolument rien. (php/python/java (dans l'ordre de la meilleur connaissance))

    Voila voila.
    Merci encore.

    Ps: c'est plus pour m'amuser qu'autre chose ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucle et incrémentation
    Par kaking dans le forum Langage
    Réponses: 5
    Dernier message: 16/10/2009, 14h31
  2. Boucle avec incrément de date
    Par Kayno dans le forum SAS Base
    Réponses: 6
    Dernier message: 29/01/2009, 16h14
  3. Boucle avec incrément
    Par popi9987 dans le forum Débuter
    Réponses: 5
    Dernier message: 02/11/2008, 17h13
  4. Boucle auto-incrémentée de année/mois
    Par Gabyro dans le forum ASP
    Réponses: 5
    Dernier message: 01/09/2008, 12h33
  5. Boucle for: incrémentation
    Par flora806 dans le forum Langage
    Réponses: 9
    Dernier message: 22/01/2008, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo