Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

exercice Python

Posté par
unetablerouge
19-11-19 à 21:13

Bonjour, je suis bloquée sur un programme python.
voila la consigne:

On veut décaler circulairement les éléments d'une liste d'entiers d'une case vers la droite, le dernier élément se retrouvant en tête. Ainsi la liste [1,2,3,4] deviendra [4,1,2,3]. Écrire la fonction rotation qui renvoie la liste une fois retournée.
Ecrire le programme qui saisit les données, appelle la fonction demandée pour faire le calcul et affiche le résultat.

Entrée du programme: Un entier naturel positif ou nul représentant le nombre d'éléments, puis des entiers.

Voila mon programme:

def liste(n):
    liste=[]
    i=0
    while i!=n:
        x=int(input())
        liste.append(x)
        i=i+1
    
def rotation(liste):
    p=n-1
    a=liste[p]
    liste.insert(0,a)
    del liste[p]
    return(liste)

n=int(input())
print(liste(n))
print(rotation(liste))  

Or quand j'exécute le programme le message d'erreur suivant s'affiche :

a=liste[p]
TypeError: 'function' object is not subscriptable

Je ne comprend pas quelle est l'erreur...

Posté par
alb12
re : exercice Python 19-11-19 à 22:30

salut,
dans la fonction liste une variable s'appelle liste
dans la fonction rotation, que designe n ?

Posté par
unetablerouge
re : exercice Python 19-11-19 à 22:49

Salut,
n est le nombre entier naturel représentant le nombre d'éléments dans la liste.

Posté par
alb12
re : exercice Python 19-11-19 à 23:15

dans ce cas il faudrait peut etre faire n=len(liste)

Posté par
unetablerouge
re : exercice Python 19-11-19 à 23:40

Je ne pense pas car n est un entier que l'utilisateur entre au début du programme pour définir la taille de la liste. Pour mettre len(liste), il faudrait qu'il y ai déjà une liste existante

Posté par
perroquet
re : exercice Python 20-11-19 à 00:21

Bonjour, unetablerouge.

Ton objet "liste" est une fonction et pas une liste (ce qui explique le message d'erreur).
J'ai légèrement modifié ton programme pour qu'il fonctionne.

def creation(n):
    liste=[]
    i=0
    while i!=n:
        x=int(input())
        liste.append(x)
        i=i+1
    return liste
    
def rotation(liste):
    p=n-1
    a=liste[p]
    liste.insert(0,a)
    del liste[n]
    return(liste)

n=int(input())
liste=creation(n)
print(liste)
print(rotation(liste))  

Je n'ai pas modifié ton   "p=n-1" mais alb12 a raison: ce serait beaucoup mieux d'écrire avant que   "n=len(liste)".
Tu pourrais ainsi appliquer ta fonction rotation à n'importe quelle liste et pas seulement à celle que tu as créée dans un contexte particulier.
J'ai aussi modifié "del liste[p]"   en   "del liste[n]". Si tu ne fais pas la modification, tu verras ce qui se passe ...

En Python, on peut être beaucoup plus efficace mais je ne suis pas un spécialiste. De plus, j'ai préféré te montrer tes erreurs et comment les corriger.

Posté par
alb12
re : exercice Python 20-11-19 à 14:38

en gardant la philosophie de ton programme je serais tente de creer
1/ la fonction liste qui retourne une liste de taille n
2/ la fonction rotation qui retourne la liste obtenue en faisant passer le dernier element en tete

il suffit de faire rotation(4) par exemple en ligne de commandes


from lycee import *

def liste(n):
    """creation de la liste de taille n""" #pour help(liste)
    #local L,i
    L=[]
    i=0
    while i!=n:
        x=int(input())
        L.append(x)
        i=i+1
    return L

def rotation(n):
    """si L=[1,2,3,4] retourne [4,1,2,3]""" #pour help(rotation)
    #local L,a
    L=liste(n)
    a=L[n-1]
    L.insert(0,a)
    del L[n]
    return(L)

Posté par
alb12
re : exercice Python 20-11-19 à 16:26

c'est mieux si rotation prend une liste en argument


from lycee import *

def liste(n):
    """creation de la liste de taille n""" #pour help(liste)
    #local L,i
    L=[]
    i=0
    while i!=n:
        x=int(input())
        L.append(x)
        i=i+1
    return L

def rotation(L):
    """si L=[1,2,3,4] retourne [4,1,2,3]""" #pour help(rotation)
    #local a,n
    n=len(L)
    a=L[n-1]
    L.insert(0,a)
    del L[n]
    return(L)

Posté par
alb12
re : exercice Python 20-11-19 à 16:52

puis
L=liste(4);rotation(L);

Posté par
unetablerouge
re : exercice Python 20-11-19 à 17:14

Bonjour,
c'est bon mon programme marche et j'ai compris mes erreurs!
J'ai suivi vos conseils en écrivant n=len(liste), et c'est vrai que c'est plus logique.
Merci beaucoup pour vos aides et vos conseils

Posté par
alb12
re : exercice Python 20-11-19 à 17:28

ok



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !