Comment puis-fonctions imbriquées travail en Python?
def maker(n):
def action(x):
return x ** n
return action
f = maker(2)
print(f)
print(f(3))
print(f(4))
g = maker(3)
print(g(3))
print(f(3)) # still remembers 2
Pourquoi la fonction imbriquée souviens de la première valeur 2
même si maker()
est retourné et est ressortie par le temps action()
est appelé?
- Vous toujours de répondre à chacun (au moins la mienne) question avec ce ton. VOUS avez 66k rep, et vous semblez être un grand programmeur, ce qui est bon pour vous:), mais je viens juste de commencer et je me demander ce que je ne comprends pas, et besoin de plus d'explication, c'est ce qui est DONC pour je crois.
- C'est vraiment pas évident pourquoi/comment cela devrait fonctionner. C'est juste qu'un nouveau programmeur doit être confondu lorsqu'une fonction a retourné son champ d'application existe toujours. Surtout s'ils viennent d'un langage comme C++ où tout dans le champ d'application est détruite lorsqu'une fonction retourne une valeur.
- C'est un peu similaire à une question posée à seulement 6 heures: stackoverflow.com/questions/2004398/nested-scopes-and-lambdas
- "Pourquoi" questions n'ont pas vraiment de réponses utiles. Le problème est qu'il est défini de cette façon; il n'y a rien de plus utile à dire. Vous pouvez ainsi comme "pourquoi la vitesse de la lumière constante?" ou "pourquoi la gravité est une attraction mutuelle?" Il est. Vous pourriez vous demander à propos des conséquences. Ou vous pourriez vous demander pourquoi une problème de programmation ne fonctionne pas. Demander "pourquoi" de la valeur de la fonction de liaison se produit à définir le temps n'est pas utile. Il est défini de cette façon.
- Mon point est de savoir ce réel problème que vous rencontrez. Remarquez que j'ai refuser downvoting jusqu'à ce que après ce que je demande. À moins que la question est en fait mauvais. Des questions inutiles peut être améliorée en modifiant le foyer de la "pourquoi" au "comment puis-je faire usage de cela?" ou "comment puis-je résoudre ce problème, je vais avoir?" De mauvaises questions ne peut pas être amélioré.
- DONC, ce n'est pas seulement à propos de la résolution de problèmes, c'est à propos de l'acquisition de la connaissance. Si Nimbuz découvre la raison pour laquelle Python œuvres de ce genre, il a acquis une meilleure compréhension. Il va également de savoir ce qui le rend différent des autres langues, et pourquoi. Comme les autres lire la question et la réponse. Je pense que cette question est loin d'être inutile.
- Le "pourquoi" est trivial, cependant. C'est juste définis de cette façon. Les connaissances déjà acquises avant de poser la question. @Nimbuz observé, appris tout ce qu'il ya à savoir sur le sujet. Ce qui peut être appris de demander pourquoi? L'exemple montre -- remarquablement claire, la leçon qui a déjà été appris.
- Assurément, il est évident que l'affiche originale voulez savoir pourquoi il est utile de comportement? Généralement, quand un langage de programmation n'quelque chose qui semble déroutant pour un débutant, c'est pour faciliter quelque chose de puissant pour un expert, et il veut sans doute de savoir précisément ce que c'est, pour approfondir sa compréhension. Je ne serais pas d'accord que Nimbuz "appris tout ce qu'il ya à savoir sur le sujet" - il semble savez pas où ceux liés valeurs sont à venir à partir, ce qui est compréhensible étant donné que les arguments de la fonction, dans 99% des cas ne sont que de passage.
- ^ exactement! Je comprends que certains experts ici obtenir ennuyé par la même des questions de newbie, mais personne n'aime perdre son (ou leur) temps vraiment. Pourquoi aurais-je poser une question, si je connaissais déjà la réponse? J'ai vu le résultat, mais je voulais savoir le fonctionnement derrière elle afin que je puisse mieux comprendre le concept. Bien sûr, si cela semble trop stupide pour vous, ce qui est tout à fait possible, il suffit de déplacer sur, pourquoi critiquer et de décourager les débutants à partir de poser des questions qui peuvent aider les autres aussi ? 🙂
- Le fonctionnement "derrière" est complètement différent de "pourquoi" est défini de cette façon. "Pourquoi" est à peine même académique. C'est à peine même histoire intéressante. La manière dont il fonctionne, la façon dont vous l'utilisez, est intéressant. Se poser la question.
- Ok, j'ai donc posé la question de façon incorrecte? Tout à fait possible, mais alors, je vais devoir apprendre l'anglais d'abord parce que ce n'est pas ma langue maternelle. Espérons que vous vous rendez compte que c'est une communauté internationale et NOUS n'est pas le seul pays dans le monde, et l'anglais n'est pas la seule langue. 🙂 Mais je me demande comment les autres compris ma question correctement bien, sauf vous.
- Peut-être parce que l'anglais n'est pas ma première langue. "Pourquoi" des questions sont toujours stupide dans la totalement artificiel monde des ordinateurs. Essayez de poser des questions qui ont une action comme le résultat: des questions où la réponse est quelque chose que vous allez faire. "Pourquoi?" ne mènent pas à vous faire quoi que ce soit. Ils n'ont même pas conduire à vous de savoir quoi que ce soit-que vous saviez déjà, et on a déjà dit clairement ce qu'elle savait. Ayez confiance en vous-même. Vous saviez tout ce qu'il y avait à savoir à propos de cette ridicule situation dans les paramètres de la fonction de liaison.
- Le plus voté réponses ne réponds pas "pourquoi". Les réponses fournissent un complément d'information dans ce que vous avez découvert. Ils ne fournissent pas un mot d'explication quant à la pourquoi python n'a cette.
- Vrai. J'ai juste essayé de répondre en fournissant des informations de fond à la "Question". Je ne peux pas répondre pourquoi la fonction imbriquée se souvient de la valeur. J'aurais dû puiser dans les pythons code source .. Mais même si quelqu'un avait montré les lignes correspondantes dans le python de la mise en œuvre, j'ai tendance à penser qu'il n'aurait pas été plus instructif dans ce cas. (Ces commentaires m'ont rappelé, ce qu'est un marsian mathematican a dit une fois: En mathématiques, on ne comprends pas les choses. Vous venez de faire.)
- Ok, j'abandonne à vous convaincre. Je vais revenir à l'apprentissage de Python. ;P
- demander pour plus d'explication est la bonne. Faire plus de cela. Demander "pourquoi" est une très, très difficile pour la plupart d'entre nous de répondre. Faire moins de cela. Vous n'avez pas à "convaincre" de rien. Je comprends que vous voulez plus d'explications -- que j'ai 66K réputation. Je suggère que vous l'obtiendrez plus de réponses utiles lorsque vous posez des questions plus précises.
- double possible de Fonction Imbriquée dans Python
- S. Lott est essentiellement de s'opposer à la sémantique de l'utilisation du mot "pourquoi", alors que, souvent, une époque où "pourquoi" est posée à l'intérieur d'une portée limitée (par exemple, cette question de programmation), c'est juste une autre façon de demander "comment ce code étapes à travers. Fondamentalement, S. Lott a vraiment une définition étroite de "pourquoi", quand le "pourquoi" est parfaitement correct à utiliser, car il peut aussi signifier "comment cela fonctionne"? Pas sûr de savoir comment vous pouvez être qui ignore que d'autres nuances du mot "pourquoi" dans la vie réelle d'utilisation.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez voir que toutes les variables originaires de la fonction parent, être remplacés par leur valeur réelle à l'intérieur de la fonction d'enfant. De cette façon, il n'est pas nécessaire de garder une trace de la portée de la mère à l'enfant en fonction de l'exécuter correctement.
Le voir comme "la création dynamique d'une fonction".
Ce comportement de base en python, il en fait de même avec de multiples affectations.
Python lit ce que
Essentiellement, il insère les valeurs avant de faire quelque chose avec eux.
Vous êtes essentiellement la création d'un fermeture.
Liées à la lecture: Fermetures: pourquoi sont-ils si utiles?
De http://docs.python.org/reference/compound_stmts.html:
Vous êtes à la définition des DEUX fonctions. Lorsque vous appelez
vous êtes à la définition d'une fonction qui retourne deux fois le nombre, de sorte
Ensuite, vous pouvez définir une AUTRE FONCTION DIFFÉRENTE
que le retour de trois fois le nombre
Mais ils sont DEUX fonctions différentes, ce n'est pas la même fonction référencée, chacun c'est un indépendant. Même dans le champ d'application à l'intérieur de la fonction "maker" sont appelés les mêmes, n'est pas pas la même fonction, chaque fois que vous appelez
maker()
vous êtes à la définition d'une fonction différente. C'est comme une variable locale, chaque fois que vous appelez la fonction prend le même nom, mais peut contenir des valeurs différentes.Dans ce cas, la variable "action" contient une fonction (qui peut être différent)
Qu'est ce qu'on appelle "fermeture". Il suffit de mettre, pour la plupart, si pas tous les langages de programmation qui traitent des fonctions comme de première classe de l'objet, toutes les variables qui sont utilisées au sein d'un objet de fonction sont fermés (c'est à dire de rappeler) tant que la fonction est encore en vie. C'est un concept puissant si vous savez comment l'utiliser.
Dans votre exemple, le imbriquée
action
fonction utilise la variablen
de sorte qu'il forme une clôture autour de cette variable et se souvient pour plus tard, les appels de fonction.Regardons trois raisons communes pour l'écriture de fonctions intérieures.
1. Les fermetures d'Usine et les Fonctions
La valeur dans le cadre englobant est rappelé, même lorsque la variable est hors de portée ou de la fonction elle-même est supprimé de l'espace de noms courant.
Maintenant, nous allons essayer d'appeler cette fonction.
Qui est inhabituel. Le
print_msg()
fonction a été appelée par la chaîne"Hello"
et le retour de la fonction est liée au nom deanother
. Sur l'appel deanother()
, le message était encore dans les mémoires même si nous avions déjà fini de l'exécution de laprint_msg()
fonction. Cette technique par lequel certaines données ("Hello"
) se joint à l'appel du code de fermeture en Python.Quand Utiliser Les Bouchons?
Quels sont donc les fermetures de bon? Les fermetures peuvent éviter l'utilisation de valeurs et fournit une certaine forme de données de la clandestinité. Il peut également fournir un objet orienté solution au problème. Quand il y a peu de méthodes (une méthode dans la plupart des cas) pour être mis en œuvre dans une classe, les fermetures peuvent donner lieu à une autre et de plus en plus des solutions élégantes. Référence
2. Encapsulation :
Concept général de l'encapsulation est de cacher et de protéger le monde intérieur de l'Extérieur, Voici les fonctions internes peuvent être accessibles uniquement à l'intérieur de l'extérieur et sont protégées contre tout ce qui se passe à l'extérieur de la fonction.
3. Keepin’ it SEC
Peut-être vous avez un géant de la fonction qui effectue le même bloc de code dans de nombreux endroits. Par exemple, vous pourriez écrire une fonction qui traite un fichier, et que vous voulez accepter un objet de fichier ou un nom de fichier:
De plus, vous pouvez consulter cette blog.
Car au moment où vous créez la fonction,
n
était2
, de sorte que votre fonction est:Lorsque vous appelez f(3),
x
est fixé à3
, de sorte que votre fonction sera de retour3 ** 2
Personnes ont répondu correctement au sujet de la fermeture, c'est: la validité de la valeur de "n" à l'intérieur de l'action est la dernière valeur qu'il avait à chaque fois que le "créateur" a été appelé.
Une facilité façon de surmonter ce problème est de faire de votre freevar (n) d'une variable à l'intérieur de l ' "action", une fonction qui reçoit une copie de "n" dans le moment où il est exécuté:
La façon la plus simple de le faire est de définir "n" comme un paramètre dont la valeur par défaut est "n" au moment de la création. Cette valeur de "n" reste fixe, car par défaut les paramètres d'une fonction sont stockés dans un tuple qui est un attribut de la fonction elle-même (l'action.func_defaults dans ce cas):
Utilisation:
Une utilisation est de retour d'une fonction qui maintient un paramètre.
Lorsque vous créez une fonction avec le mot-clé def, vous êtes en train de faire exactement cela: vous êtes à la création d'une nouvelle fonction de l'objet et de l'affecter à une variable. Dans le code que vous avez donné vous assigner cette nouvelle fonction de l'objet à une variable locale appelée action.
Lorsque vous appelez ça une deuxième fois, vous êtes la création d'une deuxième fonction de l'objet. Donc f points à la première fonction de l'objet (carré de la valeur) et g les points de la deuxième fonction de l'objet (cube-la-valeur). Quand Python voit "f(3)" cela signifie "exécuter la fonction d'objet pointu pour être la variable f et passer la valeur 3". f et g et les différents objets de fonction et donc le retour des valeurs différentes.
def
. Voulez-vous dire qu'il n'existe aucun moyen d'un appel d'une fonction, car à chaque fois que vous consultez une définition, vous êtes à la création d'un second objet?