Seite 1 von 1
Variable incrementieren um 1?
Verfasst: Donnerstag 26. Juni 2008, 14:41
von Pü-Ton
Hi again,
kann man eine lokale Variable incrementieren um 1?
Also in C wäre das so ein i++ Befehl.
Verfasst: Donnerstag 26. Juni 2008, 14:42
von shakebox
also das steht ja nun wirklich in jeder Anleitung
Erstens geht es natuerlich ganz normal:
und als Kurzform gibt es:
Verfasst: Donnerstag 26. Juni 2008, 15:30
von Pü-Ton
ja natürlich.
Ich hab eigentlich ein anderes Prob:
Es bibt eine Funktion, die ofters aufgerufen wird...
Es soll so ein, dass eine Variable beim ersten Aufruf der Funktion mit Null deklariert wird, und bei allen anderen Aufrufen der Funktion die Variable immer den Wert hat, der ihr im weiteren Verlauf der Funktion zugespielt werden...
Also:
1. Funktionsaufruf: n = 0
innerhalb der Funktion wird n zu 1
2. Funktionsaufruf n=1
innerhalb der Funktion wird n zu -2
3. Funktionsaufruf n=-2
...
ich versuch mich da schon eine ganze Weile und hab meistesns den Fehler, dass n aufgerufen wird, bevor sie assigned wird
Code: Alles auswählen
n=0
def checkHeight():
if n == 0:
print "n= " = ",n
n = n+1
else:
...
Der Code soll also beim ersten Funktionsaufruf n erhöhen, damit er beim 2.Funktionsaufruf gleich was anderes macht: "else:"
....
gibt es sowas wie ein "static" oder einen Constructor wie in c?
Verfasst: Donnerstag 26. Juni 2008, 15:34
von Karl
Schonmal drüber nachgedacht, Python zu lernen? Es gibt recht gute Quellen um die Grundlagen zu lernen. Sorry, nicht böse gemeint, aber schau dir einfach mal die Grundlagen von Python an, dann klappt das schon

Verfasst: Donnerstag 26. Juni 2008, 15:42
von shakebox
naja, Karl, das find ich jetzt nicht so passend als Hilfe. Er versucht ja, Python zu lernen. Genau solche Schritte gehoeren doch dazu.
Man kann ja nicht sagen: ich lerne erstmal die Dinge X, Y und Z einer Sprache und erst wenn ich das alles kann, schreib ich ein Programm dazu. Zum Lernen gehoert ja nicht nur, die "Vokabeln" zu koennen sondern eben auch zu verstehen, wie die Grammatik funktioniert und wie man allgemein spricht.
Und genau da wuerde ich diese Frage einsortieren. Er hat ein konkretes Problem im Kopf und will das umsetzen. Dabei kann eine Hilfe von hier ja nicht nur darin bestehen dass man sagt: nimm Modul X, Methode Y, usw. sondern eben auch hilft beim Verstaendnis, wie Programmieren ansich funktioniert.
Ich wuerde deshalb eher jetzt mal nachfragen: was hast Du genau vor? Wozu soll das dienen (damit man evtl. nen komplett anderen, weil sinnvolleren Weg vorschlagen kann), usw.
Verfasst: Donnerstag 26. Juni 2008, 15:48
von Rebecca
Da der OP ja versucht, mit globalen Variablen zu arbeiten: Da wuerde die Anweisung "global n" am Anfang-des Funtionskoerpers fehlen.
Aber eigentlich eine interessante Frage: In C wuerde man fuer sowas statische Variablen benutzen, das gibt's ja in Python nicht. Was ist da der gaengigste Weg? Global ist ja eigentlich unschoen. Ich selbst hab mir in so einem Fall immer eine kleine Klasse drumrum gebastelt, ist aber etwas Overhead... ebenso, wenn man die entspr. Variable immer als Parameter mitschleift.
Verfasst: Donnerstag 26. Juni 2008, 15:54
von Karl
Naja shakebox, du hast schon recht, er kommt wenigstens nicht so dreist daher und verlangt fertigen Code usw

Aber dass er sich noch nicht allzu viel mit den Grundlagen befasst hat, sieht man auch auf Anhieb.
Wenn er von C++ kommt, könnte er ja sogar Ahnen, dass n in der Funktion nicht definiert ist

Parameter sind schon ne feine Sache. Globals würde auch gehen, aber da finde ich Parameter schöner.
Das print-Statement ist auch ziemlich strange, man kann grad noch erahnen, was es heißen soll :p
Ich will ihn ja nicht runtermachen, ich hab damals mit PHP noch dümmer angefangen (glaub ich) aber mittlerweile sehe ich ein, dass es enorm hilft die Grundlagen zu lernen

Und dass er dauernd mit C++ vergleicht, zeigt imo auch, dass er sich noch nicht so
richtig mit Python beschäftigt hat.
Edit: Sorry, C ^^
Verfasst: Donnerstag 26. Juni 2008, 16:00
von gerold
Hallo!
Daten übergeben und geänderte Daten wieder zurück geben. So passieren keine Überaschungen innerhalb der Funktion. Es kommt oben was rein und unten kommt etwas raus.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
def check_height(n):
if n == 0:
n += 1
else:
n += 100
print "n (neu):", n
return n
globales_n = 0
globales_n = check_height(globales_n)
globales_n = check_height(globales_n)
globales_n = check_height(globales_n)
mfg
Gerold

