Nasıl Python ** uygulanmaktadır?

oy
11

Ben operatör ** Python nasıl uygulandığını göstermek için kaynak bulmak nerede merak ediyorum. Birisi bana doğru yönde işaret edebilir?

Oluştur 09/12/2008 saat 23:07
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
24

(Ayrıştırıcı kullanılarak üretilen edildiği piton dilbilgisi tanımı Pre ) 'güç' için bak: GRAMAR / GRAMAR

: Piton ast, 'ast_for_power' aramaya Python / ast.c

: Piton eval döngü, 'BINARY_POWER' aramaya Python / ceval.c

Hangi PyNumber_Power (uygulanan çağırır Nesneler / abstract.c ):

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

Esas olarak, çağırmak pow yuvası. Uzun nesnelerin (3.0 tek varsayılan tamsayı türü) bu long_pow fonksiyonu uygulanan İçin Nesneler / longobject.c (2.x dallarında) int nesneler için, bu int_pow fonksiyonu uygulanan Nesne / intobject.c

Eğer long_pow içine kazmak, argümanları inceleme ve kurmak biraz yaptıktan sonra görebilirsiniz, üs kalbi burada göremiyor olabilir:

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)
        }
    }
}

Hangi tartışılan algoritmaları kullanır Bölüm 14.6 arasında Uygulamalı Kriptografi Handbook keyfi hassas aritmetik için etkili bir üs alma algoritmaları tarif etmektedir.

Cevap 10/12/2008 saat 00:33
kaynak kullanıcı

oy
1

Ben caseysrandomthoughts fonksiyonları tanımına yıldızlarla ilgili soruyorsunuz düşünüyorum.

Bu Python doc sayfasından cevap bulabiliriz: http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions

formun ** adı nihai biçimsel parametre mevcut olduğunda, resmi bir parametreye karşılık gelen dışındaki tüm anahtar kelime argümanları içeren bir sözlük alır.

Ben piton dokümana başka bir yerde bu malzeme ekmek açıklamasını ettik ama hatırlamak olamaz.

Cevap 10/12/2008 saat 00:47
kaynak kullanıcı

oy
1

iki farklı uygulamaları (uzun 3.0 ') int için bir nesne ve şamandıra nesneler için bir tane bulunmaktadır.

Şamandıra pow float_pow olan (PyObject * V, W PyObject *, PyObject x Z) Python kaynak kod Nesne / floatobject.c dosyasında tanımlanan işlev. Bu fonksiyonlar C stdlib en math.h gelen pow () çağrıları

int pow, kendi uygulama vardır fonksiyonu int_pow olan (PyIntObject * V, W PyIntObject *, PyIntObject x Z) Python kaynak kod Nesne / intobject.c (3.0 için longobject.c) 'de tanımlandığı gibidir.

Cevap 10/12/2008 saat 00:32
kaynak kullanıcı

oy
1

Bu operatöre güç var

python.org doc - Güç operatörü

Düzenleme: Ah, dang, kod, doğru. Bağlantı hala yardımcı olur. Benim bölümünden Özensiz okuma

Cevap 09/12/2008 saat 23:10
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more