Hey,

wenn du einfach möchtest dass das Fenster offen bleibt um den Output zu betrachten kannst du im Ordner wo die .py liegt einfach Shift + Rechtsklick auf eine Leere Fläche machen und dann "Eingabeaufforderung hier öffnen" klicken, in dieser rufst du dann die .py auf. Die Kommandozeile Bleibt dabei offen und wird nach dem ausführen des Scripts nicht mehr geschlossen.

Zum input:

Wenn du einfach am ende des Scripts z.b. sagst:

# hier deine Funktion je nachdem was du machst
def main():
    # do something


if __name__ == "__main__":
    main()
    # und hier am ende einfach die Input abfrage
    raw_input("") 

Sollte das eigentlich klappen, anstatt raw_input() kannst du  natürlich auch input() verwenden.

MfG

Freddy

...zur Antwort

Hey,

Die einfachste Möglichkeit wäre eval zu benutzen, aber es ist so wie es heißt, "evil" ;), denn du solltest das nicht unbedingt benutzen, denn diese Funktion konvertiert einen String in Python Code, heißt du kannst wenn du Benutzer eingaben annimmst einfach Code ausführen was Sicherheitstechnisch nicht so toll ist versteht sich ;)

die bessere Möglichkeit die aber auch nicht so gut ist ist ast zu benutzen,

also 

ast.literal_eval("30 + 30")

MfG 
Freddy

...zur Antwort
Python: mein Programm überspringt Prozesse und stoppt dann

Hallo ihr Python-Profis,

ich habe in python 3 ien kleines Spiel programmiert bei dem man Codes abgefragt bekommt und man dann die dazugehörigen Zeichen eingeben muss. Jetzt wollte ich verschiedene Spielmodi einprogrammieren, sodass man entscheiden kann ob man z. B. einen Hexadezimalcode lösen möchte oder einen Dezimalcode. Jetzt habe ich aber das Problem, dass python in der Spielmodi-Abfrage einfach nur das Programm von oben nach unten durchlaufen lässt, obwohl es einen bestimmten Prozess aufrufen sollte, und dann nachdem es die beiden Spielmodi, die ich bis jetzt einprogrammiert habe jeweils einmal durchgegeangen ist kommt nur noch die Spielmodiabfrage und die Neustartabfrage ein paar mal bis es dann gar nichts mehr macht und das Programm schliesßt.

hier ist der Programmcode(sorry für manche falsche Einrückungen aber ich weiß nicht wie ich das hier anders machen soll):

#!/usr/bin/python
# -*- coding: latin-1 -*-

from random import randint
import string

def Spielmodus():

    eingabeSpielmodus=input('welchen Spielmodus wollen sie Spielen?\n1: Hexadezimal -> Alphabet\n2: Alphabet -> Hexadezimal\n')
    print ('Sie haben "' + eingabeSpielmodus + '" eingegeben')
    if eingabeSpielmodus == 1: Ratespiel1();
    elif eingabeSpielmodus == 2: Ratespiel2();
    else:
            print("bitte geben sie eine der Zahlen ein die vor dem Spielmodus steht.");
            Spielmodus();

def Neustart():
            
    eingabe2=input('Wollen sie es erneut versuchen? [j/n]\n'); print("Sie haben " + eingabe2 + " eingegeben")
    if eingabe2 == "j": Ratespiel1()
    elif eingabe2 == "n": print("Auf wiedersehen"); exit()
    else:
            print('Bitte geben sie "j"(ja) oder "n"(nein) ein');
            Neustart();
            


def Ratespiel1():

    print("Welches Zeichen ist das(Hexadezimalsystem->Alphabet)?")
    Nummer =  randint(ord("A"), ord("z"))
    print (Nummer)
    eingabe=input('Geben Sie Ihre Vermutung ein\n')
    if ord(eingabe) == Nummer:
            print("Ihre Antwort ist richtig");
            Neustart();
    else:
            print("Ihre Antowrt ist Falsch. Richtige Antwort:" + '"' + chr(Nummer) + '"');
            Neustart();

