ein paar Anfängerfragen zu Python

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.
Hero2
User
Beiträge: 19
Registriert: Freitag 16. April 2010, 20:13

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
Zuletzt geändert von Hero2 am Samstag 17. April 2010, 11:18, insgesamt 2-mal geändert.
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.
Hero2
User
Beiträge: 19
Registriert: Freitag 16. April 2010, 20:13

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Hero2
User
Beiträge: 19
Registriert: Freitag 16. April 2010, 20:13

2,3 sollte meine tupel eingabe sein.

Gebe ich das falsch ein ?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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'
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Hero2: Es gibt übrigens ein datetime Modul
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich würd's (in Python 3.x) so machen:

Code: Alles auswählen

print(map(int, input("Tupel (mit Komma getrennt): ").split(",")))
Stefan
Hero2
User
Beiträge: 19
Registriert: Freitag 16. April 2010, 20:13

Danke erst mal für die ganzen antworten. Werde gleich mal noch nen paar sachen versuchen. Ich benutze nebenbei Phyton 3.0.

MFG

HERO2
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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

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.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

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?
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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

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.Ä.
Hero2
User
Beiträge: 19
Registriert: Freitag 16. April 2010, 20:13

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
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
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.
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.
Hero2
User
Beiträge: 19
Registriert: Freitag 16. April 2010, 20:13

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.
Hero2
User
Beiträge: 19
Registriert: Freitag 16. April 2010, 20:13

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 ()
Antworten