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 :

Enlever une valeur d'une boucle 'for' ?


Sujet :

Python

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Apprenti ingénieur réseaux LAN, DC
    Inscrit en
    Mars 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti ingénieur réseaux LAN, DC
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 1
    Par défaut Enlever une valeur d'une boucle 'for' ?
    Bonjour,

    Débutant en python et venant d'un bts réseau, je m'exerce a faire des scripts pour moi et les autres, etc... et en voulant le perfectionner je suis tombé sur un couack!

    Le but de mon script est de montrer le nombre d'adresse IP disponible via un masque sous réseau (hors adresse du réseau et broadcast ) <= et c'est la le problème.
    les variables ip1 à 4 sont définies par l'utilisateur par un entier entre 0 et 255. j'ai pensé a mettre avant ma boucle for un ip4=+ 1 pour eviter qu'il affiche la première adresse soit celle du réseau, mais pour evité d'afficher la dernière je ne vois pas trop comment faire.

    assez parlé, voila un bout de mon code:

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    print("les valeur du CIDR vont de /1 à* /32 \n\n")
    cidr = input("Sasir le CIDR du masque voulu (exemple 24 pour /24): \n\n")          
    cidr = int(cidr)
     
    i = 0                                                                               # Premier compteur.
    B_cidr = False                                                                      # Arret de la première boucle. (Boucle_cidr)
    Bi_cidr = False                                                                     # Arret de la deuxième boucle.(Boucle.inbriquée_cidr)
     
     
    while B_cidr != True:                                                               # Boucle pour informer et verifier si l'utilisateur reste dans les limites définie au début.
        if cidr >= 1 and cidr <= 32:
            while Bi_cidr != True:
                if i == cidr:
                    nb_reseau_via_cidr = (2 ** cidr)                                    # Calcul du nombre de réseau via un masque sous réseau
                    print("Votre masque sous réseau est {}".format (mask[i]))
                    print("Le nombre de réseau disponible est de {}".format (nb_reseau_via_cidr))
                    Bi_cidr = True
                else:
                    i += 1
            B_cidr = True
        else:
            cidr = input("Sasir le CIDR du masque voulu (exemple 24 pour /24): \n\n")
            cidr = int(cidr)
     
    tabmask = [0, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 14, 15, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    # La premiere valeur du tableau mask est de 0 pour la comparaison dans la boucle ci dessous afin d'éviter les erreurs
     
    nb_hotes_par_reseau = (2 ** tabmask[i]) - 2   
     
    for loop in range (nb_hotes_par_reseau):
            if ip4 < 255:
                print("{}.{}.{}.{}".format (ip1, ip2, ip3, ip4))
                ip4 += 1
     
            elif ip4 > 254 and ip3 < 255:
                print("{}.{}.{}.{}".format (ip1, ip2, ip3, ip4))
                print("")
                ip3 += 1
                ip4 = 0
     
            elif ip4 > 254 and ip3 > 254 and ip2 < 255:
                ip2 += 1
                ip3 = 0
                ip4 = 0
                print("{}.{}.{}.{}".format (ip1, ip2, ip3, ip4))
                print("")
     
            elif ip4 > 255 and ip3 > 255 and ip2 > 255 and ip1 <= 255:
                ip1 += 1
                ip2 = 0
                ip3 = 0
                ip4 = 0
                print("{}.{}.{}.{}".format (ip1, ip2, ip3, ip4))
                print("")
     
            else:
                print("Erreur")
    Merci d'avance pour votre aide.

    Xen

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Bonjour,

    Quand tu postes du code essaie de donner un bout de code qui tourne; dans ton code, les variables "mask" et "ip1" à "ip4" ne sont pas initialisées...

    Vu que tu boucles sur le nombre d'hôtes du sous-réseau, je ne comprends pas ton problème. Tu as déjà soustrait 2 de ce nombre pour les adresses de réseau et de broadcast, donc si tu commences à l'adresse de réseau +1 ça devrait être bon.

    Cela dit, ton code n'est pas très propre et trop compliqué. Par exemple, la boucle imbriquée dans la première partie semble ne servir à rien du tout, elle se contente d'incrémenter i jusqu'à ce que i == cidr. tabmask[i ] est simplement 32 - i. Et ta boucle d'affichage... je doute qu'elle soit correcte mais j'ai même pas envie de la debugger... Rien que le fait que tu incrémentes parfois avant d'afficher et parfois après ça sent mauvais...

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 815
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Xenie Voir le message
    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
    print("les valeur du CIDR vont de /1 à* /32 \n\n")
    cidr = input("Sasir le CIDR du masque voulu (exemple 24 pour /24): \n\n")          
    cidr = int(cidr)
     
    i = 0                                                                               # Premier compteur.
    B_cidr = False                                                                      # Arret de la première boucle. (Boucle_cidr)
    Bi_cidr = False                                                                     # Arret de la deuxième boucle.(Boucle.inbriquée_cidr)
     
     
    while B_cidr != True:                                                               # Boucle pour informer et verifier si l'utilisateur reste dans les limites définie au début.
        if cidr >= 1 and cidr <= 32:
            while Bi_cidr != True:
                if i == cidr:
                    nb_reseau_via_cidr = (2 ** cidr)                                    # Calcul du nombre de réseau via un masque sous réseau
                    print("Votre masque sous réseau est {}".format (mask[i]))
                    print("Le nombre de réseau disponible est de {}".format (nb_reseau_via_cidr))
                    Bi_cidr = True
                else:
                    i += 1
            B_cidr = True
        else:
            cidr = input("Sasir le CIDR du masque voulu (exemple 24 pour /24): \n\n")
            cidr = int(cidr)
    Bonjour

    Qu'est-ce que tu te compliques la vie franchement !!!
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while True:
            cidr = int(input("Saisir le CIDR du masque voulu (exemple 24 pour /24): \n\n"))
            if cidr >= 1 andr cidr <= 32: break
            print("cidr incorrect - recommencez !!!")
    # while
    nb_reseau_via_cidr = 2 ** cidr
    print("Le nombre de réseau disponible est de %d" % nb_reseau_via_cidr)

    Citation Envoyé par Xenie Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabmask = [0, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 14, 15, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    # La premiere valeur du tableau mask est de 0 pour la comparaison dans la boucle ci dessous afin d'éviter les erreurs
    Je ne vois pas trop en quoi "0" au début éviterait une erreur quelconque mais bon...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    tabmask=[0,]+range(31, -1, -1)

    Citation Envoyé par Xenie Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_hotes_par_reseau = (2 ** tabmask[i]) - 2
    Je comprends. C'est pour que le "xième" élément de ton tableau soit indicé "x" (et non "x-1"). Ca te faisait donc tant suer d'écrire tabmask[i-1] que tu mémorises une valeur inutile...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_hotes_par_reseau=2 ** (32 - i) - 2
    ... voire que tu mémorises 33 valeurs inutiles ???

    Citation Envoyé par Xenie Voir le message
    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
    for loop in range (nb_hotes_par_reseau):
            if ip4 < 255:
                print("{}.{}.{}.{}".format (ip1, ip2, ip3, ip4))
                ip4 += 1
     
            elif ip4 > 254 and ip3 < 255:
                print("{}.{}.{}.{}".format (ip1, ip2, ip3, ip4))
                print("")
                ip3 += 1
                ip4 = 0
     
            elif ip4 > 254 and ip3 > 254 and ip2 < 255:
                ip2 += 1
                ip3 = 0
                ip4 = 0
                print("{}.{}.{}.{}".format (ip1, ip2, ip3, ip4))
                print("")
     
            elif ip4 > 255 and ip3 > 255 and ip2 > 255 and ip1 <= 255:
                ip1 += 1
                ip2 = 0
                ip3 = 0
                ip4 = 0
                print("{}.{}.{}.{}".format (ip1, ip2, ip3, ip4))
                print("")
     
            else:
                print("Erreur")
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ip=[0,]*4
    for ip[0] in range(256):
        for ip[1] in range(256):
            for ip[2] in range(256):
                for ip[3] in range(256): print(ip)
    A adapter bien évidemment en fonction du cidr mais tu vois, un peu plus simple que tous tes if en brochette...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 11h05
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  4. passer une valeur d'une requête a une table
    Par LesLemmings dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/06/2006, 14h13
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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