Seite 2 von 3
Verfasst: Dienstag 3. November 2009, 17:26
von Dav1d
Code: Alles auswählen
from xturtle import*
x_werte=[]
y_werte=[]
x=-3
while x<=3:
y=x**2+1
x_werte.append(x)
y_werte.append(y)
goto(x*50,y*50)
x=x+0.1
for i, x in enumerate(x_werte)):
print"x: %s, y: %s" % (x, y_werte[i])
Verfasst: Dienstag 3. November 2009, 18:10
von ms4py
Das sieht nicht sehr elegant aus...
So wäre es schon besser:
Code: Alles auswählen
from itertools import izip
...
for x,y in izip(x_werte, y_werte):
print"x: %s, y: %s" % (x, y)
Oder gleich in eine Liste packen ist eigentlich noch geschickter.
Mit numpy.arange sieht das dann auch ein bisschen mehr nach Python aus.
Code: Alles auswählen
from xturtle import*
from numpy import arange
werte = []
for x in arange(-3, 3, 0.1):
y = x**2+1
werte.append((x, y))
goto(x*50, y*50)
for x, y in werte:
print "x: %s, y: %s" % (x, y)
Edit: Außerdem sollte man nie * importieren, sondern immer nur die Module, die du auch benötigst.
Und ja ich weiß, mit numpy könnte man das noch viel eleganter lösen

Verfasst: Dienstag 3. November 2009, 18:13
von Dav1d
ice2k3 hat geschrieben:Das sieht nicht sehr elegant aus...
Da hast du wohl recht.
Das mit den Tupeln hab ich gesucht, is mir aber einfach nicht eingefallen

Verfasst: Dienstag 3. November 2009, 18:24
von ms4py
Oder so (ohne numpy):
Code: Alles auswählen
def arange2(start, stop, interval):
i = start
while i <= stop:
yield i
i += interval
werte = [(x, x**2+1) for x in arange2(-3, 3, 0.1)]
Verfasst: Dienstag 3. November 2009, 18:27
von LP640
vielen dank Dav1d und ice2k3
eure lösung funktioniert (habe sie etwas "unelegant"

verändert)
allerdings möchte ich die tabelle nicht in dieser konsole, sondern mithilfe von
easygui (ich hoffe, ihr kennt das) erstellen
das sieht dann etwa so aus:
Code: Alles auswählen
from xturtle import*
import easygui as g
x_werte=[]
y_werte=[]
x=-3
while x<=3:
y=x**2+1
x_werte.append(x)
y_werte.append(y)
goto(x*50,y*50)
x=x+0.1
###for i,x in enumerate(x_werte):
### print"x:"+str(x)+" y:"+str(y_werte[i])
text=g.codebox("aaaaaaaa","bbbbbbbbb",
"""x hat den wert: """+"###"+"""
x= y=
.............
.............""")
das was nach den ### kommt soll sozusagen irgendwie in diese codebox gepackt werden
weis einer wie das gehen könnte???
mfg
LP640
Verfasst: Dienstag 3. November 2009, 18:44
von ms4py
Zu was mach ich mir eigentlich die Mühe, dir bessere Lösungen vorzuschlagen, wenn du diese eh ignorierst...
Mit meiner Lösung kannst du den Text so erstellen.
Code: Alles auswählen
text = '\n'.join('x: %s, y: %s' % (x,y) for x, y in werte)
Verfasst: Dienstag 3. November 2009, 18:46
von numerix
LP640 hat geschrieben:allerdings möchte ich die tabelle nicht in dieser konsole, sondern mithilfe von easygui (ich hoffe, ihr kennt das) erstellen
Ich "kenne" EasyGui und es ist ekelig und überflüssig.
Stattdessen kannst du z.B.
- mittels xturtle direkt auf die Zeichenfläche schreiben und dir so eine Tabelle konstruieren
- oder statt xturtle das frog-Modul einsetzen (such mal im Forum danach) und dann die Zeichenfläche entweder in eine Tkinter-GUI einbinden und dort z.B. ein Text-Widget für die Ausgabe der Wertetabelle verwenden
- oder das frog-Modul einsetzen und dort direkt in die Zeichenfläche schreiben. Das geht damit eigentlich ganz gut. Ansatz dazu (zum selber weiterentwickeln) im Code unten:
Code: Alles auswählen
from frog import Pool, Frog
blatt = Pool(width=600, height=1000)
stift = Frog(blatt, visible=False)
# Punkte berechnen
punkte = [(.1*x,(.1*x)**2+1) for x in xrange(-30,30)]
# Parabel Zeichnen
faktor = 50
x0, y0 = punkte.pop(0)
stift.pos = faktor*x0, faktor*y0
for x,y in punkte:
stift.moveto(faktor*x, faktor*y)
# Wertetabelle anzeigen
stift.pos = -50,0
zeilenhoehe = stift.textsize("1")[1]+5 # px
for punkt in punkte:
stift.y -= zeilenhoehe
stift.write("%.2f | %.2f" %punkt)
blatt.ready()
Zum frog-Modul gibt es eine ausführliche dt. Doku.
Verfasst: Dienstag 3. November 2009, 18:53
von LP640
naja also so wie ich das dann verändert habe verstehe ich selber am besten, das ergebnis ist ja das gleiche und für das, was ich damit bewirken will reicht es jedenfalls
trotzdem danke für deine verbesserungvorschläge
aber weis den jetzt jemand wie das mit easygui geht???
oh schon wieder ne neue antwort da:
das mit frog ist ja eigentlcih das selbe wie mit xturtle (frog kenn ich seit neuem auch schon)
das problem ist ja, dass die gesamte tabelle nicht sichtbar ist, da man nicht runterscrollen kann.
also am liebsten wäre mir wirklich das mit easygui wie beschrieben
hat jemand ne idee?
mfg
LP640
Verfasst: Dienstag 3. November 2009, 18:58
von LP640
oh ice2k3 tut mir echt leid

