Másvalaki problémája... Kígyó...

 ( NevemTeve | 2017. október 4., szerda - 8:15 )

Ez most kivételesen nem az én gondom, és nem is tudom reprodukálni... de azért érdekes.

Why can “%.10f” % Decimal(u) emit a string with a literal colon?

Python inserts a colon in a Decimal number from Access via pyodbc

python float got a colon after the decimal point after addition

Kapkodtam egy kicsit Linux-on, AIX-on, nem tudtam reprodukálni (bár nagyjából látom, hol kellene debuggolni, ha fellépne a hiba (dtoa.c:_Py_dg_dtoa, strtod.c:strod, etc))

Amit mégis felpanaszolni szeretnék, az csak annyi, hogy gondoltam, nyomok egy nagyobb tesztet, hátha mégis elő tudom idézni a hibát (csak más számoknál). Na ez lett:

cat nums.py
#!/usr/local/bin/python
for x in range(123000000000,123459999999):
    print '{0:.10f}'.format(x)
$ ./nums.py | grep ':'
Traceback (most recent call last):
  File "./nums.py", line 2, in 
    for x in range(123000000000,123459999999):
MemoryError

Ezt a dolgot egyébként úgy hívják Ifjabb Hátulgombolós Istvánéknál, hogy a hagyományos for-ciklust sikerült meghaladni. Hát igen. Sikerült. Köszi!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Nem védeni akarom a Python-t, de nézd meg a dokumentációban a range() és az xrange() közötti különbséget.
Illetve a 3-as Pythonban a range() úgy viselkedik, mint a 2-esben az xrange().

Köszi, ez hasznos információ!

Félek, hogy nem tudom reprodukálni a problémát, anélkül viszont nincs hangulatom nyomozni... Ilyesmi részek vannak a kódban:

            if (i == ilim) {
                dval(&u) += dval(&u);
                if (dval(&u) > ds || (dval(&u) == ds && L & 1)) {
                  bump_up:
                    while(*--s == '9')
                        if (s == s0) {
                            k++;
                            *s = '0';
                            break;
                        }
                    ++*s++;
                }
                break;
            }

IOCCC bíráló is vagy?

Nem is hallottam róla. De például ezt a 600-soros _Py_dg_dtoa függvényt biztos egy remek koder csinálta, az egy/két betűs változónevekkel, a goto-kkal egy blokk belsejébe, az egész átláthatatlan kavarással...

Igen. Valoszinuleg a `range(123000000000,123459999999)` lepeldanyosit egy 0.46giga elemszamu (tehat valtozomerettol fuggoen 3.7-7.4 gigabytenyi memoriaigenyu) tombot, es azt szepen vegigitarealja. Es az azert nem annyira keves memoria, szoval egy MemoryError siman befigyelhet.

De mindenkepp ilyen ehhez hasonlo range-s megoldast keress mert a for (x=123000000000; x<=123459999999; x++) jellegu megoldasok untrendyk, elavultak, nem pythonosak es kulonbenis fujfujj!!!!1111oneone!!!

Pontosan úgy van, ahogy mondod, ezt a dokumentáció le is írja.
https://docs.python.org/release/2.7.9/library/functions.html?highlight=range#range
"The full form returns a list of plain integers [start, start + step, start + 2 * step, ...]."
Azaz ténylegesen el is készíti a range() a listát.

És xrange-t kell használni:

"This function is very similar to range(), but returns an xrange object instead of a list. This is an opaque sequence type which yields the same values as the corresponding list, without actually storing them all simultaneously."

De persze a doksit el kell olvasni.

Off: Annyira jellemző ez a Pistikék agyműködésére: ha már elkövették a hibát (a hagyományos for helyett a range-es for-t), azt nem hajlandók javítani, inkább újabb tákolással próbálják megkerülni a hibás döntés okozta gondot... (Most nem akarom Strupstrup és Pöttering urakat felemlíteni, mint ennek a mentalitásnak az iskolapáldáit.)

Tovább néznéd rant helyett, python3-ban neked tetszően van.

Úgy érted, hogy
for exp1; exp2; exp3: statement
?
Ez jó hír, csak az aktuális gond a Python-ban van, nem a Python3-ban. (Nem is értem, az emberek miért nem tüzesebbek az inkompatibilis verzióváltásokért...)

Nem, a range vette fel az xrange működését.

A probléma fennáll, valódi, de ekkora hisztit nem kéne érdemelnie (van nagyobb baj is, pl. a ctypesnál), aki egyszer erre ráfut, az már tudni fogja.

Ismeros ez nekem valahonnan...