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

  1. #1
    Nouveau Candidat au Club
    TypeError: unsupported operand type(s) for //: 'str' and 'int'"
    Bonjour!
    Je suis un petit débutant en programmation.
    Je veux écrire une fonction prime_numbers qui reçoit comme paramètre un nombre entier nb et qui renvoie la liste des nb premiers nombres premiers.

    Si le paramètre n’est pas du type attendu, ou ne correspond pas à un nombre entier positif, la fonction renvoie None.

    code proposé:
    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
    def prime_numbers(n):
        nombres = [2,n-1,n+1,n+3]
        if n==0:
            return[]
        def premier(n): 
            i=2
            while i<=n and n%i!=0 :
                i=i+1
            if  i==n:
                return (True)
            else:
                return (False)
        for i in range(1, n // 2):
            if premier(i * 2 + 1) == False:
                nombres.append(2 * i + 1)
     
            return nombres

    Mais l'exécution renvoie ce message d’erreur:
    Votre programme a été interrompu par une exception:
    ""Ligne 2: TypeError: unsupported operand type(s) for //: 'str' and 'int"
    je sais que la ligne nombres = [2,n-1,n+1,n+3] ne semble pas correcte. Mais je ne m'y retrouve pas...

  2. #2
    Membre du Club
    Ton programme semble bien confus. Pour obtenir simplement un nombre premier entre 1 et n, tu peux utiliser la bibliothèque Sympy et la fonction isprime(nombre_entier) qui retourne True ou False. Ensuite tu fais, une boucle pour avoir la liste des nb nombres premiers.
    Evidemment que tu peux aussi écrire une fonction premier comme tu as essayer de le faire.

  3. #3
    Membre éclairé
    ça doit être ici for i in range(1, n // 2):, faite print(type(n)), à tout les coup n est une chaîne de caractère et non un nombre,


    sinon quelques remarques:
    en général on ne défini pas une fonction dans une autre, ou alors c'est ce qu'on sais ce qu'on fait , en général c'est quand on a besoin que notre fonction doit être dans le scope de l'autre.
    sinon il y a moyen de beaucoup plus optimiser votre code, de plus que vous sembler prendre un chemin bizarre,

    pour tester si un nombre est premier on peut regarder pour i allant de 2 à racine de n s'il n est divisible par i ou bien utiliser la bonne vielle méthode de la récursivité.

    Citation Envoyé par pzorba75 Voir le message
    tu peux utiliser la bibliothèque Sympy et la fonction isprime(nombre_entier)
    je pense qu'il s'agit là d'un but pédagogique justement, conseiller Sympy à quelqu'un qui débute n'est pas la meilleure idée

  4. #4
    Expert éminent sénior
    Bonjour

    Citation Envoyé par JOHN LOU Voir le message
    Je suis un petit débutant en programmation.
    Oui enfin tu t'es décrit comme "admin bdd" ce qui est signe d'une certaine habitude du monde de l'informatique (sans oublier les fonctions qu'on peut écrire en pl/sql)...

    Donc comme le dit flapili il est certain que tu appelles prime_numbers() avec une chaine.
    Si par exemple ton code commence avec un truc ressemblant à ceci
    Code python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    nb=input("Entrez un nombre :")
    primes_number(nb)

    alors c'est ça car la fonction input() retourne une string =>primes_number(int(nb)) !!!

    Citation Envoyé par JOHN LOU Voir le message
    nombres = [2,n-1,n+1,n+3]
    T'es sûr ??? je veux dire que si "nombres" est sensé ne contenir que des nombres premiers et que j'appelle la fonction avec "9", alors "nombres" contiendra [2, 8, 10, 12] ce qui est loin d'être ressemblant à des nombres premiers. Ou alors on ne parle pas des "mêmes" nombres premiers...

    Citation Envoyé par JOHN LOU Voir le message
    Code python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if  i==n:
        return (True)
    else:
        return (False)

    return i == n !!!

    Citation Envoyé par flapili Voir le message
    en général on ne défini pas une fonction dans une autre, ou alors c'est ce qu'on sais ce qu'on fait , en général c'est quand on a besoin que notre fonction doit être dans le scope de l'autre.
    Non là je suis plutôt d'accord avec ce qu'il a fait. Il écrit une fonction chargée de fiare un travail et il a besoin, pour cela, d'une sous-fonction qui n'a pas besoin d'être vue de tous => il la définit en sous-fonction.
    Simplement j'aurais définit la sous-fonction avant de commencer à travailler dans la fonction.
    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

###raw>template_hook.ano_emploi###