Как ** реализовано в Python?

Мне интересно, где я могу найти источник, чтобы показать, как оператор ** реализован в Python. Может ли кто-нибудь указать мне правильное направление?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
11
0
1 491
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Это сила оператора

python.org doc - Оператор мощности

Обновлено: О, черт возьми, код, верно. Надеюсь, ссылка все еще помогает. Небрежное чтение с моей стороны

Существует две разные реализации: одна для объектов типа int (long в версии 3.0), а другая - для объектов типа float.

Float pow - это функция float_pow (PyObject * v, PyObject * w, PyObject * z), определенная в файле Objects / floatobject.c исходного кода Python. Эта функция вызывает pow () из файла math.h в C stdlib.

Int pow имеет свою собственную реализацию, это функция int_pow (PyIntObject * v, PyIntObject * w, PyIntObject * z), определенная в Objects / intobject.c (longobject.c для 3.0) исходного кода Python.

Ответ принят как подходящий

Определение грамматики Python (из которого синтаксический анализатор генерируется с использованием pgen) ищите 'power': Грамматика / Грамматика

Python ast, ищите ast_for_power: Python / ast.c

Цикл eval в python, ищите 'BINARY_POWER': Python / ceval.c

Что вызывает PyNumber_Power (реализовано в Объекты / abstract.c):

PyObject *
PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
{
    return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
}

По сути, вызовите слот бух. Для длинных объектов (единственный целочисленный тип по умолчанию в 3.0) это реализовано в функции long_pow Объекты / longobject.c, для объектов типа int (в ветвях 2.x) это реализовано в функции int_pow Объект / 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)
        }
    }
}

В котором используются алгоритмы, описанные в Глава 14.6Справочник по прикладной криптографии, который описывает эффективные алгоритмы возведения в степень для арифметики произвольной точности.

Я думаю, что случайные мысли спрашивают о звездочках при определении функций.

Вы можете найти ответ на этой странице документа Python: http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions

Когда присутствует последний формальный параметр формы ** name, он получает словарь, содержащий все аргументы ключевого слова, кроме тех, которые соответствуют формальному параметру.

Я посеял описание этого материала где-то еще в документе Python, но я не могу вспомнить.

При обращении к вызову / определению функции ** является частью синтаксиса вызова / определения, а не оператором (docs.python.org/3.0/reference/expressions.html#id7, docs.python.org/3.0/reference/…)

Aaron Maenpaa 10.12.2008 15:32

Другие вопросы по теме