Seite 1 von 1

Frage zu lokalen Variablen in Methoden + Range Befehl

Verfasst: Donnerstag 6. Januar 2011, 03:06
von gstueb
Hallo,

ich lerne gerade Python und habe zu folgendem Test-Code zwei Fragen:

Code: Alles auswählen

class Test(object):
    def fak(self, f):
        faku = 1
        for x in range(2,f+1):
            faku = faku * x
        return faku

ob = Test()
print(ob.fak(3)) # 6
print(ob.faku)   # 'Test' has no attribute 'faku'
1. Frage bzgl. der Variablenbezeichnungen innerhalb einer Klasse

Innerhalb von Methoden soll man bei Variablen zum einen ja self.xxx verwenden, weil python dadurch eine pro Objekt eindeutige Variable erstellt. Außerdem soll man für lokale Variablen __variable schreiben, weil dies wiederum intern in eine eindeutige Variable übersetzt wird.

Fragen: Sollte man nun wirklich für jede noch so kleine temporäre Variable in einer Methode self.__i statt z.B. i schreiben, oder sind Variablen ohne self. und ohne __ automatisch lokal?

2. Frage zum Range Befehl in einer FOR-Schleife.

In Python gibt es wohl kein "for i=x to y", was ich schade finde. Statt einem "for i=x to y" müsste man also z.B. "for i in range(x+1, y+1)" schreiben.

Wie ist das ganze von der Performance und vom Speicherbedarf her zu sehen? Wenn ich nach diesem Schema eine Schleife von 1..10000 durchlaufe, wird dann intern wirklich erst eine Liste mit allen Zahlen zwischen 1..10000 [mit entsprechendem Speicherbedarf] erzeugt, die dann abgearbeitet wird, oder optimiert Python das intern? Kann man den Range-Befehl guten Gewissens verwenden, oder ist es besser, größere Schleifen von Hand nachzubilden?

Danke schonmal ;)

Re: Frage zu lokalen Variablen in Methoden + Range Befehl

Verfasst: Donnerstag 6. Januar 2011, 03:49
von cofi
gstueb hat geschrieben:1. Frage bzgl. der Variablenbezeichnungen innerhalb einer Klasse

Innerhalb von Methoden soll man bei Variablen zum einen ja self.xxx verwenden, weil python dadurch eine pro Objekt eindeutige Variable erstellt. Außerdem soll man für lokale Variablen __variable schreiben, weil dies wiederum intern in eine eindeutige Variable übersetzt wird.

Fragen: Sollte man nun wirklich für jede noch so kleine temporäre Variable in einer Methode self.__i statt z.B. i schreiben, oder sind Variablen ohne self. und ohne __ automatisch lokal?
Beide Informationen sind falsch. `__` als Präfix "mangelt" den Namen, mit eindeutigen Variablen hat es nichts zu tun.
Mehr dazu hier: http://tutorial.pocoo.org/classes.html# ... -variablen

Bindest du Objekte an `self`, dann an das Objekt, dann ist es _kein_ temporäres Objekt mehr, sondern wird ein Attribut des Exemplars. Methoden sind Funktionen mit dem einzigen Unterschied, dass bei Methoden implizit das Exemplar als erstes Argument uebergeben wird.
gstueb hat geschrieben: In Python gibt es wohl kein "for i=x to y", was ich schade finde. Statt einem "for i=x to y" müsste man also z.B. "for i in range(x+1, y+1)" schreiben.
Das ist falsch, sofern die Semantik deiner `for ... to ...` Schleife nicht von `i+1` beginnt, richtig waere `range(x, y+1)`. Warum sollte man hier einen Sonderfall und Mehrdeutigkeiten in der Syntax schaffen, wenn man sie auch mit der bestehenden Semantik abdecken kann?
gstueb hat geschrieben:Wie ist das ganze von der Performance und vom Speicherbedarf her zu sehen? Wenn ich nach diesem Schema eine Schleife von 1..10000 durchlaufe, wird dann intern wirklich erst eine Liste mit allen Zahlen zwischen 1..10000 [mit entsprechendem Speicherbedarf] erzeugt, die dann abgearbeitet wird, oder optimiert Python das intern? Kann man den Range-Befehl guten Gewissens verwenden, oder ist es besser, größere Schleifen von Hand nachzubilden?

Danke schonmal ;)
`range(n)` erstellt in Python 2 eine Liste mit `n` Objekten. Ja das ist speicherunfreundlich. Daneben gibt es mit `xrange` eine Generatorvariante, die Objekte erst bei Bedarf erstellt. In Python 3 ist `xrange` zu `range` umbenannt worden.

P.S. Woher hast du diese Informationen? Es scheint mir du solltest die Quelle wechseln.