def Ratespiel2():

    print("Welche Zahl ist das(Alphabet->Hexadezimalsystem)?")
    Nummer2 =  randint(ord("A"), ord("z"))
    print (chr(Nummer2))
    eingabeRS2=input('Geben Sie Ihre Vermutung ein\n')
    if (str(eingabeRS2))== (str(Nummer2)):
            print("Ihre Antwort ist richtig");
           Punkte = Punktestand(Punkte);
            Neustart();
    else:
            print("Ihre Antowrt ist Falsch. Richtige Antwort:" + '"' + (str(Nummer2)) + '"');
            Neustart();
Spielmodus()
Ratespiel1()
Ratespiel2()
Neustart()
...zum Beitrag

Hey,

Problem hat sich erledigt oder ist noch vorhanden?

MfG

Freddy

...zur Antwort

Hey,

Was machst du da?! nicht böse gemeint aber irgendwie... komisch :D

Also erstmal, man benennt keine Variable wie eine Funktion oder Klasse oder so, sonst überschreibst du das Objekt mit dem Inhalt der variable und kannst im danach folgenden Code die Funktion nicht mehr benutzen, das wird auch dein Problem sein, denn du Arbeitest mit Rekursion was mich zur nächsten Frage bringt.

Musst du mit Rekursion arbeiten? ist evtl nicht so schön und ich denke deine Funktion ist in eine Endlosschleife gefangen, wenn ich ihn mir angucke,

du musst erstmal anstatt des

countdown_eingabe = input("eingabe\n")

# das hinschreiben

countdown_eingabe(n=input("eingabe\n"))

denn wenn du die Funktion Aufrufen möchtest, darfst du nicht einfach das Objekt überschreiben sondern einen Funktionsaufruf machen, jetzt sollte der Code wenigstens Laufen,

Jetzt zum Thema Rekursive Endlosschleife, du reduzierst n jedesmal um 1 bis es 0 ist, dann rufst du die Funktion auf mit der einzugebenden Zahl, dann geht alles wieder von vorne los ;)

MfG

Freddy

...zur Antwort

Kleiner Nachtrag, du könntest z.b. mit 

zahl = input("zahl: ")
if isinstance(zahl, float):

prüfen ob die eingegebene Zahl ein Float ist 


...zur Antwort

Hey, 

laut Aufgabenstellung ist es egal ob du Integer eingeben lässt. Ein Int konvertiert in einen Float ist ja nur von 1 auf 1.0 

Jeder Int kann auch ein Float sein, aber nicht anders herum (außer du rundest dann bzw. wenn es konvertiert wird, wird gerundet ;) )


MfG 

Freddy

...zur Antwort

Hey, 

PEP8 lässt grüßen ;)

Also bei genau deinem aufbau lässt sich gut eine Funktion benutzen in der die Abfrage stattfindent,

also so in etwa:

def get_number(id):
try:
output = input("Zahl %s:" % id)
int(output)
except (ValueError, NameError):
print "Invalid input"
return None
if output in xrange(1, 7):
return output
elif (int (output) >6):
print ("Die Zahl ist zu hoch! Sie muss zwischen 1 und 6 liegen!")
return None
elif (int (output) <1):
print ("Die Zahl ist zu niedrig! Sie muss zwischen 1 und 6 liegen!")
return None

print ("Tippe drei Zahlen zwischen 1 und 6")
results = {}
own_id = 1
while True:
number = get_number(id=own_id)
if number is None:
continue
results["zahl%s" % own_id] = number
if own_id == 3:
own_id = 1
else:
own_id += 1
print results

Den Teil denn ich Hinzugefügt habe ist Syntaktisch auf 2.7.11, sollte aber nicht schwer zu übertragen sein :)

