37 votes

Module Mathematica versus With or Block - Ligne directrice, règle générale d'utilisation?

Leonid a écrit dans le chapitre iv de son livre : "... Module de Bloc et Avec. Ces constructions sont expliquées en détail dans Mathematica Livre et Mathematica Aider, alors je vais juste dire quelques mots à propos d'eux ici. ..."

De ce que j'ai lu ( pu trouver ), je suis toujours dans le noir. Pour les fonctions que j' ( tout simplement ) Module sur l'emploi, parce qu'il fonctionne et je sais que le construire. Il peut ne pas être le meilleur choix si. Il n'est pas tout à fait clair pour moi ( à partir de la documentation ) quand, ni où, ni pourquoi pour utilisation Avec ( ou Bloc ).

Question. Est-il une règle du pouce ou des lignes directrices sur l'utilisation du Module, Avec ou Bloquer ( pour les fonctions dans les paquets )? Il y a des restrictions par rapport au Module? Les docs disent que Avec est plus rapide. Je veux être en mesure de défendre ma =choix= pour le Module ( ou une autre construction ).

30voto

Andrew Moylan Points 2365

Comme vous l'avez mentionné il y a beaucoup de choses à considérer et une discussion détaillée possible. Mais voici quelques règles de base que j'applique la majorité du temps:

Module[{x}, ...] est le plus sûr et peut être nécessaire si

  1. Il y a des définitions existantes pour x que vous voulez éviter de se casser lors de l'évaluation du Module, ou

  2. Il y a un code existant qui s'appuie sur x étant pas défini (par exemple code comme celui - Integrate[..., x]).

Le Module est également le seul choix pour la création et le retour d'un nouveau symbole. En particulier, le Module est parfois nécessaire dans les avancées de la programmation Dynamique pour cette raison.

Si vous êtes confiant, il n'y a pas d'importantes définitions existantes pour x ou tout autre code en s'appuyant sur elle étant pas défini, alors Block[{x}, ...] est souvent plus rapide. (Notez que, dans un projet entièrement codé en vous, être confiant de ces conditions est raisonnable "encapsulation" standard que vous pouvez appliquer de toute façon, et ainsi de Bloc est souvent un bon choix dans ces situations).

With[{x = ...}, expr] est la seule construction de portée qui consiste à injecter de la valeur de x à l'intérieur d' Hold[...]. C'est utile et important. With peut être plus rapide ou plus lent que le Bloc fonction expr et à l'évaluation concernée chemin qui est pris. With est moins souple, cependant, puisque vous ne pouvez pas modifier la définition de x à l'intérieur de expr.

30voto

acl Points 5479

Plus pratique, la différence entre Block et Module peut être vu ici:

Module[{x}, x]
Block[{x}, x]
(*
-> x$1979
   x
*)

Donc, si vous souhaitez renvoyer par exemple x, vous pouvez utiliser Block. Par exemple,

Plot[D[Sin[x], x], {x, 0, 10}]

ne fonctionne pas; pour le faire fonctionner, on pourrait utiliser

Plot[Block[{x}, D[Sin[x], x]], {x, 0, 10}]

(bien sûr, ce n'est pas l'idéal, c'est simplement un exemple).

Une autre utilisation est quelque chose comme Block[{$RecursionLimit = 1000},...], ce qui change temporairement $RecursionLimit (Module n'aurait pas travaillé comme il renomme $RecursionLimit).

On peut aussi utiliser d' Block pour bloquer l'évaluation de quelque chose, par exemple

Block[{Sin}, Sin[.5]] // Trace
(*
-> {Block[{Sin},Sin[0.5]],Sin[0.5],0.479426}
*)

c'est à dire, il retourne Sin[0.5] qui est seulement évaluée après l' Block a fini de s'exécuter. C'est parce qu' Sin à l'intérieur de l' Block est juste un symbole, plutôt que la fonction sinus. Vous pourriez même faire quelque chose comme

Block[{Sin = Cos[#/4] &}, Sin[Pi]]
(*
-> 1/Sqrt[2]
*)

(utiliser Trace pour voir comment il fonctionne). Ainsi, vous pouvez utiliser Block localement redéfinir les fonctions intégrées, trop:

Block[{Plus = Times}, 3 + 2]
(*
-> 6
*)

11voto

Meng Lu Points 1031

Je voudrais mentionner la documentation officielle sur la différence entre Block et Module est disponible sur http://reference.wolfram.com/mathematica/tutorial/BlocksComparedWithModules.html .

10voto

Verbeia Points 3680

Andrew a déjà fourni une réponse complète. Je voudrais juste résumer en notant que, Module est pour la définition locale des variables qui peuvent être redéfinis dans le cadre de la définition d'une fonction, alors qu' With est pour la définition locale des constantes, qui ne peut pas être. Vous aussi vous ne pouvez pas définir une constante locale basée sur la définition d'un autre local constant que vous avez défini dans le même With déclaration, ou plusieurs symboles LHS d'une définition. Qui est, le code suivant ne fonctionne pas.

With[{{a,b}= OptionValue /@ {opt1,opt2} }, ...]

J'ai tendance à établir compliqué fonction des définitions Module joignant With. J'ai mis en place tous les constantes locales, je peux d'abord à l'intérieur de l' With, par exemple, l' Length des données transmises à la fonction, si j'en ai besoin, puis d'autres variables locales en tant que de besoin. La raison en est qu' With est un peu plus rapide de vous avez réellement n'avez pas constantes variables.

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