Est-il possible de déclarer une fonction en Python?
Est-il possible de déclarer une fonction en Python? Je veux trier une liste en utilisant ma propre cmp
fonction avant qu'il ne soit déclaré.
print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])
J'ai organisé mon code pour mettre la définition de cmp_configs
méthode après l'invocation. Il échoue avec ce message d'erreur:
NameError: name 'cmp_configs' is not defined
Est-il un moyen de "déclarer" cmp_configs
méthode avant qu'il est utilisé? Il serait de rendre mon code plus propre?
Je suppose que certaines personnes seront tentés de me dire que je devrais simplement réorganiser mon code pour que je n'ai pas ce problème. Cependant, il ya des cas où c'est probablement inévitable, par exemple lors de la mise en œuvre de certaines formes de la récursivité. Si vous n'aimez pas cet exemple, supposons que j'ai un cas dans lequel il est vraiment nécessaires pour déclarer une fonction.
Voici un cas où l'avant-déclaration d'une fonction serait nécessaire en Python:
def spam():
if end_condition():
return end_result()
else:
return eggs()
def eggs():
if end_condition():
return end_result()
else:
return spam()
Où end_condition
et end_result
ont été définis précédemment.
Est la seule solution pour réorganiser le code et toujours mettre définitions avant d'invocations?
Vous devez vous connecter pour publier un commentaire.
Si vous ne voulez pas définir une fonction avant il est utilisé, et la définition qu'il après est impossible, qu'en la définissant dans un autre module?
Techniquement, vous avez encore le définir en premier, mais c'est propre.
Vous pouvez créer une récursivité comme suit:
Python fonctions sont anonymes, tout comme les valeurs sont anonymes, mais ils peuvent être liées à un nom.
Dans le code ci-dessus,
foo()
ne pas appeler une fonction avec le nom toto, il appelle une fonction qui se trouve être lié au nom defoo
au moment de l'appel. Il est possible de redéfinirfoo
quelque part d'autre, etbar
appelait alors la nouvelle fonction.Votre problème ne peut être résolu, car il est comme demander à obtenir une variable qui n'a pas été déclaré.
main()
?import your_module
main()
) il n'y a pas besoin de s'inquiéter à propos de l'ordre des fonctions sont déclarées comme, à ce point (dernière ligne), tous ont été définisif __name__ == '__main__': main()
(bien que pas sur une seule ligne) et j'ai le même problème que l'OP. Je suis en train d'essayer d'accéder à une fonction dans une catégorie que j'ai définie ci-dessus, la fonction, si; c'est peut-être affecter le comportement.Ce que vous pouvez faire est d'envelopper l'invocation en fonction de sa propre.
De sorte que
va casser, mais
sera de travailler correctement.
Règle générale dans
Python
est pas que la fonction devrait être défini plus haut dans le code (comme dansPascal
), mais qu'elle doit être définie avant son utilisation.Espère que ça aide.
if __name__=="__main__":
solution fonctionne.Si vous lancer votre script par le suivant:
alors vous n'avez probablement pas à vous soucier de choses comme la "déclaration anticipée". Voyez-vous, l'interprète aller le chargement de toutes vos fonctions et de démarrer votre fonction main (). Bien sûr, assurez-vous que vous disposez de toutes les importations correct aussi 😉
Venez pour penser à elle, je n'ai jamais entendu une chose telle que la "déclaration anticipée" en python... mais encore une fois, j'ai peut-être tort 😉
Si l'appel à cmp_configs est à l'intérieur de sa propre définition de la fonction, vous devriez être bien. Je vais vous donner un exemple.
En général, de mettre votre code à l'intérieur de fonctions (telles que le main()) permettra de résoudre votre problème; il suffit d'appeler main() à la fin du fichier.
Je m'excuse pour la relance de ce fil, mais il y a une stratégie qui n'est pas discutée ici, qui peut être applicable.
À l'aide de réflexion, il est possible de faire quelque chose de semblable à l'avant de la déclaration. Par exemple, disons que vous avez une section de code qui ressemble à ceci:
Donc, de cette façon, nous avons déterminé quelle est la fonction que nous voulons appeler avant, il est en fait défini, de manière efficace d'une déclaration anticipée. En python la déclaration
globals()[function_name]()
est le même quefoo()
sifunction_name = 'foo'
pour les raisons évoquées ci-dessus, depuis le python doivent de recherche de chaque fonction avant de l'appeler. Si l'on devait utiliser letimeit
module de voir comment ces deux états comparer, ils ont exactement le même coût de calcul.Bien sûr, l'exemple ici est très inutile, mais si on veut disposer d'une structure complexe qui nécessaire à l'exécution d'une fonction, mais doit être déclarée avant (ou structurellement, il fait peu de sens par la suite), on peut enregistrer une chaîne et d'essayer d'appeler la fonction plus tard.
Non, je ne crois pas qu'il existe un moyen de transmettre la déclaration d'une fonction en Python.
Imaginez que vous êtes l'interpréteur Python. Lorsque vous arrivez à la ligne
soit vous savez ce qu'cmp_configs est ou on ne l'est pas. Afin de procéder, vous devez
savoir cmp_configs. Il n'a pas d'importance si il y a récursivité.
Il n'y a pas une telle chose en python comme la déclaration anticipée. Vous avez juste à vous assurer que votre fonction est déclarée avant est nécessaire.
Notez que le corps d'une fonction n'est pas interprété jusqu'à ce que la fonction est exécutée.
Considérons l'exemple suivant:
Vous pouvez penser qu'un corps d'une fonction est un autre script qui sera interprété une fois que vous appelez la fonction.
Parfois un algorithme est plus facile à comprendre de haut en bas, en commençant par l'ensemble de la structure et de forage vers le bas dans les détails.
Vous pouvez le faire sans déclaration:
Vous ne pouvez pas transmettre la déclaration d'une fonction en Python. Si vous disposez d'une logique d'exécution avant d'avoir défini les fonctions, vous avez probablement un problème de toute façon. Mettez votre action dans un
if __name__ == '__main__'
à la fin de votre script (par l'exécution d'une fonction, vous nom "principale" si c'est non-trivial) et de votre code plus modulaire et vous serez capable de l'utiliser comme un module, si jamais vous avez besoin de.Aussi, remplacez-la compréhension de liste avec un générateur express (c'est à dire,
print "\n".join(str(bla) for bla in sorted(mylist, cmp=cmp_configs))
)Aussi, ne pas utiliser
cmp
, qui est obsolète. Utilisationkey
et de fournir un moins-que la fonction.Importer le fichier lui-même. En supposant que le fichier est appelé test.py:
De sortie:
"juste réorganiser mon code pour que je n'ai pas ce problème." Correct. Facile à faire. Fonctionne toujours.
Vous pouvez toujours fournir la fonction au préalable de référence.
"Cependant, il y a des cas où cela est probablement inévitable, par exemple lors de la mise en œuvre de certaines formes de la récursivité"
Ne vois pas comment c'est même à distance possible. Veuillez fournir un exemple d'un endroit où vous ne pouvez pas définir la fonction avant de l'utiliser.
Maintenant, attendez une minute. Lorsque votre module atteint l'impression instruction dans votre exemple, avant de
cmp_configs
a été défini, ce qui est exactement ce que vous attendez d'elle?Si votre publication d'une question à l'aide de l'impression est vraiment essayer de représenter quelque chose comme ceci:
alors il n'est pas nécessaire de définir
cmp_configs
avant l'exécution de cette instruction, il suffit de définir plus tard dans le code et tout ira bien.Maintenant, si vous essayez de référence
cmp_configs
comme valeur par défaut d'un argument pour le lambda, alors c'est une autre histoire:Maintenant, vous avez besoin d'un
cmp_configs
variable définie avant d'arriver à cette ligne.[EDIT - la partie qui s'avère ne pas être correcte, parce que l'argument par défaut la valeur assignée lorsque la fonction est compilé, et cette valeur sera utilisé même si vous modifiez la valeur de cmp_configs plus tard.]
Heureusement, Python étant de type accueillir comme il est, ne se soucie pas ce que vous définissez comme
cmp_configs
, de sorte que vous pouvez simplement préface à la présente déclaration:Et le compilateur va être heureux. Juste être sûr de déclarer le véritable
cmp_configs
avant de vous jamais invoquerfn
.Une façon est de créer une fonction de gestionnaire. Définir le gestionnaire d'tôt, et de mettre le gestionnaire ci-dessous toutes les méthodes que vous devez appeler.
Ensuite, lorsque vous appelez la méthode de gestionnaire d'appeler vos fonctions, ils seront toujours disponibles.
Le gestionnaire peut prendre un argument
nameOfMethodToCall
. Utilise ensuite un tas de si les déclarations d'appeler la bonne méthode.Cela devrait résoudre votre problème.
Oui, on peut vérifier cela.
D'entrée
De sortie
Comme BJ Homer mentionné plus de commentaires ci-dessus, Une règle générale en Python n'est pas que la fonction devrait être défini plus haut dans le code (comme en Pascal), mais qu'elle doit être définie avant son utilisation.
Espère que ça aide.
print_lyrics()
appelé (utilisé), ligne 1, avant qu'elle soit définie? J'ai copié ce bout de code et essayé de l'exécuter, et il me donne l'erreurNameError: name 'print_lyrics' is not defined
sur la Ligne 1. Pouvez-vous expliquer cela?