Da ich nicht weiß was du genau vor hast, weiß ich nicht ob dir das so was bringt, funktionieren tut es ;) Ach und ich habe noch eingebaut das man nur Integer eintragen kann.

Bei Fragen Einfach melden :D
Hoffe das hilft.


EDIT: Und ich sehe gerade die einrückungen buggen rum :D

MfG
Freddy


...zur Antwort

Hey,

Du kannst deine Python Datei in der anderen Importieren, also in der in der du die Variable haben möchtest Importierst du die Datei in der die Variable steht.

Angenommen du hast die Datei variablen.py und programm.py dann schreibst du in die programm.py

import variablen
# hier kannst du dann die variable benutzen
print variablen.meine_variable

Alternativ kannst du auch sagen 

from variablen import meine_variable
print meine_variable

Falls du z.B. nur die eine haben möchtest

MfG

Freddy

...zur Antwort

Hey,

das macht man wenn man das was in der If-abfrage steht nur ausführen möchte wenn man das Skript direkt startet nicht Importiert. Alles was darin steht wird also nicht aufgerufen wenn man die Datei Importiert. Du fragst also ab ob deine Datei das "Hauptprogramm"´ist

Mit der abfrage fängst du also ab wenn du das "Modul" (also deine Datei) importierst das dieser teil nicht ausgeführt wird da du ja nur Funktionen oder Klassen daraus benutzen willst und nichts direkt ausführen möchtest. 

MfG

Freddy

...zur Antwort

Hey,

Also "Gooooooogle" trifft es soweit schon ganz gut. ;)
Das Problem steht ja schon in der Fehlermeldung:
du versuchst einen String (Zeichenfolge, z.B. a = "4") mit einem INT (Ganzzahl; z.B. b = 5) zu addieren oder subtrahieren, heißt, du musst deine Variablen einfach in den richtigen Typ (z.B. INT) konvertieren. Das lässt sich ganz einfach googlen ;)

Je nachdem wie du die Variablen befüllst gleich zu Anfang.

MfG
Freddy

...zur Antwort

Hey,

Du sagst einfach 

print var1 + " " + var2

zu empfehlen wäre es auch z.B. Platzhalter zu benutzen also:

print "%s %s" % (var1, var2)

der vorteil gegenüber + ist dass du das was in var1 und var2 steht direkt in ein string konvertierst (dafür steht das "s" in "%s")

Wenn du nämlich sagst var1 + var2, und in var1 ein int drin steht und in var 2 ein string, gibt es einen Fehler da du ja versuchst eine zahl mit einem String zu addieren.

MfG

Freddy

...zur Antwort

Hey,

Ganz einfach mit der build-in Funktion type?! :D

a = 4.2
print type(a)

Result: <type 'float' >

Wenn du aber wirklich direkt eine abfrage machen möchtest kannst du natürlich isinstance() benutzen wo du aber explicit den Dateitypen auswählen musst.

Also wenn du nur den Typ herausfinden willst ist type besser da du den Typ jeder Variable herausfinden kannst ;)

MfG
Freddy

...zur Antwort

Hey,

Wie schon gesagt, oder auch nicht :D, kann man Python für sehr vieles benutzen. Ich Persönlich habe auch schon unterschiedliches mit Python angestellt.  
z.B. im Beruflichem Umfeld habe ich diverse Netzwerk Tests,also zum analysieren gebaut. Da ist vieles dabei, zum beispiel DNS resolving, DHCP tests, FTP, CIFS/SMB, Email (SMTP, POP, IMAP usw.) und weitere.

Du kannst mit Python alle möglichen Schnittstellen im Backend erstellen und auch diverse Tools. Und für Mathe ist Python auch super geeignet.

Ich selber bin momentan Privat dabei einen "Speech recognition assistant" (also einen Sprach Assistenten)  mit Python zu Programmieren, also so Smart-Home like aber das ich halt selber weiß was das Programm macht und kann und ich kann es natürlich nach belieben Erweitern oder verbessern.

