Seite 1 von 1
Funktionswerte in Variablen speichern
Verfasst: Donnerstag 4. Oktober 2018, 17:51
von schuesra
Ich habe folgendes Problem. Ich kann mir die Werte der Funktion interval(x, partition) printen lassen, allerdings möchte ich die Werte in einer Variblen speichern.
Beispielsweise ist das mein Output: 2 1 11 5 3 0 9 3 3 11
Diesen Output hätte ich wie im Code angegeben gerne in iamstupid = find_interval(x, I) speichern.
Das funktioniert leider nicht. Kann da jemand weiterhelfen?
times_to_repeat = 0
while times_to_repeat >= 0:
r = uniform.rvs(size=10)
def find_interval(x, partition):
""" find_interval -> i
partition is a sequence of numerical values
x is a numerical value
The return value "i" will be the index for which applies
partition < x < partition[i+1], if such an index exists.
-1 otherwise
"""
for i in range(0, len(partition)):
if x < partition:
return i-1
return -1
I = [0, 0.08, 0.15, 0.24, 0.36, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 1.0]
for x in [r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9]]:
print(find_interval(x, I), end=" ")
#iamstupid = find_interval(x, I)
times_to_repeat -= 1
Re: Funktionswerte in Variablen speichern
Verfasst: Donnerstag 4. Oktober 2018, 19:05
von Sirius3
Weißt Du was Listen sind und wie man sie erzeugen kann? Wenn nicht, ließ das Kapitel zu Listen nochmal in dem Tutorial durch, das Du zum Python-Lernen benutzt.
Zum Code: eine while-Schleife, die exakt einmal durchlaufen wird, ist unnötig. Funktionsdefinitionen sollten am Anfang der Datei stehen, nicht in Schleifen. Es wäre gut gewesen, zu verraten, woher `uniform` kommt. Die Funktion `find_interval` funktioniert nicht. Warum erzeugst Du für die for-Schleife eine Liste aus Einzelelementen eines Arrays? Du kannst direkt über `r` iterieren.
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 09:20
von schuesra
Ich weiß, wie ich Listen erzeugen kann, aber da hat das Tutorial nicht weitergeholfen für das Problem.
Die while-Schleife wird nur zur Vereinfachung einmal durchlaufen, damit es für den Moment übersichtlich bleibt.
'uniform' kommt von 'from scipy.stats import uniform'. So sollte der Code funktionieren.
Über r iterieren wär wohl geschickter, aber bringt mich nicht näher an die Lösung.
Hast du eine Idee, wie ich konkret den Output hier in einer Variable speichern kann?
Vielen Dank!
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 09:24
von Sirius3
Welche Methoden hat denn eine Liste? Und welche davon könnte man benutzen, um Elemente in eine Liste einzutragen?
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 09:59
von schuesra
Ich würde eine leere Liste erzeugen und es dann mit extend probieren, allerdings ist mir unklar was ich als Argument dann verwenden muss. Also:
list= [ ]
list.entend(???)
find_interval(x, I) als Argument funktioniert jedenfalls nicht...
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 10:01
von schuesra
List.extend braucht auch eine Liste als Argument, das ist das Problem. Deswegen ist das wohl der falsche Ansatz
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 10:08
von __deets__
dann nimm doch append.
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 10:15
von schuesra
append benötigt aber genau so eine Liste als Argument...
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 10:21
von __blackjack__
@schuesra: Nein. Was wäre denn dann Deiner Meinung nach der Unterschied zwischen `append()` und `extend()`?
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 10:43
von schuesra
bei append:
x = [1, 2, 3]
x.append([4, 5])
print (x)
-> [1, 2, 3, [4, 5]]
bei extend:
x.extend([4,5])
print(x)
->[1, 2, 3, 4, 5]
Also wird bei append das komplette Objekt angehängt und nicht die einzelnen Elemente...
Wenn ich es aber mit append versuche, bekomme ich folgende Fehlermeldung:
"TypeError: descriptor 'append' requires a 'list' object but received a 'int'"
Hier die entsprechende Änderung:
I = [0, 0.08, 0.15, 0.24, 0.36, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 1.0]
for x in [r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9]]:
print(find_interval(x, I), end=" ")
l=[]
list.append(find_interval(x, I))
times_to_repeat -= 1
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 10:48
von __blackjack__
@schuesra: An welche Liste versuchst Du denn da etwas anzuhängen? Was ist `list`?
Eine unnötige ``while``-Schleife trägt sicher nicht zur Übersichtlichkeit bei, sondern macht das Programm nur unnötig komplexer. Nebenbei ist auch das ``while`` an sich nicht das richtige wenn man weiss wie oft eine Schleife durchlaufen werden soll — da nimmt man eine ``for``-Schleife für.
Schleifen über ``range(len(sequence))`` sind in Python ein „anti pattern“ wenn die Laufvariable im Schleifenkörper für Indexzugriffe verwendet wird. Man kann direkt über die Elemente iterieren. Und falls man zusätzlich eine laufende Zahl benötigt, gibt es die `enumerate()`-Funktion.
Hier mal Dein Code etwas aufgeräumter:
Code: Alles auswählen
#!/usr/bin/env python3
from scipy.stats import uniform
def find_interval(x, partition):
""" find_interval -> i
partition is a sequence of numerical values
x is a numerical value
The return value "i" will be the index for which applies
partition[i] < x < partition[i+1], if such an index exists.
-1 otherwise
"""
for index, value in enumerate(partition):
if x < value:
return index - 1
return -1
def main():
values = [
0, 0.08, 0.15, 0.24, 0.36, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 1.0
]
for x in uniform.rvs(size=10):
print(find_interval(x, values), end=' ')
#iamstupid = find_interval(x, values)
print()
if __name__ == '__main__':
main()
Du möchtest Dir vielleicht auch die „list comprehension“-Syntax anschauen. Und für ein etwas effizienteres `find_interval()` eventuell das `bisect`-Modul.
Mit -1 als Zahl mit besonderer Bedeutung wäre ich übrigens vorsichtig, insbesondere wenn es sich ansonsten um Indexwerte handelt. Der Wert -1 ist in Python ein legaler Indexwert. Da kann es schnell mal passieren, dass man mit so einer Liste mit Indizes weiterarbeitet und vergisst auf eine enthaltene -1 zu prüfen und dann rechnet das Programm möglicherweise falsch, ohne das man das merkt.
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 11:19
von schuesra
Ich meine natürlich l.append(find_interval(x, I))
Ich möchte an die leere Liste l die jeweiligen Intervalle anhängen. Also insgesamt 10 Elemente.
Vielen Dank für die aufgeräumtere Version, ich werde ich bisschen Zeit zum Verstehen benötigen.
Du meinst das mir list comprehension helfen könnte für die Lösung des Problems, oder war das ein allgemeiner Tipp?
Wenn nicht, wie kann ich vorgehen um auf die Lösung zu kommen?
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 11:26
von __blackjack__
@schuesra: Eine „list comprehension“ kann helfen das Problem zu lösen.
Re: Funktionswerte in Variablen speichern
Verfasst: Freitag 5. Oktober 2018, 13:30
von Sirius3
Wo hast Du denn jetzt noch mit ` l.append(find_interval(x, I))` ein Problem? , außer dass das kleine l nicht vom großen I zu unterscheiden ist.
Und List comprehension löst kein Problem, solange man noch nicht verstanden hat, wie einfache Listen funktionieren.