Variable incrementieren um 1?

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
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

Hi again,

kann man eine lokale Variable incrementieren um 1?

Also in C wäre das so ein i++ Befehl.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

also das steht ja nun wirklich in jeder Anleitung :)

Erstens geht es natuerlich ganz normal:

Code: Alles auswählen

i = i + 1
und als Kurzform gibt es:

Code: Alles auswählen

i += 1
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

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?
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

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 ;)
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

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 ^^
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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)

Code: Alles auswählen

n (neu): 1
n (neu): 101
n (neu): 201
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

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 :wink: , 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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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 :D
TUFKAB – the user formerly known as blackbird
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

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
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

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 :D
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Mir ist zu dem Problem spontan 'yield' eingefallen ... vielleicht kann man damit was drehen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
>>> 
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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
Antworten