IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Fonction avec paramètres nommés ou non


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Avril 2020
    Messages : 20
    Par défaut Fonction avec paramètres nommés ou non
    Bonjour,

    je suis débutant et il y a un point que je n'arrive pas à comprendre.

    Dans un cours on expose le fait que dans une définition de fonction on doit mettre une liste de variable après les paramètres standards et pas avant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     def fonction (nom, prenon, *commentaires):
    Par contre dans une résolution d'exercice, le cours propose cette solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def afficher (*parametres, sep=' ', fin'\n'):
    Il y a quelque chose qui m'échappe, je vois pas la différence.

    Merci d'avance pour votre support,

    Cordialement

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 301
    Par défaut
    bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def afficher(*commentaires, nom, prenom ):
        print(commentaires, nom, prenom)
    ceci est valide, simplement ici, il faut impérativement passer les paramètres après la liste variable (*commentaires) par nom
    ps: existe depuis python 3.8 une nouvelle syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    afficher(1,2,3,4,5, 'durant', 'pierre') NON valide
    afficher(1,2,3,4,5, nom='durant', pierre='pierre') Valide
    puisque tu passe des valeurs par défaut, ta résolution d'exercice est exactement la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def afficher(*commentaires, nom="durand", prenom="paul" ):
        print(commentaires, nom, prenom")
     
    afficher(1,2,3,4,5) Valide

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 813
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Sonata Arctica Voir le message
    Dans un cours on expose le fait que dans une définition de fonction on doit mettre une liste de variable après les paramètres standards et pas avant
    C'est fini depuis Python3. Avant, dans Python2, effectivement la liste de variables (le "étoile truc" qu'on nomme généralement "*arg") était placé obligatoirement en dernier (ou en avant dernier si le paramètre avec double étoile était présent => **kwargs)
    Maintenant il peut être présent n'importe où dans les paramètres (n'importe où mais quand-même avant kwargs qui, s'il est présent, doit obligatoirement être placé en dernier).

    Ce qui se passe avec une fonction définie de cette manière def toto(nom, prenom, *args, age, ville): les deux premiers sont positionnels (ils sont récupérés en fonction de leur position dans l'appel). Tu ne peux pas appeler la fonction en donnant leur nom parce que Python ne saura pas ensuite gérer le reste.
    Ensuite après ces deux paramètres, tu es libre d'en placer d'autres à ton choix (mais toujours sans leur donner de nom). Ils seront stockés dans le tuple "args"
    Et enfin les dernier tu es obligé de les nommer explicitement (si tu ne les nommes pas ils vont eux-aussi dans args).
    Ce qui donne l'appel suivant: toto("Hugo", "Victor", "pim", "pam", "poum", age=80, ville="Paris").
    Et si les paramètres ont des valeurs par défaut (comme dans ton cas) alors tu n'es pas obligé de les spécifier lors de l'appel.

    Et si tu rajoutes "**kwargs" dans la fonction (obligatoirement en dernier), tu peux alors rajouter d'autres trucs mais en leur donnant un nom précis => ils seront stockés dans le dictionnaire "kwargs"
    => toto("Hugo", "Victor", "pim", "pam", "poum", age=80, ville="Paris", adresse="Quelque part", enfant=12).

    Citation Envoyé par Sonata Arctica Voir le message
    Il y a quelque chose qui m'échappe, je vois pas la différence.
    La différence se situe lors de l'appel. Pour la première tu ne peux l'appeler que de cette façon: fonction("le_nom", "le_prenom", "xxx", "yyy", "zzz", 1, 2, 3, ...).
    Et pour la seconde tu ne peux l'appeler que de cette façon: afficher("xxx", "yyy", "zzz", 1, 2, 3, ..., sep=":", fin="\r\n") (avec toutefois le droit de ne pas spécifier le paramètre "sep" et/ou "fin" puisqu'ils ont une valeur par défaut)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut !

    Je pense qu'il s'agit d'une convention pour faciliter la programmation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> def test(*com,text):
    	print(com)
    	print(text)
     
    >>> test("toto","tata","tutu")
    Traceback (most recent call last):
      File "<pyshell#9>", line 1, in <module>
        test("toto","tata","tutu")
    TypeError: test() missing 1 required keyword-only argument: 'text'
     
    >>> test("toto","tata",text="tutu")
    ('toto', 'tata')
    tutu
    Alors que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> def test(text, *com):
    	print(com)
    	print(text)
     
    >>> test("toto","tata","tutu")
    ('tata', 'tutu')
    toto
    Mais pas sûr ! J'attends de voir la réponse des pros également... Bon ben trop lent ! Merci @Sve@r pour ces explications.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 688
    Par défaut
    Citation Envoyé par Sonata Arctica Voir le message
    Il y a quelque chose qui m'échappe, je vois pas la différence.

    Avec fonction (nom, prenom, *commentaires), on dit que la fonction attend 2 ou plus arguments positionnels.

    Avec afficher (*parametres, sep=' ', fin='\n'), la fonction attend un nombre indéfini d'arguments positionnels suivi des paramètres nommés sep et fin qui s'il ne sont pas précisés récupéreront les valeurs par défaut précisés.

    Pour les détails, lire le tutoriel Python qui aborde cela ainsi que d'autres "astuces" côté déclaration des paramètres.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2020
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Contrôleur de gestion

    Informations forums :
    Inscription : Avril 2020
    Messages : 20
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Avec fonction (nom, prenom, *commentaires), on dit que la fonction attend 2 ou plus arguments positionnels.

    Avec afficher (*parametres, sep=' ', fin='\n'), la fonction attend un nombre indéfini d'arguments positionnels suivi des paramètres nommés sep et fin qui s'il ne sont pas précisés récupéreront les valeurs par défaut précisés.

    Pour les détails, lire le tutoriel Python qui aborde cela ainsi que d'autres "astuces" côté déclaration des paramètres.

    - W
    Merci, j'ai compris avec cette réponse! Cela m'as permis aussi de comprendre celles ci-dessus

    Merci à tous pour votre support

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Appel fonction avec paramètre depuis document.write
    Par kev42100 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/05/2008, 14h12
  2. Fonction avec paramètre optionnel
    Par Damien2007 dans le forum ASP
    Réponses: 1
    Dernier message: 27/06/2007, 15h49
  3. Fonction avec paramètre illimité
    Par Kiboumz dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2006, 17h58
  4. [Function]Appel de fonction avec paramètre
    Par julienOriano dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/06/2006, 07h48
  5. Réponses: 4
    Dernier message: 11/09/2005, 01h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo