Python liste de carrés d'un nombre entier

Bonsoir,

Je ne comprends pas pourquoi le programme ne donne pas la liste voulue...114994

Réponses

  • Bonjour,
    C'est peut-être cela que vous souhaitez faire. En fait, vous n'avez mis qu'un seul élément dans votre liste l.
    import numpy as np
    def carres(N):
        l=np.zeros(N+1)
        i = 0
        while i*i <= N:
            l[i*i]=1
            i=i+1
        return l
    print(carres(10))
    
    0, 1, 4 et 9 sont bien des carrés.
    Cordialement,
    Denise Chemla

    [Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]
  • Bonjour,
    Sans le module numpy on peut aussi créer la liste l grâce à :
    l = []
    for _ in range(N+1):
         l.append(0)
    
    Si on écrit juste "l=[0]*(N+1)" alors tous les éléments de la liste renvoient vers la même variable ; donc modifier un élément modifie tous les autres.

    Et à la fin tu as écrit "return 1" au lieu de "return l".
  • Bonjour ,
    pourquoi compliquer quand on peut faire simple
    '''-- liste des carrés de 1 à N  ---------
    --
    --
    ---------------------------------------'''
    def liste_carres(N):
        liste = []
        for i in range(N):
            liste.append(i*i)
        return liste
    
    print (liste_carres(8))
    
    
  • Ton programme ne renvoie pas la même chose que ce que veut faire OShine, fm_31. Mais on peut quand même simplifier le programme d'OShine :
    import sqrt from math
    def carres(N):
         return [(sqrt(i)==int(sqrt(i)) for i in range(N+1)]
    
  • @Calli

    Ceci :
    l = [0]*(N+1)
    
    ne poserait aucun problème car 0 (comme tout entier) est un objet immutable. Il est impossible de le modifier en place. Si tu remplaces un 0 de cette liste par autre chose qui n'est pas 0, l'objet mis à la place du 0 aura forcément une autre adresse, donc les autres slots de la liste (qui contiennent chacun l'adresse de 0) ne seront pas affectés.

    Le problème auquel tu penses concerne les objets « mutables » (listes, ensembles autres que frozenset(), dictionnaires...).
  • Effectivement brian, j'ai testé. Mais j'ai appris à toujours être prudent dans ce genre de cas. :-D
  • Le problème apparaît quand on utilise les méthodes d’un mutable.
    Python 3.9.1 (default, Dec  8 2020, 07:51:42) 
    [GCC 10.2.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> l=[0]*5
    >>> l
    [0, 0, 0, 0, 0]
    >>> l[1]=2
    >>> l
    [0, 2, 0, 0, 0]
    >>> m=[[0]]*5
    >>> m
    [[0], [0], [0], [0], [0]]
    >>> m[1]=2
    >>> m
    [[0], 2, [0], [0], [0]]
    >>> m[2].append(2)
    >>> m
    [[0, 2], 2, [0, 2], [0, 2], [0, 2]]
    >>> n=[[]]*5
    >>> n[1]=2
    >>> n
    [[], 2, [], [], []]
    >>> n[2].append(2)
    >>> n
    [[2], 2, [2], [2], [2]]
    >>> o=[[]]*5
    >>> o[1].append(2)
    >>> o
    [[2], [2], [2], [2], [2]]
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Oshine : ton programme ne fonctionne pas car tu as écrit
    return 1
    
    au lieu de
    return l
    
    à la dernière ligne.
  • Bonjour,

    Plus simple:
    import numpy as np
    
    print(np.linspace(0,10,11)**2)
    
    Ou:
    import numpy as np
    
    def carres(n):
        return np.linspace(0,n,n+1)**2
    
    print(carres(10))
    

    Cordialement,

    Rescassol
  • Je pense qu’on a mal lu son script. Il ne veut pas la liste des carrés, il veut une liste indicatrice des carrés.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Bonjour,

    Il faut dire que la phrase:
    > Je ne comprends pas pourquoi le programme ne donne pas la liste voulue...
    ne dit pas ce qu'est la liste voulue.
    Il devrait comprendre qu'on est pas dans sa tête.

    Cordialement,

    Rescassol
  • @bisam c'est déjà mieux, on aurait > [1,0,0,0 ..] au lieu de >1 :-)

    La remarque est cependant bonne : éviter d'employer le l (L minuscule)
    "J'appelle bourgeois quiconque pense bassement." Gustave Flaubert
  • Merci pour vos réponses mais je débute en Python, je cherche la simplicité.

    Il faut que j'apprenne la commande "append" ça a l'air intéressant.

    Voici l'énoncé pour ceux qui sont curieux.

    @Bisam
    Merci ça a résolu mon problème et j'obtiens la liste [1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0]115010
    2.png 201K
Connectez-vous ou Inscrivez-vous pour répondre.