ist halt gut mit einem Raspberry pi zu programmieren was auch diverse Möglichkeiten beherbergt.

Hoffe ich konnte im Ansatz helfen ;)

MfG

Freddy

...zur Antwort

Hiho,

also unabhängig von deinem Speziellen Datum mal ein Gedanken anstoß da sowas den Lerneffekt fördert, ich denke da kommt man ganz gut auf ein Stück Code :D

Der Unixtimestamp ist ja nur die Anzahl der Sekunden seit dem 01.01.1970
heißt du musst nur die Different zwischen deinem Datum und und 1970 berechnen (datetime(1970, 1, 1)) und dann das Ergebnis mittels .total_seconds() ausgeben.

Bei dieser Vorgehensweise musst du aber auch auf Zeitzonen achten ;)

MfG Freddy 

...zur Antwort

Hiho,

Von der Benamsung mal abgesehen :D 

from random import randint

def main():
status = True
operators = ["-", "+"]
score = 0
total_exercises = 0
print "Write \"quit\" to quit"
min_value = int(raw_input("min value: "))
max_value = int(raw_input("max value: "))
exercise_limit = int(raw_input("Number of exercises: "))

while status:
if total_exercises == exercise_limit:
print "Total correct exercises: %s of %s" % (score, total_exercises)
break calculation = "%s %s %s" % (randint(min_value, max_value), operators[randint(0, 1)], randint(min_value, max_value))
total_exercises += 1
user_result = raw_input("What is %s: " % calculation)
result = eval(calculation)
if user_result.upper() == "QUIT":
status = False
try:
user_result = int(user_result)
except ValueError:
print "Invalid input!"
continue if user_result == result:
score += 1
print "correct"
print "current score: %s" % score
print "-" * 40

main()

Der Code ist jetzt nicht der Geilste und man kann noch VIEL einbauen aber ich denke das Funktioniert ganz gut (hatte 5 vo 5 richtig beim ersten Test ;) )

Aber um das gleich mal zu sagen! benutze am besten NIEMALS die eval() Funktion da du damit Strings in Pythoncode interpretierst :D und bei z.B. Benutzer eingaben kann sowas SEHR schlecht sein :D
Basierent auf 2.7.11

MfG
Freddy

...zur Antwort

Hiho,

Wie schon geschrieben eignet sich py2exe gut um Python Scripte in EXE Datein zu kompilieren (vor allem da es hier eine einzige Datei EXE Datei erstellt) Wenn du z.B. das Modul CXFreeze benutzt hast du viele zusätzliche Datein zu der EXE anstatt nur der einzelnen EXE was etwas unkomfortabler ist aber Funktioniert

Das PROBLEM bei py2exe ist das es nicht unbedingt OS unabhängig ist (auch unter Windows) wenn du z.B. ein Python Script unter WIN10 kompilierst läuft es nur unter WIN10 aufwärts und nicht mehr darunter. Das war bei mir auch mal ein Problem.
(Heißt VM mit altem OS (XP) und dann kompilieren dann läuft es auf allen aufwärts ^^)

MfG

Freddy

...zur Antwort

Hiho,

Nochmal als anhang :D :

Also eigentlich sollte das so klappen solange bei test Groß- und Klein-schreibung beachtet ist. Das würde so z.B. auch nicht funktionieren wenn der Inhalt den du suchst nur test beinhaltet und nicht nur test ist also z.B steht in readlines() -> ["testuser", "admin",...] anstatt test dann klappt der einfache aufbau mit if "test" in ...readlines() nicht da bräuchtest du eine schleife ODER halt __contains.
Es kann auch sein das der Inhalt deines Files irgendwelche Escape Sequences beinhaltet (also \n \r \t usw. gehe ich jetzt aber mal nicht von aus)

Wenn kannste dir ja die Strings einfach mal mit repr("mystring") ausgeben lassen.

MfG 

Freddy

...zur Antwort