2 votes

Comment les fonctions définies par l'utilisateur fonctionnent-elles vraiment en Python?

Je suis nouveau en python et je jouais avec des exemples de travail du manuel à partir de http://do1.dr-chuck.com/pythonlearn/EN_us/pythonlearn.pdf section.4.9 fonctions définies par l'utilisateur. Je me suis embrouillé en cours de route.

(On m'a dirigé vers ce post Description courte des règles de portée? mais j'ai trouvé que toutes ses réponses étaient trop avancées pour ma question de niveau débutant)

lorsque le code de round0 était:

bruce=input("veuillez entrer ce qui doit être imprimé 2 fois")
def printTwice(bruce):
    print(bruce)
    print(bruce)
printTwice("alpha") 

peu importe l'entrée que j'ai donnée, elle est sortie comme "alpha". D'accord, je comprends, "alpha" est défini comme valeur pour "bruce" ici.

round1:

bruce=input("veuillez entrer ce qui doit être imprimé 2 fois") #pour entrer "bonjour"
not1=123
def printTwice(not1): #définit le paramètre à not1 , not1 est défini comme 123 , mais la sortie est ce qui a été donné en entrée
    print(bruce)
    print(bruce)
printTwice("a") 

la sortie se révèle être ce qui est entré pour bruce. par exemple "bonjour"

Q: Pourquoi ignore-t-il les arguments "a" et "not1" et prend l'entrée "bonjour" pour bruce ?

Round 2: #Puisque j'ai vu que python ne prêtait pas attention à ce que je lui demandais de faire, j'ai enlevé les guillemets pour "a", pour être a

bruce=input("veuillez entrer ce qui doit être imprimé 2 fois")
not1=123
def printTwice(not1): #définit le paramètre à not1 , not1 est défini comme 123 , mais la sortie est ce qui a été entré en entrée
    print(bruce)
    print(bruce)
printTwice(a)  # l'argument n'a plus de " " maintenant

résultat : NameError: name 'a' is not defined. Q: pourquoi s'intéresse-t-il maintenant à ce que j'ai placé entre les parenthèses cette fois mais pas dans round 0 ni round 1 ?

Je comprends que ma question est de niveau débutant ou peut-être dupliquée quelque part, si c'est le cas, veuillez me diriger vers le bon post. Merci !

2voto

SorousH Bakhtiary Points 1447

Il y a quelques faits ici:

  1. Lorsque vous définissez un paramètre pour votre fonction, il devient une "variable locale" à cette fonction.
  2. Les variables locales masquent toujours les variables globales définies dans le module. (sautez pour l'instant le mot-clé global).
  3. Il y a une règle LEGB, à laquelle Python fait attention lorsqu'il essaie de trouver des noms(variables). Ils représentent Local-Enclosing-Global-Builtin. Il recherche les noms dans cet ordre exactement.

Dans round0, vous avez défini bruce en tant que paramètre, il deviendra donc masqué par la variable globale bruce. C'est pourquoi le bruce à l'intérieur de la fonction est exactement le paramètre qui est une variable locale. Vous pouvez penser à créer une variable bruce = 'alpha' à l'intérieur de la fonction. Cela masque la variable bruce dans l'espace de noms global qui a le résultat de input()

Dans round1, vous avez défini not1 en tant que paramètre mais vous n'avez jamais utilisé cette variable. Au lieu de cela, vous avez utilisé la variable bruce qui n'est pas une variable locale car elle n'est pas définie à l'intérieur de la fonction, ou en tant que paramètre. Maintenant Python avance pour voir s'il peut le trouver dans l'espace de noms global...

round2 est une autre histoire... Ne confondez pas les noms que vous mettez en tant que paramètres, et les noms que vous mettez en tant qu'arguments. Si vous mettez un nom comme bruce au paramètre (comme mentionné ci-dessus) vous êtes en train de créer une variable locale. tout comme vous diriez bruce = 10 à l'intérieur de la fonction. Mais ici, lorsque vous passez a à une fonction lors de son appel, vous passez en réalité un objet à cette fonction. a doit exister avant. Vous n'avez pas eu d'erreur dans les cas précédents car vous avez passé un objet (objet chaîne 'a' et 'alpha') à la fonction. Vous n'auriez pas non plus d'erreur si vous aviez quelque chose comme a = 10 avant d'appeler la fonction avec printTwice(a), car maintenant a pointe vers l'objet 10.

Si vous mettez des noms en tant que paramètres, Python crée une variable locale pour vous, Si vous passez quelque chose aux arguments, Python l'évalue d'abord (c'est pourquoi vous devez les avoir avant) et envoie l'objet réel (une référence à celui-ci) au paramètre de la fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X