ich hab irgendwie deine Lösung mit dem code übersehen
vielen dank klappt prima
mfg
LP640
Verfasst: Dienstag 3. November 2009, 19:26
von numerix
LP640 hat geschrieben:das mit frog ist ja eigentlcih das selbe wie mit xturtle (frog kenn ich seit neuem auch schon)
Nicht dasselbe, aber vergleichbar. Ich mag den Frosch lieber als die Kröte, aber das ist sicher Geschmackssache und hat auch damit zu tun, was genau man machen möchte.
Richtig ist: Die Zeichenfläche des frog-Moduls ist nicht scrollbar, die von xturtle (= turtle für Python > 2.5) IMHO schon. Einer meiner Vorschläge war deshalb auch Tkinter-GUI mit Text-Widget für die Wertetabelle (oder auch Listbox), die sich scrollen lassen und eine eingebettete Zeichenfläche, z.B. als frog-Zeichenfläche oder auch ein reines Tkinter-Canvas. Da sind die Zeichenbefehle zwar nicht ganz so eingängig wie bei xturtle/frog, aber wenn es nur um das Zeichnen eines Graphen geht, ist da ja auch nicht viel zu machen.
Verfasst: Dienstag 3. November 2009, 21:02
von LP640
so ich bin jetzt so weit mit meiner "Tabelle":
Code: Alles auswählen
from xturtle import*
import easygui as g
funk1="x**2+1"
funk2="x**3-2"
funk3="x**4-1"
funk4="-x**2"
funk5="2"
start=-3
stop=3
step=0.01
x=start
while x<=stop:
y=x**2+1
goto(x*50,y*50)
x=x+0.1
def kogi():
a=start
while a<=stop:
yield a
a=a+step
werte=[(x,eval(funk1),eval(funk2),eval(funk3),eval(funk4),eval(funk5))for x in kogi()]
text=g.codebox("Tabelle","bbbbbbbbb","\n".join("x:"+str(x)+" y1:"+str(y1)+" y2:"+str(y2)+" y3:"+str(y3)+" y4:"+str(y4)+" y5:"+str(y5) for x,y1,y2,y3,y4,y5 in werte))
ich hab ein paar sachen leicht verändert, in der tabelle befinden sich nun ein x wert und fünf y werte
logischerweise sind diese werte zum beispiel von y3 nicht genau untereinander, da die zahlen mit ihren nachkommastellen ja nicht immer gleich lang sind.
gibt es trotzdem eine möglichkeit dies zu umgehen und die jeweiligen werte genau untereinander zu ordnen???
mfg
LP640
Verfasst: Dienstag 3. November 2009, 22:12
von numerix
LP640 hat geschrieben:gibt es trotzdem eine möglichkeit dies zu umgehen und die jeweiligen werte genau untereinander zu ordnen???

Sieh dir meinen Code an, dann weißt du wie es geht.
Verfasst: Dienstag 3. November 2009, 22:22
von LP640
tut mir echt leid, ich bin wahrscheinlich zu ****, um das zu erkennen
kannst du mir auf die sprünge helfen???
mfg
LP640
Verfasst: Dienstag 3. November 2009, 23:44
von ms4py
Du solltest grundsätzlich immer String-Formatierung anstatt String-Konkenation mit +-operator verwenden.
In diesem Fall könnte dir die Stringformatierung auch konkret weiterhelfen. Du kannst z.B. immer gleich viele Nachkommastellen pro Wert darstellen, das geht so:
Code: Alles auswählen
In [1]: a = 1.23456
In [2]: '%.2f' % a
Out[2]: '1.23'
In [3]: '%.3f' % a
Out[3]: '1.235'
Wie du siehst wird dabei auch richtig gerundet.
Und verwende dann Tabs (``\t``) und nicht mehrere Spaces für die Abstände, das ist viel eleganter.
Verfasst: Mittwoch 4. November 2009, 06:46
von LP640
vielen dank ice2k3
ich hab nur vorher nie mit diesen %-Dingern oder wie das heißt
gearbeitet.
gibt es dazu vielleicht irgendwo eine beschreibung oder ein tutorial zu???
mfg
LP640
Verfasst: Mittwoch 4. November 2009, 07:16
von DasIch
LP640 hat geschrieben:gibt es dazu vielleicht irgendwo eine beschreibung oder ein tutorial zu???
Dafür gibt es die
Dokumentation die auch gleich die neue String Formatting Methode
beschreibt.
Verfasst: Mittwoch 4. November 2009, 14:07
von LP640
Du solltest grundsätzlich immer String-Formatierung anstatt String-Konkenation mit +-operator verwenden.
In diesem Fall könnte dir die Stringformatierung auch konkret weiterhelfen. Du kannst z.B. immer gleich viele Nachkommastellen pro Wert darstellen, das geht so:
Code: (Python)
1
2
3
4
5
6
7
In [1]: a = 1.23456
In [2]: '%.2f' % a
Out[2]: '1.23'
In [3]: '%.3f' % a
Out[3]: '1.235'
Wie du siehst wird dabei auch richtig gerundet.
Und verwende dann Tabs (``\t``) und nicht mehrere Spaces für die Abstände, das ist viel eleganter.
ja das sieht damit schon besser aus allerdings sind die werte nicht immer genau untereinander, da sich auch die stellen vor dem komma voneinander unterscheiden.
gibt es dafür eine lösung???
mfg
LP640
Verfasst: Mittwoch 4. November 2009, 14:56
von numerix
LP640 hat geschrieben:ja das sieht damit schon besser aus allerdings sind die werte nicht immer genau untereinander, da sich auch die stellen vor dem komma voneinander unterscheiden.
gibt es dafür eine lösung???
Ja.
Und wo du suchen musst, ist dir schon mitgeteilt worden.
Verfasst: Mittwoch 4. November 2009, 16:12
von LP640
hallo
wenn du die beiden links von DasIch meinst, die hab ich mir beide bereits durchgelesen, konnte jetzt aber nichts finden, was mein problem löst.
mfg
LP640
Verfasst: Mittwoch 4. November 2009, 16:32
von numerix
LP640 hat geschrieben:wenn du die beiden links von DasIch meinst, die hab ich mir beide bereits durchgelesen, konnte jetzt aber nichts finden, was mein problem löst.
Meinte ich. In der Tat täten ein paar Beispiele den dortigen Erklärungen gut. Nun denn:
Code: Alles auswählen
>>> a, b = 23.123, 0.1231334
>>> print "%8.5f\n%8.5f" %(a,b)
23.12300
0.12313