CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] Fonctions

Vakus
Vakus
Niveau 9
06 octobre 2015 à 20:40:15

Bonjour, je débute sur Python et j'ai une série d'exercices à faire sur les fonctions. Malheureusement, il y en a un sur lequel je bloque :

Écrivez une fonction longueur(*points) qui prend en paramètres un nombre arbitraire de points de coordonnées (x,y) et calcule la longueur du trait correspondant. Pour calculer la longueur, il faut effectuer la somme de la longueur des segments qui composent le trait. Un segment de droite est composé de deux points consécutifs passés en paramètre.

Je peux calculer la distance entre 2 points comme suit :
def distance(x, y):
from math import sqrt
distance = math.sqrt((x2-x1)**2 + (y2-y1)**2)
return distance

Mais je ne comprends pas comment faire pour prendre en paramètres un nombre arbitraire de points ... Merci de votre aide :)

Impair
Impair
Niveau 10
06 octobre 2015 à 21:46:00

En fait, c'est indiqué dans ton énoncé, si tu fais def longueur(*points), le * devant le nom de l'argument indique que la fonction attend un nombre arbitraire de paramètres. :ok:

Tu peux regarder la documentation officielle ici : https://docs.python.org/3.5/tutorial/controlflow.html#arbitrary-argument-lists
Un peu de lecture ici : http://stackoverflow.com/a/3394898/2291710
Et là : http://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

*points est un itérable, donc tu pourras faire for point in points:. :ok:

Et ta fonction pourra s'utiliser longueur((1, 4), (3, 4)) ou encore longueur((7,3), (3,0), (0, 2), (2, 9)), ça ne posera pas de problème, tous les points se retrouveront dans la variables points.

Message édité le 06 octobre 2015 à 21:47:50 par Impair
Triple14
Triple14
Niveau 10
07 octobre 2015 à 12:44:20

À noter que tu peux aussi accepter une liste en argument:


from math import hypot
def distance(points):
    d = 0
    for i in range(1,len(points)):
        x1,y1 = points[i-1]
        x2,y2 = points[i]
        d += hypot(x2-x1,y2-y1)
    return d

#et l'appel:
print(distance([(2,3), (6,2), (5,-3), (1200,45)])
Vakus
Vakus
Niveau 9
07 octobre 2015 à 17:27:39

Merci à vous deux pour votre réponse rapide, j'ai bien noté vos informations :)
Cependant, j'ai été de réécrire une fonction à ma façon et il semble qu'elle ne fonctionne pas, donc je me demandais ce qui ne va pas dans ce qui suit :

import math

def distance_points(a, b):
distance = math.sqrt((b[0] - a[0])**2 + (b[1] - a[1])**2)
return distance

def longueur(*points):

distanceTotale = 0
cote = 0

for i in range(len(points)-1):

cote = distance_points(points(i), points(i+1))
distanceTotale = distanceTotale + cote

return distanceTotale

Encore merci!

Grimmys
Grimmys
Niveau 19
07 octobre 2015 à 20:02:02

Tu as bien penser à l'indentation correcte de ton code ?

Donne nous l'exception qui a été levée stp, c'est toujours utile pour cerner le problème...

Vakus
Vakus
Niveau 9
08 octobre 2015 à 00:11:57

En fait, mon prof a créé un petit programme qui permet de faire des exercices demandés et l'ordinateur vérifie si les commandes demandées sont bonnes.
J'ai checké l'indentation, pas de soucis de ce côté là.
J'ai remplacé par ce que Citroen m'a dit et maintenant, le résultat s'affiche alors qu'avant Python me renvoyait :"'tuple' object is not callable"
Simplement, Python ne prend en compte que les deux premiers points de la série, donc longueur([2,5],[3,8]) et longueur([2,5],[3,8],[4,9]) donnent le même résultat.

Je vois toujours pas clair dans cette affaire ... Merci encore pour vos réponses :)

Impair
Impair
Niveau 10
08 octobre 2015 à 10:04:36

Je pense que CitroenDSKatre a raison, car ton code correctement indenté retourne le bon résultat : https://ideone.com/sJs41w :ok:

Vakus
Vakus
Niveau 9
08 octobre 2015 à 19:26:57

Oh merde j'ai honte, j'avais en effet mis le return dans la boucle for, je sais pas pourquoi ça me paraissait logique... Débutant oblige.
Merci pour votre aide précieuse et rapide, ça m'a débloqué pour une bonne partie des exercices! :)

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment