Bonjour,
je revois le cours d’IPT de PCSI pour préparer la PSI à la rentrée.
Le chapitre sur les boucles for et les test if contient plusieurs exemples que je comprends pas totalement, j’ai un niveau faible, si vous pouviez donc m’aider dessus 
\
#Exemple5
def max(l):
m=l[0]
imax=0
for i in range (len(l)):
if m<l[i]:
m=l[i]
imax=i
return[imax,m]
c’est donc une fonctionqui prend en argument une liste l et qui donc la position et la valeur du 1er maximum de cette liste
ma prof a fait un tableau d’avancement pour cette fonction appliquée à [4,3,5,1,5] :
pour i=0, elle donne le tableau suivant : tableau info.PNG - Casimages.com
pour i=0 c’est ok puisque on initialise à l[0]=4
mais pour i=1, on a l[1]=3<m donc ça veut dire que le programme ne verra pas les instructions du test if puisque la condition donnera False,
je vois pas pourquoi ma prof a décidé de garder max et imax aux mêmes valeur que i=0
pour moi on devrait rien mettre dans les cases i=1 
– autre exemple :
#Exemple6
def suite(n):
u=1
l=[u]
for i in range(1,n+1):
u=2*u+1
l.append(u)
return l
x=[n for n in range(11)]
y=suite(10)
plt.plot(x,y,'xk')
plt.show()
on trace la suite U
alors ici le compteur i de la boucle for n’intervient pas dans les instruction qui suivent la boucle for ! comment ça se fait ça ?? on a un compteur qui n’intervient même pas dans les instructions… ça me parait bizarre pcq cmt Python peut savoir s’il doit avancer d’un rang à chaque fois si le compteur n’intervient pas pour le dire…
j’aurais écrit qlqc comme :
def suite(n):
u[0]=1
l=[u]
for i in range(1,n+1):
u[i]=2*u+1
u=u[i]
l.append(u)
return l
x=[n for n in range(11)]
y=suite(10)
plt.plot(x,y,'xk')
plt.show()
après j’avoue c’est bizarre pcq u fait penser à une liste..
merci de votre aide
Python, c’est vraiment de la merde. Je ne comprends pas que l’on enseigne l’info avec un langage qui ne soit pas fortement typé et aussi peu lisible. Enfin bref..
Ton tableau d’avancement donne la valeur des 2 variables à chaque itération.
Une boucle sert à itérer un certain nombre de fois le bloc d’instruction.
Il n’y a aucune nécessité à utiliser la variable servant au comptage de ta boucle dans le bloc d’instruction.
Il faut que tu vois la variable u comme une boite dans lequel on range des choses et dont on peut connaitre son contenu en l’ouvrant.
« u = » signifie je range quelque chose dans la boite de nom u.
« 2*u + 1 » est une expression calculatoire qui signifie je prends le contenu de la boite u, je le multiplie par 2 et j’ajoute 1.
Essaie de construire le tableau d’avancement de cette boucle sur 5 itérations.
Tu devrais mieux comprendre.
u est une variable, pas une liste.
Feedback : ton avis est contraire à une large partie de la communauté scientifique qui utilise python et les lib qui vont bien pour faire efficacement leur travail. Python fait du duck typing et oui ça résout nombre de problèmes posés par le typage fort. Ca en pose bien sûr d’autres.
Porus:
C’est quoi cette merde??
def max(l):
max=l[0]
Tu ne peux pas donner le même nom à une fonction et au résultat qu’elle renvoie!! La fonction c’est une recette de cuisine. La recette renvoie le gâteau (le résultat) et pas la recette elle même!!
Il y a deux choses à reprendre depuis le début.
-
penser les algo en français comme si tu étais la machine.
Je te donne une liste et je te demande une recette qui marche à tous les coups et qui me donne le max de cette liste et l’indice où ce max se trouve. Tu fais comment. Explique moi ça en français.
-
Le minimum vital de syntaxe python. Comprendre ce qu’est une variable.
Quand tu fais a=1 et b=a que ce passe t il ? Ensuite comprendre les tests et les boucles et les objets de base : les srt; les list; et les tuples.
Une fois que tu sera clair avec 1) et 2), tu verras que c’est tout simple.
« alors ici le compteur i de la boucle for n’intervient pas dans les instruction qui suivent la boucle for ! comment ça se fait ça ?? on a un compteur qui n’intervient même pas dans les instructions… ça me parait bizarre pcq cmt Python peut savoir s’il doit avancer d’un rang à chaque fois si le compteur n’intervient pas pour le dire… »
ha oui…tu n’as rien compris à ce qu’est une boucle 
le fait de faire for i in range(N) dit à python de faire une boucle. Ca permet de répéter N fois le corps de cette boucle. comment ferais tu sinon?
dans le corps de la boucle, tu as, à disposition, une variable i.Que tu l’utilises ou pas ne change rien au fait que ce soit une boucle.
commence par répondre à mon 1).
thallium2011, post:3, topic:131262 a écrit:
Porus:
C’est quoi cette merde??
def max(l):
max=l[0]
au temps pour moi 
thallium2011, post:3, topic:131262 a écrit:
- penser les algo en français comme si tu étais la machine.
Je te donne une liste et je te demande une recette qui marche à tous les coups et qui me donne le max de cette liste et l’indice où ce max se trouve. Tu fais comment. Explique moi ça en français.
eh bien je vais voir le 1er élément de cette liste que je note à part, ensuite je regarde 2eme de cette liste et regarde si le 2eme est plus grand que le 1er, si c’est le cas alors je note la valeur du 2eme élément à part et en même temps je note 2 à côté pour avoir la position… et je fais ça autant de fois qu’il y a d’éléments dans la liste.
thallium2011, post:3, topic:131262 a écrit:
- Le minimum vital de syntaxe python. Comprendre ce qu’est une variable.
Quand tu fais a=1 et b=a que ce passe t il ? Ensuite comprendre les tests et les boucles et les objets de base : les srt; les list; et les tuples.
en utilisant l’analogie de Feedback, a est un boîte dans laquelle je range le chiffre 1, et b est une boîte dans laquelle je range une autre boîte notée a, donc b=1 ? 
thallium2011, post:4, topic:131262 a écrit:
dans le corps de la boucle, tu as, à disposition, une variable i.Que tu l’utilises ou pas ne change rien au fait que ce soit une boucle.
alors à quoi ça sert d’avoir une variable i qu’on n’utilise pas par la suite ? c’est purement une question de syntaxe liée à Python ?
ps: fakbill, tu vois j’exagérais pas en disant que j’étais une brèle dans cette matière 
non ce n’est pas si mal 
alors à quoi ça sert d’avoir une variable i qu’on n’utilise pas par la suite ? c’est purement une question de syntaxe liée à Python ?
Oui. D’ailleurs certains écrivent « for _ in ragne(N) » pour dire qu’ils se fichent de la variable de boucle. Tout ce qu’ils veulent c’est « répéter N fois un bout de code ».
‹ _ › dit à l’interpréteur python qu’on ne veut pas s’encombrer d’une variable de boucle. En prépa, ne t’occupe pas de ça. C’est plus de l’ordre de l’esthétisme.
Ca ne te sert à rien d’avoir cette variable mais en quoi ça te gène?? Quand tu code, tu as souvent plein de variables à disposition et tu n’utilises pas tout tout le temps.
eh bien je vais voir le 1er élément de cette liste que je note à part, ensuite je regarde 2eme de cette liste et regarde si le 2eme est plus grand que le 1er, si c’est le cas alors je note la valeur du 2eme élément à part et en même temps je note 2 à côté pour avoir la position… et je fais ça autant de fois qu’il y a d’éléments dans la liste.
oui c’est ça! reste donc à le coder.
en utilisant l’analogie de Feedback, a est un boîte dans laquelle je range le chiffre 1, et b est une boîte dans laquelle je range une autre boîte notée a, donc b=1 ? > 
Oui
.
d’ailleurs pour les listes, y a u exemple que je comprends pas trop,
on écrit une fonction recherche qui prend en argument une liste d’entiers et un entier pour voir si cet entier est dans la liste d’entiers.
alors on peut aisément le faire avec une boucle for, mais mon exemple est dans le chapitre sur la boucle while donc on utilise la boucle while pour le faire…
voici le code :
def recherche(l,x):
i=0
while i<len(l) and l[i]!=x: #donc la boucle while va réitérer tant qu'on ne dépasse
# pas le nombre d'éléments dans la liste et tant que
# l'entier n'est pas trouvé dans la liste
i+=1
if i==len(l): #je comprends pas l'usage de ce if, en quoi la condition est
#importante ? fin je vois le lien entre le nombre d'éléments dans la
#liste
# et le fait que l'élément numéro i de la liste soit égal au nombre
# d'éléments dans la liste
return False
else:
return True
Si a la fin de la boucle while, i == len, cela signifie quoi au niveau de la recherche de ton élément ?
@Porus je pense que tu aurais tout à gagner à désigner un booléen dans recherche(l,x)
def recherche(l,x):
"""
fonction qui prend en entrée une liste l et un entier x, et qui
renvoie en sortie le booléen presence caractéristique de la
présence de x dans l
"""
#initialisation du rang
rang = 0
#définition du booléen de sortie
presence = False
#boucle de recherche
#tant qu'on n'a pas atteint la fin de la liste (rang = len(l) )
#et que l'élément de rang "rang" n'est pas trouvé
while rang < len(l) and l[rang] != x :
#on passe à l'élément suivant
rang+=1
#fin de la boucle while, on ressort avec "rang" qui a une certaine valeur
#si la valeur de "rang" est différente de len(l), donc si la boucle while s'est
arrêtée en cours de chemin, c'est que l[rang] == x, donc il y a présence
if rang != len(l) :
presence = True
#et à la fin tu return la valeur booléenne de "presence"
return presence
Chose très importante, commente tes codes, que ce soit pour les concours, tes profs, ou les gens qui te liront un jour
thallium2011, post:6, topic:131262 a écrit:
en utilisant l’analogie de Feedback, a est un boîte dans laquelle je range le chiffre 1, et b est une boîte dans laquelle je range une autre boîte notée a, donc b=1 ? > 
Oui
.
Non, c’est faux. Dans b, on ne place pas la boite a mais la valeur qu’elle contient. C’est important parce que même si on change ensuite la valeur de a, cette modification ne se répercute pas automatiquement sur b : une variable désigne une valeur (un entier, une chaine, un objet, etc.), pas une expression.
Cependant, la métaphore de la boite n’est pas pertinente en Python : elle ne permet pas de comprendre les phénomènes d’alias (cela supposerait qu’un objet soit dans deux boites différentes simultanément, ce qui est très contre-intuitif).
Une bonne représentation des variables en Python (plus généralement du modèle mémoire) est un schéma avec des flèches comme dans Pythontutor (très pratique pour suivre le déroulement d’un programme).
thallium2011, post:8, topic:131262 a écrit:
Si a la fin de la boucle while, i == len, cela signifie quoi au niveau de la recherche de ton élément ?
bah on va sortir de la boucle while puisque le cas i=len(l) ne remplira pas la condition i<len(l)…
@Allumer le Freud : il est génial ton code, je comprends bcp mieux 
en fait en utilisant le boucle while, on « devine » indirectement si x est dans la liste ou pas selon si le compteur (rang) parcourt toute la liste (donc que les conditions de la boucle while sont toujours vérifiées) ou il s’arrête avant et dans ce cas on trouve bien x dans la liste.
Fin je dis ça pcq ça diffère de la méthode avec une boucle for dans laquelle on aurait directement comparé les valeurs de la liste 1 par 1 avec x.
Bref merci bcp
thallium2011, post:11, topic:131262 a écrit:
Non, c’est faux. Dans b, on ne place pas la boite a mais la valeur qu’elle contient. C’est important parce que même si on change ensuite la valeur de a, cette modification ne se répercute pas automatiquement sur b
Une bonne représentation des variables en Python (plus généralement du modèle mémoire) est un schéma avec des flèches comme dans Pythontutor (très pratique pour suivre le déroulement d’un programme).
ah okk bv,
merci pour le site aussi 
thallium2011, post:11, topic:131262 a écrit:
Une bonne représentation des variables en Python (plus généralement du modèle mémoire) est un schéma avec des flèches comme dans Pythontutor (très pratique pour suivre le déroulement d’un programme).
j’essaie d’utiliser ce site pour mieux comprendre un code mais est-ce normal que cela ne me montre rien d’intéressant ? :
C’est parce que pour l’instant tout ce que ton code fait c’est définir une fonction (tu ne l’utilises pas, il faut l’appeler sur une liste pour que tu visualises son exécution).
Tu peux par exemple rajouter deux lignes après la déclaration de fonction comme ça :
def max(l):
m=l[0]
imax=0
for i in range (len(l)):
if m<l[i]:
m=l[i]
imax=i
return[imax,m]
l = [0,4,2,3,7,-2]
print(max(l))
D’ailleurs pas besoin d’importer de librairie pour cette fonction.
Oui !
Enfin non… Ca dépend si le type est mutable ou pas.
En clair, si on peut modifier le contenu d’un objet après l’avoir créé alors a=b veut dire que a est un autre nom pour l’objet b. Si on modifie b alors a sera modifié.
Essaye avec des listes par exemple.
Avec des tuples qui ne sont donc pas modifiables, a=b veut dire ‹ créé une copie de l’objet b et nomme la a ›.
Mais tu va me dire qu’avec des entiers, on peut modifier le contenu d’un objet
a=2
a=a+1
Mais que b=a ne veut pas dire que b sera modifié quand a le sera !!
Donc ???
En fait les entiers python ne sont pas mutables.
a=a+1 ne change pas la valeur dans l’objet a. a+1 créé un nouvel entier qu’on appelle… Mais ce n’est plus le même objet.
a=1000
id(a)
a=a+1
id(a)
Montre bien que « l’identité » de a à changé.
C’est une particularité de python cette distinction mutable/non mutable.
Mon fils s’essaie au python sur ioi ( il approche du niveau 4) et est emballé par Pythontutor que je lui est signalé après lecture de vos échanges.
Est-il intéressant et normal dans son cas de s’en servir (il dit que cela facilite énormément les choses) , où cela va t-il a l’encontre de l’objectif et de l’esprit de ioi?
Mais arrêter de vous poser des questions comme ça et dites au fiston de venir nous demander lui même ici quand il aura des problemes.
Il fait du python car ça lui plaît ? Si oui très bien, laisser le faire et bientôt il coder à des petites choses pour lui et non pas parce que ce sera un exo. Quand il sera coincé, il fera ce que tout informaticien fait : Google et il demandera sur les forums qui vont bien.
Je n’ai pas l’impression que vous répondiez a ma question. Pas de façon claire en tout cas.
Pour moi l’informatique s’est arrêté au TO7. Je suis loin d’en comprendre le début et j’ai bien conscience que ma question est sans doute stupide ( Ce que semble confirmer votre réponse).
J’aimerai quand même savoir si Pythontutor peut être utilisé autant qu’on le veut en phase d’apprentissage sans que cela nuise a l’aquisition de bases solides.
Quant a m’arrêter de me poser des questions ( stupides) concernant l’avenir scolaire de mon enfant, je pensais que la vocation de ce site était un peu d’y répondre. Je vais cependant suivre votre conseil et arrêter de vous importuner.