Python aide pour un petit programme
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Python aide pour un petit programme



  1. #1
    Lionelno

    Python aide pour un petit programme


    ------

    Hello les gens !

    Si quelqu'un pouvait m'aider à comprendre ce petit programme ce serait sympa, le voici :


    Code:
    def nbPremiers(Min, MAX):
       '''Calcule les nombres premiers entre deux chiffres'''
    
       while Min < MAX :
    
       aa = [j for i in range(2, int(MAX**0.5 + 1)) \
                  for j in range(i*2, MAX, i)]
    
       return [x for x in range(Min, MAX) if x not in aa]
    >>> 
    >>> nbPremiers(1900, 2100)
    
    [1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987,
    1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053,
    2063, 2069, 2081, 2083, 2087, 2089, 2099]

    -----
    Dernière modification par JPL ; 06/01/2016 à 14h27. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. #2
    CM63

    Re : Python aide pour un petit programme

    Bonjour,

    Je suppose que c'est "entre deux nombres" et non pas "entre deux chiffres", parce sinon ce serait vite vu

  3. #3
    CM63

    Re : Python aide pour un petit programme

    Bonjour,

    Une première remarque : évite d'utiliser des noms de fonction comme nom de variable: tels que Min et Max, tu risques d'écraser des fonctions existantes, Python ne préviendra pas et tu auras perdu ces fonctions en te demandant ce qui t'arrive . Utilise plutôt Imax , Imin , par exemple ou i_max , i_min .

  4. #4
    CM63

    Re : Python aide pour un petit programme

    Après j'ai du mal à comprendre l'algorithme. Peux-tu expliquer l'algorithme utilisé avec une phrase en français? C'est une bonne habitude à prendre , et de le faire dans le source de ton programme qui du même coup sera documenté : utile pour toi dans 6 mois ou pour tes successeurs dans ton job

  5. A voir en vidéo sur Futura
  6. #5
    Tryph

    Re : Python aide pour un petit programme

    Salut:

    Dernière modification par JPL ; Hier à 15h27. Motif: Ajout de la balise Code (#) pour garder l'indentation
    l'intention est louable mais c'est raté, il manque des indentations
    le code correct est le suivant (j'en ai profité pour le rendre un peu plus conforme aux convention en Python aussi):
    Code:
    def nb_premiers(min_, max_):
        '''Calcule les nombres premiers entre deux chiffres'''
        while min_ < max_:
            aa = [j for i in xrange(2, int(max_ ** 0.5 + 1))
                  for j in xrange(i * 2, max_, i)]
            return [x for x in xrange(min_, max_) if x not in aa]

    Citation Envoyé par Lionelno Voir le message
    Si quelqu'un pouvait m'aider à comprendre ce petit programme ce serait sympa
    on va essayer...



    première impression: c'est un code qui fonctionne sans doute mais qui est écrit pour être le plus court possible on dirait. ce qui donne un résultat dégueulasse et pas facile à comprendre.

    deuxième impression: c'est quoi ce while min_ < max_ avec un return sans condition à la fin?
    ça rime à rien à part à embrouiller le lecteur... en gros c'est l'équivalent d'un if min_ < max_:
    si min_ est inférieur à max_ on fait le traitement et on retourne le résultat, sinon, on ne retourne rien explicitement (=on retourne None)



    ensuite on peut décomposer la première instruction après le while:
    aa = [j for i in xrange(2, int(max_ ** 0.5 + 1)) for j in xrange(i * 2, max_, i)]

    la partie en orange génère une liste (avec mes modifs c'est un iterateur, mais on va pas s'embêter avec ce genre de nuance ici) de tous les entiers entre 2 compris et la racine carrée du maximum à laquelle on ajoute 1, le tout arrondi à l'entier inférieur.
    pour max_ = 2100, la liste générée est alors celle-ci: [2, 3, 4, 5, 6, ..., 42, 43, 44, 45]

    le for i in avant la partie en orange parcourt cette liste et stocke le nombre courant dans la variable i.

    pour chaque valeur prise par la variable i (=chaque valeur contenue dans la liste orange), la partie en bleu génère une liste contenant tous les entiers entre le double de la valeur de la variable i et le maximum, avec un pas égal à la valeur de la variable i.
    c'est à dire que:
    - pour i=2, la liste va contenir un entier sur 2
    - pour i=3, la liste va contenir un entier sur 3
    - pour i=45, la liste va contenir un entier sur 45

    le for j in avant la partie en bleu parcourt chacune de ces listes et stocke le nombre courant dans la variable j.

    le j en début d'instruction et les crochets qui entourent le tout veulent dire qu'une liste va être créée contenant toutes les valeurs que va prendre j pendant le processus.
    le tout est bien entendu stocké dans la variable aa



    on peut maintenant décomposer la 2e instruction:
    return [x for x in xrange(min_, max_) if x not in aa]

    la partie en orange génère une liste de tous les entier entre le minimum et le maximum, le for x in qui précède parcourt cette liste et stocke chaque valeur successive dans la variable x.
    les parties en bleu font que chaque valeur prise par x sera ajouté à une liste finale si la valeur est présente dans la liste aa.
    le tout est retourné au code appelant et contient normalement la liste des nombres premiers entre le minimum et le maximum.



    conclusion: de mon point de vue, ce code pue: c'est pas lisible, c'est difficilement compréhensible, ça respecte pas les conventions de codage de python, ça n'utilise pas d'iterateur quand ça pourrait/devrait, les nomes de variables ne veulent rien dire. c'est pas le genre de code que je conseillerai à qui que ce soit d'étudier, sauf peut être pour se rendre compte de ce qu'il ne faut surtout pas faire.

    ce code suivant fait très exactement la même chose, en moins compact certes, mais en nettement plus lisible:
    Code:
    def nb_premiers_2(min_, max_):
        if min_ < max_:
            intermediate_list = range(2, int(max_ ** 0.5 + 1))
            not_first_numbers = []
            for inter in intermediate_list:
                not_first_numbers += range(inter * 2, max_, inter)
    
            first_numbers = []
            for number in xrange(min_, max_):
                if number not in not_first_numbers:
                    first_numbers.append(number)
    
            return first_numbers


    pour finir, si tu veux en apprendre un peu plus sur la syntaxe sur-utilisée dans le code que tu nous fournis, tu peux te renseigner sur les comprehensions de listes. C'est très utile pour faire du code compact et c'est une horreur quand on en abuse.

  7. #6
    Tryph

    Re : Python aide pour un petit programme

    petit ajout:
    l'algo en question semble s'appuyer sur le Crible d'Ératosthène

  8. #7
    imoca

    Re : Python aide pour un petit programme

    Si le min=0 alors il renvoie 1 qui n'est pas un nombre premier.

  9. #8
    CM63

    Re : Python aide pour un petit programme

    Bonjour,

    Citation Envoyé par imoca Voir le message
    Si le min=0 alors il renvoie 1 qui n'est pas un nombre premier.
    Ben si, vu que 1 n'est divisible que par 1 et par lui-même.

    A plus.

  10. #9
    imoca

    Re : Python aide pour un petit programme

    wikipédia:

    Ainsi, 1 n'est pas premier car il n'a qu'un seul diviseur entier positif .

  11. #10
    CM63

    Re : Python aide pour un petit programme

    Bonjour,

    Citation Envoyé par imoca Voir le message
    wikipédia:
    Ainsi, 1 n'est pas premier car il n'a qu'un seul diviseur entier positif .
    Ce sujet est controversé donc tu adaptes ton logiciel selon que tu veille que ton logiciel dise que 1 est premier ou pas.

    A plus

  12. #11
    JPL
    Responsable des forums

    Re : Python aide pour un petit programme

    Définition extraite de Wikipedia :

    Un nombre premier est un entier naturel qui admet exactement deux diviseurs distincts entiers et positifs (qui sont alors 1 et lui-même). Ainsi, 1 n'est pas premier car il n'a qu'un seul diviseur entier positif ; 0 non plus car il est divisible par tous les entiers positifs.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

Discussions similaires

  1. Idée pour un programme sur Python
    Par killian971317 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 23/09/2015, 18h04
  2. petit problème dans mon programme python
    Par souchi6 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 05/01/2013, 14h13
  3. {MikroC} Besoin d'aide pour petit programme
    Par invite3e8637a7 dans le forum Électronique
    Réponses: 4
    Dernier message: 09/02/2010, 10h00
  4. Besoin d'aide pour un petit programme...
    Par flodimoit dans le forum Électronique
    Réponses: 7
    Dernier message: 25/09/2008, 12h56
  5. aide petit programme PIC16F877
    Par solid_sneak06 dans le forum Électronique
    Réponses: 12
    Dernier message: 26/04/2006, 20h18