"Input" retourne un string. Toi, tu veux des nombres. Il y a bien une conversion à faire, mais pas en string, en float (les longueurs peuvent être non-entières) ! il faut L = float(input("longueur ?").
Par ailleurs, inutile d'initialiser les nombres. C'est leur imputation qui en tient lieu. Enfin, je prévoirais trois lignes pour les trois entrées.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
La méthode format appliquée à une chaîne de caractères permet de remplacer des tags {i} ou {foo} respectivement par la valeur du ième argument ou de l'argument nommé foo.
Les valeurs passées en argument sont celles qui seront utilisées, il n'y a pas de transformation particulières.
Quand tu mets en argument la valeur 'L' il s'agit d'une chaîne de caractères, pas de la valeur de ta variable L.
Au passage, on préfère aujourd'hui les f-strings à l'utilisation de ‘ormat.
>>> f'{5}: {"salut"}'
'5: salut'
Mais l'une comme l'autre, je pense que c'est trop avancé pour ton niveau actuel.
Effectivement avec trois entrées et des floats ça marche sans problème. J'aurais cependant été curieux de voir la solution avec une seule entrée et .format.
Bonjour. Je bloque sur un exercice python qui est le suivant :
À partir d'une liste de 20 termes aléatoires de 8 à 28, effectuer un tri décroissant sans utiliser de fonction toute faite du type sort de python. Le tri doit s'effectuer en utilisant les indices de la suite.
Créer la suite n'est pas compliqué mais je n'arrive pas à faire le tri avec les indices.
À partir d'une liste de 20 termes aléatoires de 8 à 28, effectuer un tri décroissant sans utiliser de fonction toute faite du type sort de python. Le tri doit s'effectuer en utilisant les indices de la suite.
Créer la suite n'est pas compliqué mais je n'arrive pas à faire le tri avec les indices.
Il s'agit sans doute d'un tri par dénombrement. Soit L la liste des 20 entiers. Tu crées une liste M de 28+1=29 éléments valant tous 0, tu parcours L en sorte qu'à la fin, M contient à l'indice i l'effectif de i dans la liste L.
Il ne te reste plus qu'à parcourir M par indices à partir de la fin et de générer ta liste triée décroissante en répétant à chaque fois l'indice le nombre de fois indiqué par la valeur lue dans M. Avec la liste M ci-dessus, tu obtiens 27 deux fois, puis 25 une fois, etc.
Je viens de m'apercevoir qu'on pouvait ajouter des termes à une liste comme avec une chaine, en utilisant "+" !
Alors, je me demande bien quel est l'intérêt d'utiliser "append" ?
D'autant plus qu'avec "+", on peut ajouter plusieurs termes en même temps à une liste, alors que "append" ne fonctionne qu'avec un seul élément à chaque fois.
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
+ permet de concaténer deux listes et d'en renvoyer une nouvelle. append ajoute un élément à la fin de la liste courante.
Tu as aussi extend qui permet d'étendre la liste courante avec une autre liste donnée en paramètre, et += qui est équivalent car réalise une concaténation en-place (donc en modifiant la liste courante).
Ça a le même effet en tout cas.
Mais pour ajouter un unique élément la première solution reste préférable, elle n'est pas vraiment plus longue (3 caractères de plus) et elle évite de créer une liste temporaire inutile.
Le comportement un peu spécial du += est aussi plus difficile à aborder.
D'accord, mais liste.append(val), c'est la même chose que liste += [val], non ?
Alors, comme la seconde solution est bien plus courte et lisible, pourquoi utiliser la première solution ?
La sémantique est la même. Je pense qu'utiliser += est moins courant qu'utiliser append, tout simplement ça fait curieux de créer une liste juste pour un élément et en plus append est fait pour ça. Après, on peut regarder les performances. Le désassemblage du bytecode n'est pas concluant. En faisant quelques mesures, il semble que append soit légèrement plus rapide :
from time import perf_counter
def append_op(n):
L=[]
for i in range(n):
L+=[2*i+1]
def append_method(n):
L=[]
for i in range(n):
L.append(2*i+1)
def append_method_opt(n):
L=[]
append=L.append
for i in range(n):
append(2*i+1)
n=5*10**7
for f in [append_op, append_method, append_method_opt]:
begin_perf=perf_counter()
f(n)
print("%s : %.1fs" %(f.__name__,perf_counter()-begin_perf))
Je ne connais pas append=L.append. Je vais étudier ça.
C'est une micro-optimsation. En effet, la syntaxe truc.machin cache un appel et celui-ci a un coût, certes faible, mais répété des millions de fois, cela peut valoir la peine d'éviter le recalcul. J'ai écrit append=L.append mais tu peux appeler la variable comme tu souhaites. En première approximation et même en deuxième, tu peux ignorer.
zakod a écrit:
C'est ça, la "liste en compréhension " ?
Non, c'est autre chose même si ici c'est ce qu'on aurait pu utiliser. Parfois, on peut remplacer un usage répété de la méthode append par une syntaxe bien pratique et plus courte. Dans le cadre du code que j'ai donné en exemple, ça donnerait :
L=[2*i+1 for i in range(n)]
zakod a écrit:
Pour le peu de temps gagné par la deuxième sur la première méthode, je préfère le +=.
Je comprends, c'est vrai que c'est un truc de moins apprendre mais c'est quelque chose de peu employé et effectivement moins lisible. append, c'est une méthode très très utilisée, c'est l'équivalent du push_back de C++ ou de add des arrayList de Java, ça montre qu'une liste en Python est en fait un vecteur (un tableau extensible).
Je souhaiterais récupérer le corrigé de la dernière activité du cours python, l'évolution du jeu du labyrinthe ( client/serveur). Avec la suppression des activités, je ne peux accéder au corrigé, et je n'avais pas pris le temps de finir (j'avais un autre mooc sur le feu sur FUN)... Je voudrais en particulier vérifier comment était gérée la partie client pour pouvoir afficher les messages reçus par le serveur et attendre en même temps la saisie du joueur.
Voici le lien de l'activité en question (j'étais entrain de réaliser le TP depuis quelques jours ) mais je ne sais pas si ça va vraiment t'aider à récupérer le corrigé.
J'ai réussi à faire ce qui suit après beaucoup de tâtonnements. Tout débutant que je suis, je pense que c'est loin d'être idéal, notamment les trois "prints" successifs ;
1 #! /usr/bin/python
2 # coding utf-8
3
4 i = 0
5 P = ["je" , "tu" , "il/elle" , "nous" , "vous ", "ils/elles "]
6 D = ["e", "es", "e", "ons", "ez", "ent"]
7 rad = "chant"
8
9 while i< len(P):
10 print(P [i], end=" ")
11 print(rad, end="")
12 print( D [i])
13
14 i = i + 1
J'ai réussi à faire ce qui suit après beaucoup de tâtonnements. Tout débutant que je suis, je pense que c'est loin d'être idéal, notamment les trois "prints" successifs ;
1 #! /usr/bin/python
2 # coding utf-8
3
4 i = 0
5 P = ["je" , "tu" , "il/elle" , "nous" , "vous ", "ils/elles "]
6 D = ["e", "es", "e", "ons", "ez", "ent"]
7 rad = "chant"
8
9 while i< len(P):
10 print(P [i], end=" ")
11 print(rad, end="")
12 print( D [i])
13
14 i = i + 1
Comment l'améliorer ? Merci encore.
[Attention, tu as inclus les lignes de code dans ton code et tu as placé des espaces après certains pronoms]
Sans aller jusqu'à t'invoquer la PEP 8, ne pas placer d'espace entre P ou D et le crochet qui suit ou après des parenthèses (ça reste un détail malgré tout).
Il y a essentiellement un point qu'il faut aboslument corriger même si ton code marche : c'est l'usage de while au lieu de for. Donc en reprenant basiquement ton code, ça donnerait
P = ["je" , "tu" , "il/elle" , "nous" , "vous ", "ils/elles "]
D = ["e", "es", "e", "ons", "ez", "ent"]
rad = "chant"
for i in range(len(P)):
print(P [i], end=" ")
print(rad, end="")
print( D [i])
Ensuite les trois print peuvent être regroupés en un seul, de différentes manières, tout dépend du souhait d'amélioration de ton niveau, le plus basique serait :
P = ["je" , "tu" , "il/elle" , "nous" , "vous ", "ils/elles "]
D = ["e", "es", "e", "ons", "ez", "ent"]
rad = "chant"
for i in range(len(P)):
print(P [i], rad+ D [i])
mais il serait plus approprié d'utiliser des chaînes formatées.
Pour être plus pythonique, il serait bon de zipper prénoms et terminaisons :
for pronom, term in zip(P,D):
print(f"{pronom} {rad}{term}")
Enfin, tu peux écrire un oneliner :
print('\n'.join([f"{pronom} {rad}{term}" for pronom, term in zip(P,D)]))
ce genre de tournure est courant en Python.
- Edité par PascalOrtiz 13 février 2020 à 10:55:57
J'ai fait un copier coller de vim, d'où les lignes de code qui apparaissent deux fois. Les espaces sont nécessaires après les pronoms. Je prends note de ta réponse et je l'étudie.. Merci.
En ce qui concerne :
print(P [i], rad+ D [i])
J'ai bien essayé mais je me suis un peu emmêlé et j'avais une erreur me disant qu'il n'était pas possible de concaténer des listes et des strings.
- Edité par Julius Eliot 13 février 2020 à 11:25:10
Désolé, je n'arriverai pas à retrouver cette erreur, tant la ligne ci-dessus paraît évidente.
Je vais maintenant essayer de faire une suite en demandant à l'utilisateur de saisir un verbe du premier groupe et en gérant les verbes commençant par une voyelle pour changer le pronom "je" en "j'". A mon niveau, cela ne va pas être facile et demander un certain temps !
Dans ce petit programme de conjugaison un utilisateur peut entrer un verbe du 1er groupe de son choix. L'idéal serait de pouvoir remplacer "je" par "j'" devant un verbe commençant par une voyelle ou un "h". La première boucle parcourt bien la variable "voyelles" et détecte bien l'initiale du verbe à conjuguer. Mais j'échoue pour le remplacement. Les cours que j'ai consultés ne mentionnent pas la possibilité de remplacer une lettre dans une chaîne et je n'ai pas réussi à m'en sortir avec des recherches sur Google. Merci d'avance si quelqu'un peut m'aider.
#!usr/bin/python
# coding utf-8
# Variables
rad = str(input("Entrez un verbe du premier goupe : "))
n = len(rad)
i = 0
P = ["je" , "tu" , "il/elle" , "nous" , "vous" , "ils/elles"]
D = ["e", "es", "e", "ons", "ez", "ent"]
# Sélection des deux dernières lettres en "er"
rad = rad[:-2]
# Boucles pour remplacer "Je" par "J'" si le verbe commence par une voyelle ou h
voyelles = "ieaiouh"
car = rad[0]
for i in range(len(voyelles)):
if voyelles[i] == car:
i += 1
# instruction à trouver :
# Instruction qui ne fonctionne pas :
# P = P.replace("je"," 'j\''")
# Boucle et "print" pour afficher la conjugaison
for i in range(len(P)):
print(P [i], rad + D [i])
i += 1
Les cours que j'ai consultés ne mentionnent pas la possibilité de remplacer une lettre dans une chaîne et je n'ai pas réussi à m'en sortir avec des recherches sur Google.
Les chaînes sont immuables en Python donc tu ne pourras pas remplacer par écrasement direct. Il n'est pas difficile de changer le je en j' , il y a juste de multiples façons de le faire, par exemple
#!usr/bin/python
# coding utf-8
# Variables
rad = "aimer"
n = len(rad)
i = 0
P = ["je" , "tu" , "il/elle" , "nous" , "vous" , "ils/elles"]
D = ["e", "es", "e", "ons", "ez", "ent"]
# Sélection des deux dernières lettres en "er"
rad = rad[:-2]
voyelles = "ieaiouh"
car = rad[0]
if car in voyelles:
P[0]="j'"
# instruction à trouver :
# Instruction qui ne fonctionne pas :
# P = P.replace("je"," 'j\''")
# Boucle et "print" pour afficher la conjugaison
for i in range(len(P)):
print(P [i], rad + D [i])
i += 1
[Au passage, ton i+=1 montre que tu n'as peut-être pas bien compris comment fonctionne une boucle for]
Par ailleurs, tu vas avoir le problème de l'absence d'espace après l'apostrophe. Au total, si tu veux faire un conjugueur, je te conseille d'apprendre un minimum de choses sur les chaînes formatées, c'est vraiment un cas typique d'utilisation.
Merci bien. Je vais étudier cela. Mes intentions sont limitées. Je ne chercherai pas à faire un conjugueur. Simplement à m'exercer avec un maximum d'exercices lors de chaque nouvelle leçon pour m'assurer une progression efficace dans le cours d'Openclassrooms et dans les autres que je suis parallèlement.
J'ai bien sûr beaucoup de choses à apprendre. Les boucles me paraissent fondamentales et je ne les maîtrise pas du tout.
Ce dont je venais de me rendre compte à propos de mon code pour "conjugaison" c'est qu'il fallait que la liste " P" des pronoms ne soit modifiée que temporairement, pour pouvoir revenir au "je" devant consonne quand c'est nécessaire.
A propos de "boucles" il y en a une qui me laisse totalement désarmé pour l'instant c'est celle qui se trouve p. 334 sur "decouverte.pdf" dont l'intitulé est mots = ["POIRE", "SAVON", "LAVER", "LABEL"] à ranger verticalement.
Encore merci.
- Edité par Julius Eliot 14 février 2020 à 18:48:00
Ce dont je venais de me rendre compte à propos de mon code pour "conjugaison" c'est qu'il fallait que la liste " P" des pronoms ne soit modifiée que temporairement, pour pouvoir revenir au "je" devant consonne quand c'est nécessaire.
Et c'est pour cela qu'il ne faut pas hésiter à écrire pour ce genre de problème une 2e liste ["j'", "tu", "il/elle", ...], la duplication n'est pas un problème ici.
Julius Eliot a écrit:
A propos de "boucles" il y en a une qui me laisse totalement désarmé pour l'instant c'est celle qui se trouve p. 334 sur "decouverte.pdf" dont l'intitulé est mots = ["POIRE", "SAVON", "LAVER", "LABEL"] à ranger verticalement.
- Edité par Julius Eliot il y a 5 minutes
Ah, dans mon cours ! Il s'agit juste de savoir parcourir une matrice par colonnes et utiliser des boucles imbriquées :
mots = ["POIRE", "SAVON", "LAVER", "LABEL"]
for m in mots:
print(m)
print()
p=len(mots[0])
for c in range(p):
mot=""
for m in mots:
mot+=m[c]+'|'
print(mot)
POIRE
SAVON
LAVER
LABEL
P|S|L|L|
O|A|A|A|
I|V|V|B|
R|O|E|E|
E|N|R|L|
bonjour ! je veux avoir une idée sur la maniere d ecrire une equation a imprimer :
( exposant ) en python ! j ai tester : print(x/((1/2)*(x**(-1/2)))) mais c faux
merci pour votre aide
A la base, Python fonctionne en mode texte et avec unicode donc si tu veux un affichage mathématiques, il sera très limité et tu devras bricoler (gérer les alignements, les exposants, les indices, les traits de fractions, etc). En plus, à ce que je vois ci-dessus, il te manque des guillemets car tu vas imprimer une chaîne de caractères (à moins comme entwanne l'a suggéré que tu veuilles calculer/évaluer l'expression mathématiques). Faudrait au minimum
print("x/((1/2)*(x**(-1/2)))")
C'est quelque chose de toute façon de très complexe à faire dans toute sa généralité, c'est implémenté dans Sympy, tu peux l'essayer en ligne. Par exemple :
>>> x/((1/2)*(y**(1/2)))
2*x
-----
___
\/ y
Si tu veux afficher des expressions mathématiques, il te faut utiliser Sympy ou Sagemath qui vont te générer le code latex voire faire un rendu graphique clean.
- Edité par PascalOrtiz 15 février 2020 à 10:34:50
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Découverte Python Doc Tkinter Les chaînes de caractères
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
Découverte Python Doc Tkinter Les chaînes de caractères
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Découverte Python Doc Tkinter Les chaînes de caractères
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
Découverte Python Doc Tkinter Les chaînes de caractères