Seite 1 von 2

ein paar Anfängerfragen zu Python

Verfasst: Samstag 17. April 2010, 10:36
von Hero2
Hallo

BIn grad neu bei ich ins Forum gestoßen, hab mit aber schon 2-3 dinge hier durchgelesen und die Suchfunktion benutzt, aber zu meinem Problem keine Lösung gefunden.

1.: Wie lässt man unter Vista die Konsole offen ? ist das möglich ?

2.: Kann es sein, dass .pyw nicht unter Windows Vista 64 startet ? Ich kriege nur die normalen mit der konsole .py gestartet.

3.: Nun zu was Interesantes :

Ich hab mich entschieden Eclipse zu benutzen. Hab das mit PyDev auch gut hinbekommen, es gibt aber einen ganz merkwürdigen Fehler :

Ziel : Ich will ein Tupel eingeben und mit denen dann was errechnen.

Unter IDLEE hab ich es folgendermaßen gelöst bekommen :
(a, b, c) = eval(input("Datum: "))

y = c - (14 - b) // 12
x = y + y // 4 - y //100 + y // 400
m = b +12 * ((14 - b) //12) - 2
d = (a + x + (31 * m ) //12) % 7

Unter Eclipse bekomme ich aber mit genau dem gleichen code folgende Fehlermeldung : unexpected EOF while parsing

Wenn ich hingegen den Code folgendermaßen ändere (jede eingabe einzeln mache), dann geht es auch unter Eclipse.

a = int ( input("Tage ="))
b = int ( input("Monate ="))
c = int ( input("Jahre ="))

y = c - (14 - b) // 12
x = y + y // 4 - y //100 + y // 400
m = b +12 * ((14 - b) //12) - 2
d = (a + x + (31 * m ) //12) % 7

Kann mir jemand sagen, warum das bei dem einen geht und bei dem anderen nicht ? hat jemand nen lösungvorschlag ?

Ziel ist halt die Implementierung MIT Tupel.

MFG

HERO2

Verfasst: Samstag 17. April 2010, 11:03
von BlackJack
Die Sprache heisst Python und nicht Pyton wie in der Überschrift von Deinem Beitrag. ;-)

1. Starte das Skript in einer offenen Konsole, dann bleibt die auch offen. Alles andere ist IMHO keine gute Idee.

3. Vergiss `eval()`. Da kann der Anwender beliebige Ausdrücke eingeben, die ausgeführt werden. Das ist ein Sicherheitslücke und selbst wenn der Anwender nichts böses will, ist es schwer mit falschen Eingaben umzugehen.

Wenn Du die Teile nicht einzeln eingeben lassen willst, dann schreib Dir eine Funktion die ein Datum parsen kann.

Du solltest Dir gleich vernünftige Namen angewöhnen. `a`, `b`, und `c` sind das in diesem Kontext ganz bestimmt nicht.

Von PyDev würde ich zum ausprobieren von Konsolenanwendungen Abstand nehmen, denn da gibt's immer mal wieder mal wieder Probleme weil sich die "Konsole" in Eclipse nicht so verhält wie eine Echte.

Verfasst: Samstag 17. April 2010, 11:17
von Hero2
Danke für die schnelle Antwort. und sorry für den Rechtschreibfehler. Hab da ne große schweche ....

1.: Gut da kann man dann nicht's machen danke.

3.: Ja mit den namen hast du recht. Das Programm habe ich aber spät abends geschrieben und mir ist erst später aufgefallen, dass nen fehler in der Berechnung war, deswegen musste ich es nochmal ändern, deswegen a,b,c, ansonten haste aber recht.

Gut das mit der Konsole werd ich mmir merken.

Nun nochmal 1 fragen die mir bei deinem Post gekommen sind :

Ich kann in eclipse gar keine Tuper eingeben. Selbst wenn ich sozusagen nur sowas mache :

(d,x) = int (input("d,x : "))

print (d,x)

bekomme ich nur die Fehlermeldung : ValueError: invalid literal for int() with base 10: '2,3 '

Leigt das echt an eclipse, oder habe ich was falsch eingestellt dort ?

MFG

ALIAS

Verfasst: Samstag 17. April 2010, 11:51
von cofi
Hero2 hat geschrieben:bekomme ich nur die Fehlermeldung : ValueError: invalid literal for int() with base 10: '2,3 '

Leigt das echt an eclipse, oder habe ich was falsch eingestellt dort ?
Weder noch. `2,3` ist eben kein valides Literal für `int`. Übrigens auch nicht für `float`, da Punkte, statt Kommata verwendet werden.

Verfasst: Samstag 17. April 2010, 11:58
von Hero2
2,3 sollte meine tupel eingabe sein.

Gebe ich das falsch ein ?

Verfasst: Samstag 17. April 2010, 12:22
von ms4py
Hero2 hat geschrieben:2,3 sollte meine tupel eingabe sein.

Gebe ich das falsch ein ?
Wenn du Python 2.x verwendest, solltest du von "input" genauso die Finger lassen wie von "eval" und Eingaben als String mit "raw_input" lesen.
Und diesen String dann verarbeiten. Beispiel:

Code: Alles auswählen

>>> a, b = raw_input('input: ').split(',')
input: 2,3
>>> a
'2'
>>> b
'3'

Verfasst: Samstag 17. April 2010, 12:56
von gkuhl
@Hero2: Es gibt übrigens ein datetime Modul

Verfasst: Samstag 17. April 2010, 12:59
von sma
Ich würd's (in Python 3.x) so machen:

Code: Alles auswählen

print(map(int, input("Tupel (mit Komma getrennt): ").split(",")))
Stefan

Verfasst: Sonntag 18. April 2010, 10:59
von Hero2
Danke erst mal für die ganzen antworten. Werde gleich mal noch nen paar sachen versuchen. Ich benutze nebenbei Phyton 3.0.

MFG

HERO2

Verfasst: Montag 19. April 2010, 08:26
von mkesper
Python 3.0 ist obsolet, installiere besser 3.1. (Wundert mich, dass jemand noch die 3.0 findet, auf der Python-Homepage ist sei jedenfalls nicht direkt verlinkt).

Verfasst: Montag 19. April 2010, 08:32
von Darii
Hero2 hat geschrieben:2,3 sollte meine tupel eingabe sein.

Gebe ich das falsch ein ?
Na du schreibst ja auch „int“ davor. Also übergibt er eine Eingabe an int das versucht das ganze als ganze Zahl zu interpretieren.

Verfasst: Montag 19. April 2010, 14:02
von Goswin
BlackJack hat geschrieben:Vergiss `eval()`. Da kann der Anwender beliebige Ausdrücke eingeben, die ausgeführt werden. Das ist eine Sicherheitslücke.
Ich benutze 'eval(arith_exp)' in einer meiner GUIs, weil das Parsen und robuste Auswerten von arithmetischen Ausdrücken auch mit der Hilfe vom re-Modul schwer ist und viel Code benötigt. Ich habe es versucht und dann aufgegeben, wobei ich mir dachte, falls der Benutzer Blödsinn eingibt wird Python mir die Arbeit abnehmen, ihn darauf hinzuweisen.

Ist die Sicherheitslücke wirklich so dramatisch?

Verfasst: Montag 19. April 2010, 14:27
von gkuhl
Ja!

Code: Alles auswählen

def dangerous():
    print 'I will destroy you!!!'

instruction = raw_input('...: ')
eval(instruction)

Code: Alles auswählen

~$ python evil.py
...: dangerous()
I will destroy you!!!

Verfasst: Montag 19. April 2010, 14:31
von Darii
Goswin hat geschrieben:Ist die Sicherheitslücke wirklich so dramatisch?
Nein ist sie nicht, sofern die Anwendung nur Lokal und mit dem Rechten des aktuell angemeldeten Benutzers ausgeführt wird. Aber verwende so etwas niemals in einer Webanwendung o.Ä.

Verfasst: Montag 19. April 2010, 15:10
von Hero2
So ich hab mal noch nen paar fragen ;).

1.) Wie genau funktionier in Python map ?
In haskell ging : map (*2) [1,2,3]
und man bekam : --> [2,4,6]
In Python krieg ich das nicht initialisiert. kann mir jemand mal das beispiel hier in python sagen ?

2.) Gibt es einen ENDE , STOPP befehl, der das Programm KOMPLETT beendet? Ich hab manschmal mit ner schleife probleme, weil ich sie sozusagen, weiß nicht wie ich es besser ausdrücken kann : doppelt abfragen muss. Das geht auch alles und klapt und ich komm dann in ein definition wo steht :
def zuviel():
print ("Hier endet der lauf")