Verfasst: Donnerstag 26. Juni 2008, 16:07
von shakebox
Karl hat geschrieben:Aber dass er sich noch nicht allzu viel mit den Grundlagen befasst hat, sieht man auch auf Anhieb.
Stimmt schon. Nur bin ich ja z.B. auch sehr frisch in Python und weiss deshalb halt sehr gut dass man manchmal wie der Ochs vorm Berg steht bei eigentlich einfachen strukturellen/konzeptionellen Sachen. Und da hilft es meistens nicht, die gleiche Anleitung dutzende Male zu lesen, da sie ja immer nur auf eine Art und Weise den speziellen Fall erklaert. Oft reicht ja ne geringfuegig andere Formulierung/Erklaerung und ploetzlich macht es Klick.
Und das ist halt im Gespraech mit echten Menschen, sofern Ihr nicht eh alle irgendwelche Bots seid

, deutlich leichter als solange zu suchen bis man die in dem Fall passende Anleitung irgendwo findet.
Es muss denke ich immer beides sein: sich selbst informieren und weiterbilden, aber eben auch der Austausch mit Leuten die was anders formulieren koennen.
Verfasst: Donnerstag 26. Juni 2008, 16:10
von mitsuhiko
Rebecca hat geschrieben:Aber eigentlich eine interessante Frage: In C wuerde man fuer sowas statische Variablen benutzen, das gibt's ja in Python nicht. Was ist da der gaengigste Weg?
Jedes mal wenn ich eine statische Variable brauch stelle ich fest, dass ich eigentlich eine Closure will

Verfasst: Donnerstag 26. Juni 2008, 16:15
von Pü-Ton
Huch, da hab ich ja mal eine ganze Grundsatzdiskussion ins Rollen gebracht...
Also erstens komm ich nicht von C oder C++, das hab ich nur in 2 Semestern im Studium gehabt und da eben a bissle was aufgeschnappt und
zweitens, bei der print anweisung hab ich mich voll vertippt, das = und das 3. " müssen natürlich raus...
Das ich (noch) kein guter Pythonianer bin, liegt daran, dass ich es mir erst seit 3 Wochen beibringe und eigentlich schnell lerne und gerade an einem ziemlich komplexen Programm arbeite...
Aber ja, Grundlagen sind da, vielleicht auch nicht alle...
Ich finde learning by doing immer noch die effektivste Lernmethode und wo geht das besser als beim Programmieren mit Try and Error ...
Dass ich keine Komplettlösungen will ist ja wohl ausser Frage, da ich es ja für mich lernen will...
Es ist auch so, dass ich mich normalerweise im www gründlich umschau, bevor ich hier was poste. Allerdings bei meiner ersten Frage, die hier den Thread eröffnet hat, war das nicht so der Fall... dafür ein SORRY .. hatte einfach eine schnelle Idee im Kopf und wollte nicht lang suchen...
Also jetzt haben wir die Lösung für Increments, Daten innerhalb einer Funktion übergeben und wieder zurück holen und die Erkenntnis, dass
hier ein SUPER KLASSE Forum ist...
Bis zur nächsten Newby-Frage
Euer Pü-Ton
Verfasst: Donnerstag 26. Juni 2008, 16:19
von Karl
Pü-Ton hat geschrieben:
Bis zur nächsten Newby-Frage
Euer Pü-Ton
Es war ja auch zugegebenermaßen keine Frage, deren Lösung man gezielt nachschlagen konnte.
Dass du dich beim print vertippt hast, hab ich mir auch schon gedacht

Jedenfalls gehofft

Verfasst: Donnerstag 26. Juni 2008, 17:05
von Pekh
Mir ist zu dem Problem spontan 'yield' eingefallen ... vielleicht kann man damit was drehen?
Verfasst: Donnerstag 26. Juni 2008, 17:15
von EyDu
Code: Alles auswählen
>>> class StateFunc(object):
def __init__(self, state):
self.state = state
def __call__(self, param):
print param
print self.state
self.state += 1
>>> func = StateFunc(42)
>>> func(1)
1
42
>>> func(2)
2
43
>>> func(23)
23
44
>>>
Verfasst: Donnerstag 26. Juni 2008, 18:21
von helduel
Moin,
eine andere Möglichkeit wäre:
Code: Alles auswählen
>>> def foo(n=0):
... while True:
... v = (yield n)
... if v is None:
... n += 1
... else:
... n = v
...
>>> x = foo()
>>> print x.next()
0
>>> print x.next()
1
>>> print x.send(-2)
-2
>>> print x.next()
-1
>>> print x.next()
0
Gruß,
Manuel
Verfasst: Donnerstag 26. Juni 2008, 18:48
von Darii
oder so:
Code: Alles auswählen
def inc(n = 0):
n = [n]
def inc():
n[0] += 1
return n[0]
return inc
inc_ = inc()
print inc_(), inc_(), inc_()
in python3000 könnte man das dann auch ohne die Liste realisieren(über das Schlüsselwort nonlocal), ungetestet hab das gerade nicht zur Verfügung
Code: Alles auswählen
def inc(n = 0):
def inc():
nonlocal n
n += 1
return n
return inc