Werte eine Schleife in ein Array speichern

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
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

Wie speichere ich Werte aus einer Schleife in ein Array?

Angenommen ich habe folgende Funktion:

Code: Alles auswählen

def stand_abb(phi=1.0,p=1.0):
    i=0
    while i<10:
        phi=phi+p
        p=p+1*sin(phi)
        i=i+1
    return
Und ich möchte nun, dass alle "phi"-Werte in ein Array gespeichert werden und dass alle "p"-Werte in ein Array gespeichert werden. Wie mache ich das?
BlackJack

@alex2007: Listen sind ein Grunddatentyp von Python. Die sollten dementsprechend in jedem Grundlagentutorial vorkommen. Welches benutzt Du denn um Python zu lernen?

Edit: Statt der ``while``-Schleife hätte sich hier übrigens eine ``for``-Schleife mit `range()` bzw. `xrange()` angeboten. Und das ``return`` ist überflüssig. Was soll `stand_abb` bedeuten?
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

BlackJack hat geschrieben:@alex2007: Listen sind ein Grunddatentyp von Python. Die sollten dementsprechend in jedem Grundlagentutorial vorkommen. Welches benutzt Du denn um Python zu lernen?

Edit: Statt der ``while``-Schleife hätte sich hier übrigens eine ``for``-Schleife mit `range()` bzw. `xrange()` angeboten. Und das ``return`` ist überflüssig. Was soll `stand_abb` bedeuten?
Ich benutze eine Vorlage in Textform, in dem die Grundlagen drin stehen. "stand_abb" steht für Standard-Abbildung. Ich brauche Python für mein Physikstudium und eine erste Aufgabe besteht darin ein Programm zu schreiben, was einen Plot macht, bei welchem mit einem Klick ein Startpunkt festgelegt wird, von welchem ausgehend nach meiner definierten Funktion, 1000 Punkte berechnet werden, welche dann gezeichnet werden sollen. Da ich aber keine 1000 Plotbefehle haben möchte, möchte ich die Werte, die meine Funktion nach jedem mal ausgibt in einem Array speichern, welches dann geplottet wird. Da aber weder ich eine Komplettlösung meiner Aufgabe möchte, noch Ihr mir diese geben werdet, versuche ich mich heranzutasten. Den Plot erzeugen, das Event mit dem Mausklick definieren stellt kein Problem dar. Die Fnktion vom Prinzip her definieren auch. Ich brauche jetzt wie gesagt die richtige herangehensweise wie ich das ganze als Array ausgegeben bekomme. Leider habe ich dazu nichts entsprechendes gefunden. Wahrscheinlich suche ich nach den falschen Begriffen.

Also soll ich eine for-Schleife verwenden? Kannst du mir erklären, wie ich die Werte eines jeden Schrittes alle zusammen in ein Array packe? Bzw. Kannst du mir sagen, nach was ich Suchen muss um meine Antwort zu finden?
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

Ok, ich glaube ich habe eine Lösung gefunden. Ich poste Sie gleich mal...Moment!
BlackJack

@alex2007: Das Stichwort ist Liste statt Array. Listen sind einer der Grunddatentypen. Und falls Du `matplotlib` verwendest, kannst Du anstelle eines `numpy`-Arrays auch eine Liste mit Werten übergeben.
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

@BlackJack: Ist folgende Lösung so ok?

Code: Alles auswählen

def stand_abb(phi=1.0,p=1.0):
    i=0
    x=range(0)
    y=range(0)
    while i<10:
        phi=phi+p
        p=p+1*sin(phi)
        x.append(phi)
        y.append(p)
        i=i+1
    return x,y
Du hast gesagt "for"-Schleife hätte sich angeboten. Ist die "while"-Schleife hier weniger gut?
Zuletzt geändert von alex2007 am Dienstag 15. April 2014, 23:02, insgesamt 1-mal geändert.
BlackJack

@alex2007: Bei einer ``for``-Schleife spart man sich das initialisieren und das manuelle hochzählen von `i`. Zwei Zeilen gespart die über Funktion verteilt sind. Eine leere Liste mit ``range(0)`` zu erstellen ist, äh, ungewöhnlich. Sehe ich das erste mal das das jemand macht. Direkter wäre ``list()`` oder ``[]``.

Bist Du sicher das Zeile 7 so aussehen soll? Was ist der Sinn von der Multiplikation mit 1?

Man sollte die beiden Listen vielleicht als Rückgabewert verwenden, sonst ist die Funktion ein wenig sinnfrei.
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

BlackJack hat geschrieben:@alex2007:
Man sollte die beiden Listen vielleicht als Rückgabewert verwenden, sonst ist die Funktion ein wenig sinnfrei.
Schon getan :)
BlackJack hat geschrieben:@alex2007:Eine leere Liste mit ``range(0)`` zu erstellen ist, äh, ungewöhnlich. Sehe ich das erste mal das das jemand macht. Direkter wäre ``list()`` oder ``[]``.
Würdest du das als stilistisch "schlecht" ansehen?
BlackJack hat geschrieben:@alex2007:
Bist Du sicher das Zeile 7 so aussehen soll? Was ist der Sinn von der Multiplikation mit 1?
Die 1 ist eigentlich ein K und kann variiert werden. Wir sollen uns für verschiedene K die Plots anschauen und unsere Beobachtungen erklären. Bei der Abgabe der Aufgabe, soll da eine 2.6 hin. Ich hab da nur eine 1 zum rumprobieren hingeschrieben.

PS: wenn dich das ganze interessiert, was wir da eigentlich machen, kann ich dir gern mal den Link per PN schicken!?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

alex2007 hat geschrieben:
BlackJack hat geschrieben:@alex2007:Eine leere Liste mit ``range(0)`` zu erstellen ist, äh, ungewöhnlich. Sehe ich das erste mal das das jemand macht. Direkter wäre ``list()`` oder ``[]``.
Würdest du das als stilistisch "schlecht" ansehen?
Bei ``list()`` oder ``[]`` ist sofort ersichtlich, dass es sich um eine leere Liste handelt. Bei ``range(0)`` muss man zunächst über die Bedeutung, wenn auch nur kurz, nachdenken. Hinzu kommt, dass Python 3 keine Liste mehr zurückgibt.
alex2007 hat geschrieben:Die 1 ist eigentlich ein K und kann variiert werden. Wir sollen uns für verschiedene K die Plots anschauen und unsere Beobachtungen erklären. Bei der Abgabe der Aufgabe, soll da eine 2.6 hin. Ich hab da nur eine 1 zum rumprobieren hingeschrieben.
Dann gib der Funktion am besten einen entsprechenden Parameter. Solche Kleinigkeiten werden sehr leicht übersehen und führen nur zu nervigen Fehlern und der Suche danach.
Das Leben ist wie ein Tennisball.
BlackJack

@alex2007: Das ``range(0)`` ist wie gesagt das erste mal das ich so etwas sehe. Besonders deutlich ist das nicht, man muss erst mal kurz nachdenken.

So könnte das mit einer ``for``-Schleife aussehen:

Code: Alles auswählen

def standard_abbildung(phi=1.0, p=1.0, k=2.6, count=10):
    x, y = list(), list()
    for _ in xrange(count):
        phi += p
        x.append(phi)
        p += k * sin(phi)
        y.append(p)
    return x, y
Antworten