Ich hab darüber aber noch ne schleife, die nicht richtig endet, deswegen hätte ich unter print gerne sowas wie :
quit, ende,stopp.

Weiß da einer was ?

Ps.: Hab was falsch eingegeben, ich hab das neuste Python 3.1

MFG

Hero2

Verfasst: Montag 19. April 2010, 15:13
von jbs

Code: Alles auswählen

from operator import mul
from functools import partial
double = partial(mul,2)
map(double, (1,2,3))
suchst du sowas wie break oder raise?

Verfasst: Montag 19. April 2010, 16:16
von BlackJack
@Hero2: Ein Beispiel für `map()` findest Du in den Folien zur ersten Vorlesung auf Seite 42. :-)

Neben ``break`` und ``raise`` kann ``return`` auch manchmal nützlich sein um Schleifen zu verlassen.

Verfasst: Montag 19. April 2010, 16:26
von lunar
@Goswin: Bei lokalen Anwendungen ist das keine Sicherheitslücke. Trotzdem würde ich einen eigenen Parser speziell für arithmetische Ausdrücke implementieren. Python parst mehr als arithmetische Ausdrücke, was für Benutzer verwirrend sein kann, und Python erzeugt nicht immer Fehlermeldungen, die für einen Endbenutzer, der nicht Programmierer ist, akzeptabel sind.

