Seite 1 von 1

Besserwisser : sum() geht unter Macpython 2.3 nicht

Verfasst: Dienstag 7. Februar 2006, 23:45
von Gunnar
Hi Pythons,

ich weiss nicht, ob es euch interessiert :

die builtin-Funktion sum() geht unter MacPython 2.3 nicht...wenn man dieses abenteuerliche Update auf 2.4.1 ( official unofficial ;) ) macht, klappt es.

Nur für die, die sich über "invalid syntax" wundern und in der Doku : "since python ver. 2.3" lesen

Gruss,
Gunnar ( der auch mal etwas bemerkt hat )

Verfasst: Mittwoch 8. Februar 2006, 00:37
von BlackJack
Bist Du sicher das `sum()` in 2.3 nicht funktioniert? Kann ich mir kaum vorstellen. Was ich mir eher vorstellen könnte ist, das Du innerhalb der Klammern von `sum()` einen Generator-Ausdruck geschrieben hast. Das ist in 2.3 natürlich ungültige Syntax.

Verfasst: Mittwoch 8. Februar 2006, 08:14
von Gunnar
Hi Blackjack,

sicher ist bei mir garnichts :lol:

Aber den bemängelten Code will ich euch nicht vorenthalten :

Code: Alles auswählen

all = float(sum(getsize(join(root, name)) for name in files))/1024/1024
In der Doku steht dazu :
sum( sequence[, start])

Sums start and the items of a sequence, from left to right, and returns the total. start defaults to 0. The sequence's items are normally numbers, and are not allowed to be strings. The fast, correct way to concatenate sequence of strings is by calling ''.join(sequence). Note that sum(range(n), m) is equivalent to reduce(operator.add, range(n), m) New in version 2.3.
Ich habe es so verstanden als das meine Lösung der korrekte Weg ist. Aber ich lass mich gerne belehren, mein Pythonwissen ist noch sehr beschränkt. :oops:

Gruss,
Gunnar

Verfasst: Mittwoch 8. Februar 2006, 10:08
von modelnine
Genau wie BlackJack es gesagt hat: Du benutzt eine Generator-Comprehension, die's in Python 2.3 noch nicht gibt.

Folgendes sollte tun:

Code: Alles auswählen

all = float(sum([getsize(join(root, name)) for name in files]))/1024/1024
--- Heiko.

Verfasst: Mittwoch 8. Februar 2006, 14:18
von Gunnar
Danke ihr Beiden,

dann ist das Beispiel in der Doku allerdings unpassend, denn da steht es so :

Code: Alles auswählen

import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
    print root, "consumes",
    print sum(getsize(join(root, name)) for name in files),
    print "bytes in", len(files), "non-directory files"
    if 'CVS' in dirs:
        dirs.remove('CVS')  # don't visit CVS directories
kurz darunter eine Anmerkung "New in 2.3"

Heiko,
kannst du mir erklären, was der Interpreter in deinem Beispiel anders macht ?

Gruss,
Gunnar

Verfasst: Mittwoch 8. Februar 2006, 14:41
von modelnine
dann ist das Beispiel in der Doku allerdings unpassend, denn da steht es so :
Du liest die Doku zu Python 2.4, oder? In der 2.3-er Doku steht es sicherlich nicht so, sondern wie ich es geschrieben habe. Und wenn sich ein Beispiel auf die Funktion sum bezieht und auch der Kommentar auf diese Funktion bezieht, kann ich nicht erkennen warum das verwenden eines syntaktischen Strukturelements (das nun mal rein gar nichts mit sum zu tun hat, nämlich einer Generator-Expression) irgendwas daran ändert dass die Funktion seit 2.3 unterstützt wird.

Der Unterschied zwischen den beiden? Das erste ist eine sogenannte List-Comprehension, das zweite eine Generator-Comprehension:

Code: Alles auswählen

listcomp = [x**0.5 for x in range(10)]
gencomp = (x**0.5 for x in range(10))
Tipp das mal in den Interpreter und gib dann die Variablen listcomp und gencomp aus. Bei ersterem wird die (versteckte) for-Schleife direkt ausgewertet und aus den Elementen eine Liste gemacht, beim zweiteren kriegst Du einen Iterator für die (versteckte) for-Schleife, wobei eben jedes Element nur on-demand ausgewertet wird (das Iterator-Protokoll definiert dafür .next(); probier mal gencomp.next()).

Sonst: die Python-Doku hält auch noch 'ne ganze Menge über den Unterschied zwischen Generator- und List-Comprehensions bereit.

--- Heiko.

Verfasst: Mittwoch 8. Februar 2006, 15:30
von Gunnar
Danke für das aufzeigen des Unterschieds zwischen den beiden Comprehensions. :)

Ja ich lese die 2.4 Doku, aber programmiere eben auch für die 2.3 Version. Mit eurem Hintergrundwissen wäre das kein Stolperstein für mich gewesen, aber so wurde ich tatsächlich durch das Beispiel fehlgeleitet.

Wie auch immer,
bis demnächst und danke für die Unterstützung. Hier im Forum erfährt man wenigstens immer was man wissen will/muss.

Gruss,
Gunnar