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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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