Je me demande où je trouve la source pour montrer comment l'opérateur ** est implémenté en Python. Quelqu'un peut me diriger dans la bonne direction?Comment est ** implémenté en Python?
Répondre
La définition de la grammaire de python (à partir de laquelle l'analyseur est généré en utilisant pgen), rechercher les 'puissance': Gramar/Gramar
Le ast python, rechercher les 'ast_for_power': Python/ast.c
La boucle de eval python, chercher 'BINARY_POWER': Python/ceval.c
qui appelle PyNumber_Power (mis en œuvre Objects/abstract.c):
PyObject *
PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
{
return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
}
Essentiellement, appelez le logement pow. Pour les longs objets (le seul type entier par défaut dans la version 3.0), cela est mis en œuvre dans la fonction long_pow Objects/longobject.c, pour les objets int (dans les branches 2.x), il est mis en œuvre dans la fonction int_pow Object/intobject.c
Si vous creusez dans long_pow, vous pouvez voir que, après vetting les arguments et faire un peu de mettre en place, au cœur de l'exponentiation peut être voir ici:
if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
/* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
/* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */
for (i = Py_SIZE(b) - 1; i >= 0; --i) {
digit bi = b->ob_digit[i];
for (j = 1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
MULT(z, z, z)
if (bi & j)
MULT(z, a, z)
}
}
}
else {
/* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
Py_INCREF(z); /* still holds 1L */
table[0] = z;
for (i = 1; i < 32; ++i)
MULT(table[i-1], a, table[i])
for (i = Py_SIZE(b) - 1; i >= 0; --i) {
const digit bi = b->ob_digit[i];
for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
const int index = (bi >> j) & 0x1f;
for (k = 0; k < 5; ++k)
MULT(z, z, z)
if (index)
MULT(z, table[index], z)
}
}
}
qui utilise des algorithmes décrits dans Chapter 14.6 du Handbook of Applied Cryptography qui décrit des algorithmes d'exponentiation efficaces pour une précision arbitraire arithmétique.
Il est le pouvoir de l'opérateur
python.org doc - Power operator
Edit: Oh, dang, le code, à droite. J'espère que le lien aide encore. Sloppy read from my part
Il existe deux implémentations différentes, l'une pour les objets int (long dans 3.0) et l'autre pour les objets flottants. Le flottant pow est la fonction float_pow (PyObject * v, PyObject * w, PyObject * z) définie dans le fichier Objects/floatobject.c du code source Python. Cette fonction appelle pow() de C de math.h de stdlib
L'int Pow a sa propre implémentation, est la fonction int_pow (PyIntObject * v, w * PyIntObject, PyIntObject * z) défini dans les objets/intobject.c (longobject .c pour 3.0) du code source Python.
Je pense que les casse-raisins posent des questions sur les astérisques lors de la définition des fonctions.
Vous pouvez trouver réponse à cette page doc Python: http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions
Lorsqu'un paramètre formel final de la forme ** nom est présent, il reçoit un dictionnaire contenant tous les arguments clés à l'exception de ceux correspondant à un paramètre formel.
J'ai semé la description de ce truc ailleurs dans python doc mais je ne m'en souviens pas.
- 1. Comment string.find est-il implémenté dans CPython?
- 2. Comment OpenID est-il implémenté?
- 3. Comment "View Count" est le mieux implémenté?
- 4. Radix Sort implémenté en C++
- 5. Comment IDisposable est-il implémenté sur FileStream dans .Net 1.1
- 6. Comment le javascript côté serveur est-il utilisé/implémenté?
- 7. Existe-t-il quelque chose comme Project Sprouts mais implémenté en Python?
- 8. Comment setTimeout est-il implémenté dans les interpréteurs javascript ou les timers en général?
- 9. Avec quel framework GUI est le Mono .NET Windows.Forms implémenté?
- 10. Quel est le modèle de conception implémenté par PEAR DB_DataObject?
- 11. Comment obtenir une référence au module dans lequel quelque chose est implémenté depuis cette implémentation?
- 12. Comment le script de chargement de ce site est-il implémenté?
- 13. Comment l'héritage peut-il être implémenté dans C#?
- 14. Où puis-je trouver un document expliquant comment Objective-C est implémenté
- 15. Quelle est la raison d'avoir '//' en Python?
- 16. erreur série d'importation est survenue en Python
- 17. Impossible de voir l'erreur "Doit être implémenté"
- 18. Comment pourrait être implémenté Singleton, qui remplit ses valeurs de db en C#?
- 19. Comment cacher __methods__ en python?
- 20. Comment puis-je utiliser la classe C++ en Python?
- 21. Comment trouver mon chemin python en utilisant python?
- 22. Quel est le problème avec mes boucles imbriquées en Python?
- 23. Ai-je implémenté une application n-tier avec MVC correctement?
- 24. dans quelle langue cybersyn/cyberstride a-t-il été implémenté?
- 25. Comment copier une image distante en python?
- 26. Comment définir une classe en Python
- 27. Comment échapper un hachage (#) en python?
- 28. Comment bande décorateurs d'une fonction en python
- 29. Comment faire du monkeypatching en python?
- 30. Comment faire Catégories Obj-C en Python?
En référence à la fonction appel/définition, ** fait partie de la syntaxe d'appel/définition et non d'un opérateur (http://docs.python.org/3.0/reference/expressions.html#id7, http: // docs.python.org/3.0/reference/compound_stmts.html#function-definitions) –