我想知道在哪里找到源代码来显示操作符**是如何在Python中实现的。有人能指引我朝着正确的方向吗?**如何在Python中实现?
回答
蛇皮语法定义(来自其使用pgen产生解析器)中,查找 '功率':Gramar/Gramar
蛇皮AST,寻找 'ast_for_power':Python/ast.c
蛇皮EVAL环,寻找 'BINARY_POWER':Python/ceval.c
其中要求PyNumber_Power(在Objects/abstract.c实现):
PyObject *
PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
{
return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
}
基本上,调用pow插槽。对于长对象(在3.0的唯一默认的整数类型),这是在long_pow功能Objects/longobject.c实施,对于int对象(在2.x的分支),它是在int_pow功能Object/intobject.c
如果你深入研究long_pow实施,你可以看到审核的参数和做一点成立后,求幂的心脏可以在这里看到:
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)
}
}
}
它使用它描述了任意精度的有效幂算法的Handbook of Applied Cryptography的Chapter 14.6讨论算法算术。
对于int(long in 3.0)对象和另一个float对象有两种不同的实现。
float pow是在Python源代码的Objects/floatobject.c文件中定义的float_pow(PyObject * v,PyObject * w,PyObject * z)函数。这个函数调用C stdlib的math.h中的pow()函数int pow具有自己的实现,是Objects/intobject.c中定义的函数int_pow(PyIntObject * v,PyIntObject * w,PyIntObject * z)longobject .c for 3.0)的Python源代码。
我认为caseysrandomthoughts在功能定义问星号。
您可以在此Python的文档页面找到答案:http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions
当表单的最终形式参数**的名字,它接收包含除了那些对应于形参的所有参数的字典。
我已经在python doc的其他地方播种了这个东西的描述,但是我不记得了。
- 1. 如何在Python中实现Haskell实例?
- 2. 如何在Python中实现“如果”?
- 3. 如何实现在Python
- 4. 如何实现在Python
- 5. 如何在Python中实现字数?
- 6. 你如何在Python中实现ECDF?
- 7. 如何在Python中实现日历?
- 8. 如何在c中实现Python socket.unwrap()?
- 9. __slots__如何在Python中实现?
- 10. [python]:如何在python3中实现切片?
- 11. 如何在Scala中实现Python的issuperset()
- 12. 如何在python中实现超时?
- 13. 如何在Python/Kivy中实现ScrollView
- 14. 如何在Python中实现集线器
- 15. 如何在Python中实现链操作?
- 16. 如何在Python中实现`cat`
- 17. 如何在Python中保存实现类?
- 18. 在Python中如何实现rangeiterator?
- 19. 如何在Python中实现定时器
- 20. 如何在Python中实现线程socket.recv()?
- 21. int()是如何在Python中实现的?
- 22. 如何在javascript中实现python的namedtuple
- 23. 在Python中实现
- 24. 在python中实现R表的实现
- 25. Python如何实现str [:: - 1]?
- 26. Python:如何实现__getattr __()?
- 27. 实现在Python
- 28. 实现在Python
- 29. 如何在Delphi中实现XIRR实现?
- 30. Python中如何实现多重赋值?
当提到函数调用/定义时,**是调用/定义语法的一部分,不是运算符(http://docs.python.org/3.0/reference/expressions.html#id7,http:// docs.python.org/3.0/reference/compound_stmts.html#function-definitions) – 2008-12-10 12:32:05