Verfasst: Montag 19. April 2010, 16:45
von Hero2
Danke nochmal für die schnellen anweisungen .... hab sowas wie break gesucht ...
Geht nun ;)
Danke, wenn ich nochmal fragen habe poste ich immer gerne hier ;) Echt tolles und schnelles Forum.

Verfasst: Montag 3. Mai 2010, 17:07
von Hero2
Hallo

ich bins's mal wieder und hab mal wieder ne neue frage :

Ich kann nun ganz gut in phyton programieren, dass was ich aber irgendwie noch gar nicht verstehe ist die Return funktion.

was ist mein Problem : Ich schreib meine Programme immer total verschachtelt. Lösung : Hoffentlich durch euch besseres verständnis der Return funktion.

Unten also mein beispielcode ist nun mal ganz Simpel

Es wird zwar schau aufgerufen, schau wirft mir aber nicht n zurück, obwohl n sogar global ist. Was mache ich falsch ?
Wenn ihr ein besseres, kürzeres beispiel habt für die return funktion, so könnt ihr auch diese nehmen.

MFG

[quote]

Code: Alles auswählen

from random import randrange

def Schau(a,n):   # Bekommt ein Zähler und eine Liste
    x = randrange(10)  # Erzeugt aus 10 zahlen 1 zufällige
    if (x in a):               
        return (n)            # gibt den Zähler zurück
    else:
        a.append(x)        # zähler wird erhöt, x wird an die liste gepackt 
        n = n + 1            # und rekusiv neu aufgerufen
        Schau(a,n)

def start():
    global n
    n = 0
    Schau([],n)
    print (n)

start ()