Besserwisser : sum() geht unter Macpython 2.3 nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

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 )
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.
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

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
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

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
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

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
Antworten