Etwas erneut ausführen oder zurückspringen

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
Hochstetter
User
Beiträge: 4
Registriert: Donnerstag 25. März 2021, 18:50

Hallo,

ich bin fast ganz neu. Ich habe vor einer halben Ewigkeit schon einmal ein Buch aus der Bücherei über Programmieren (nur!) gelesen, aber das zähle ich nicht. Gestern habe ich mich dann aus Langeweile noch einmal daran getraut und einen tollen Kurs online gefunden.

Jetzt frage ich mich die ganze Zeit, wie ich in ein Programm einen Mechanismus einbauen kann, dass eine Aktion erneut ausgeführt wird. Zu letzt jetzt für einen Lottozahlen Generator. Ich würde gerne zum Beispiel Lotto eintippen und dann weiß das Programm, dass es mir noch weitere 6 Gewinnzahlen generieren und ausgeben soll.

Bei dem ersten Programm mit dem Quadratzahlen Rechner hat das so gut funktioniert. Da gebe ich qz(3) ein und er druckt 9 und danch kann ich immer wieder qz(x) eingeben. Auch der Witz lässt sich beliebig oft mit "witz" ausgeben. Aber das scheint man nicht übertragen zu können, weil es anders funktioniert.

Ich hänge einmal beide Codes an, damit man sieht, was ich meine.

Liebe Grüße und vielen Dank im Voraus

Code: Alles auswählen

# Lottozahlen vorhersagen lassen
#
# Dieses Programm simuliert 6 Gewinnzahlen aus 49.
#
# 
# Schritt 1
# Zufallsgenerator bereitstellen.
#
import random
#
# Schritt 2 
# Lottozahlen von 1 bis 49 erzeugen.
#
lottozahlen_alle = list(range(1,50,1))
#
# Schritt 3
# aus den Lottozahlen 6 Gewinnzahlen generieren
# 
#
lottozahlen_gewinner = random.sample(lottozahlen_alle, 6)
#
# Schritt 4
# Gewinnzahlen aufsteigend sortieren.
#
lottozahlen_gewinner.sort()
#
# Schritt 5
# Gewinnzahlen und erklärenden Text ausgeben.
#
print('Die nächsten Lottozahlen könnten lauten:')
print(lottozahlen_gewinner)
Der Quadratzahlen Rechner, mit dem ich etwas gespielt und experimentiert habe.

Code: Alles auswählen

print("Hallo Nutzer!")
print("Hier geht es um Quadratzahlen.")
print("Bitte einfach qz und die Zahl in Klammern eingeben und ich quadriere die Zahl für dich.")
print("Wenn du dpl und eine Zahl eingibst, kann ich sie auch verdoppeln.")
print("Viel Spaß mit Zahlen.")
print("PS: Wenn du noch ein Geheimnis erfahren möchtest, schreibe nachricht. Für einen Witz schreibe witz.")

nachricht = "Es gibt kein Geheimnis. Aber verrat es keinem."
witz = "Es gibt 10 Arten von Menschen. Die einen verstehen binäre Zahlen. Die anderen nicht."
Witz = "Ich habe gesagt, dass du witz klein schreiben sollst. Hör doch bitte zu!"
Nachricht = "Manche lernen es nie."

def qz(zahl):
    print(zahl*zahl)

def dpl(zahl):
    print (zahl+zahl)
Ich habe gerade noch mal gesehen: Das andere Programm war eine Zufallszahl zwischen 1 und 100 erraten. Da wäre es ja wirklich schön, wenn man ein neues Spiel starten könnte, wenn ein Spiel beendet ist. (Aber den Code lasse ich mal, damit das hier nicht überfrachtet wird. Falls es ich eine Lösung für das eine habe, kann ich das auch wahrscheinlich übertragen.)
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Willkommen im Forum, was du suchst nennt sich "Schleife". Dazu solltest du recht viele Beispiele finden können.
Suchwörter wären "for Schleife" und "while Schleife".
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hochstetter: Anmerkungen zum Lottozahlen-Programm:

Der Defaultwert der Schrittweite bei `range()` ist 1, den braucht man nicht übergeben.

Man muss auch gar keine Liste aus dem `range()`-Objekt machen, denn das ist bereits eine Sequenz von Zahlen und `random.sample()` erwartet genau das: eine Sequenz von Werten, also einen Wert mit einer Länge, wo man mittels Index auf die Elemente zugreifen kann:

Code: Alles auswählen

In [112]: grundmenge = range(1, 50)                                             

In [113]: len(grundmenge)                                                       
Out[113]: 49

In [114]: grundmenge[0]                                                         
Out[114]: 1

In [115]: grundmenge[1]                                                         
Out[115]: 2

In [116]: grundmenge[10]                                                        
Out[116]: 11

In [117]: random.sample(grundmenge, 6)                           
Out[117]: [28, 41, 44, 26, 2, 18]
In den Kommentaren sollte man die nummerierten Schritte weg lassen. Wenn man da etwas ändert — Schritte zusammenfast, aufteilt, oder anders anordnet, hat man viel lästige Arbeit mit dem umnummerieren in den Kommentaren.

Und man muss auch nicht jedes kleine Zwischenergebnis an einen Namen binden.

Code: Alles auswählen

#!/usr/bin/env python3
"""
Lottozahlen vorhersagen lassen

Dieses Programm simuliert 6 Gewinnzahlen aus 49.
"""
import random


def main():
    print("Die nächsten Lottozahlen könnten lauten:")
    print(sorted(random.sample(range(1, 50), 6)))


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Hochstetter
User
Beiträge: 4
Registriert: Donnerstag 25. März 2021, 18:50

Es funktioniert jetzt, so wie ich es mir vorgestellt habe. :)

Ich hatte zwar noch zwei, drei Fehlermeldungen, die ich vielleicht vorher schonn hatte. Aber mit dem Wissen nicht komplett auf den Holzweg sein zu können, habe ich mich dann getraut mir anzulesen, was da schief gelaufen ist und wie man es behebt. Das war vor allem, dass ich Zeile 3 vergessen hatte und dass ich den Text zu großzügig eingerückt hatte.

Das mit dem Nummerieren wäre mir fast selber aufgefallen, weil ich ursprünglich den ersten Schritt vergessen hatte und den dann zunächst Schritt null genannt habe, aber als ich es dann im Forum posten wollte, dachte ich mir, dass ich das nicht so lassen kann und habe alles umnummeriert. :mrgreen: Eigentlich insgesamt sinnlos.

Edit: Ich glaube, jetzt war ich zu schnell. Im Live Programming Mode gibt er die Begrüßugng aus. Wenn ich über cmd.exe öffne, fehlt die Begrüßung. Das ist kein Weltuntergang, aber ich weiß gerade nicht, weshalb das so ist.

Code: Alles auswählen

# -*- coding: utf-8 -*-
import random
nutzereingabe = ""
print: """Hallo, ich bin ein Lotto Simulator.
Wenn ich die Lottozahlen simulieren soll,
tippe bitte Lotto ein.
Wenn du Ende eintippst, beendet das Programm."""
while nutzereingabe != "ende":
    nutzereingabe = ""
    while nutzereingabe == "":
        nutzereingabe = input("""Möchtest du die Lottozahlen erfahren?
        Antworte nicht Ja sondern Lotto.""")
    nutzereingabe = nutzereingabe.lower()
    nutzereingabe = "lotto"
        # Lottozahlen vorhersagen lassen
        # Dieses Programm simuliert 6 Gewinnzahlen aus 49.
    lottozahlen_alle = list(range(1,50))
    lottozahlen_gewinner = random.sample(lottozahlen_alle, 6)
    lottozahlen_gewinner.sort()
    print('Die nächsten Lottozahlen könnten lauten:')
    print(lottozahlen_gewinner)
    print: "Nochmal? Mit der Eingabe Lotto erhälst du neue Gewinnzahlen."
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Was soll den ›print:‹ denn für eine Syntax sein? Das gibt einen SyntaxFehler. Also nicht nur die Begrüßung fehlt.

Wenn man einen Dummy-Wert braucht, um eine while-Schleife zu starten, dann hat man eigentlich eine while-True-Schleife, die man per break an der passenden Stelle verläßt.

Mit der Nutzereingabe machst Du gar nichts, weil Du `nutzereingabe` danach immer auf "lotto" setzt.

Dass man list nicht braucht, hat Dir __blackjack__ ja schon geschrieben.

Code: Alles auswählen

import random

ALLE_LOTTOZAHLEN = range(1,50)

print("""Hallo, ich bin ein Lotto Simulator.
Wenn ich die Lottozahlen simulieren soll,
tippe bitte Lotto ein.
Wenn du Ende eintippst, beendet das Programm.""")
while True:
    while True:
        nutzereingabe = input("Möchtest du die Lottozahlen erfahren?\n"
            "Antworte nicht Ja sondern Lotto.")
        nutzereingabe = nutzereingabe.lower()
        if nutzereingabe in ['lotto', 'ende']:
            break
        print("Bitte Lotto oder Ende eingeben.")
    if nutzereingabe == "ende":
        break
    # Lottozahlen vorhersagen lassen
    # Dieses Programm simuliert 6 Gewinnzahlen aus 49.
    gewinn_zahlen = sorted(random.sample(ALLE_LOTTOZAHLEN, 6))

    print('Die nächsten Lottozahlen könnten lauten:')
    print(gewinn_zahlen)
    print("Nochmal? Mit der Eingabe Lotto erhälst du neue Gewinnzahlen.")
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Die Zeile heißt ja gar nicht `print:`, deshalb ist das kein Syntaxfehler (außer mit älteren Pythonversionen). Stichwort "type annotation".
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Die Zeile heißt ja gar nicht `print:`, deshalb ist das kein Syntaxfehler (außer mit älteren Pythonversionen). Stichwort "type annotation".
??? - erklär' mal bitte genauer, was du damit sagen wolltest.

Gruß, noisefloor
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was Type Annotations sind weiß ich schon - nur ist `print: """hier steht text"""` auch mit Type Annotations kein valides Python.

Gruß, noisefloor
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@noisefloor: Doch. Das deklariert `print` als eine Variable vom Typ `"hier steht text"`. Steht so im PEP, den ich verlinkt habe, und mein Python-Interpreter akzeptiert das auch.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

noisefloor hat geschrieben: Sonntag 28. März 2021, 12:24 Hallo,

was Type Annotations sind weiß ich schon - nur ist `print: """hier steht text"""` auch mit Type Annotations kein valides Python.

Gruß, noisefloor
Welche (ziemlich alte) Version von Python benutzt du?
Hochstetter
User
Beiträge: 4
Registriert: Donnerstag 25. März 2021, 18:50

Ich glaube inzwischen, dass ich noch zu weit am Anfang bin.

Ich habe das auch immer wieder verändert und ausprobiert. Leider kann ich nicht mehr erklären, warum ich welches Zeichen gemacht habe.

Was mir nicht gefällt, ist, dass es nicht auf die Eingabe reagiert, sondern auf jede Eingabe gleich reagiert.

Eigentlich macht das Programm schon das, was mir am wichtigsten war, aber alles, was man versucht in den Code mitzuteilen, sollte idealerweise auch die Reaktion auslösen, die man beabsichtigt hat.

Ich komme nicht bei allem mit, was ihr schreibt, das tut mir leid. Ich vermute, dass es am besten ist, wenn ich erst einmal versuche den Kurs wie vorgesehen zu bearbeiten. Ich hoffe und vermute, dass der Kurs, mit dem ich eigentlich gut zurecht komme, das Thema noch anscheniden wird. Das war wahrscheinlich von mir etwas voreillig, sofort noch eine eigene Idee umsetzen zu wollen. Ich muss auch einsehen, dass ich noch am Anfang bin.

Ich bin sogar am überlegen noch mal von vorne mit dem Kurs anzufangen, um mir klarer zu bekommen, was ich überhaupt bisher gelernt habe und strukturierte Notizen zu machen.

Mit dem Doppelpunkten weiß ich nicht mehr, ob ich die gesetzt habe oder was ich damit beabsichtigt habe. Ich habe auch vieles ausprobiert und zusammenkopiert ohne es genau zu verstehen. Ich habe gehofft, wenn es dann klappt, kann ich auch verstehen, weshalb genau.

Es kann auch sein, dass Atom das mit Autokorrektur/Verfollständigung verändert hat. Ich bin mit dem Programm noch nicht warm geworden.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hochstetter: Du kommst vielleicht auch deswegen nicht mit bei der Diskussion, weil Du etwas gemacht hast was selbst langjährige Python-Programmierer auf den ersten Blick für einen Syntaxfehler halten. Ich bin da auch drauf reingefallen und hätte spontan gesagt der Code läuft überhaupt nicht weil der Compiler meckert.

Und zwar bei ``print: "Irgendein Text"``. Das wäre ”früher” auch ein Syntaxfehler gewesen. Bevor Python die besch…eidene (optionale) Typannonation verpasst bekommen hat. Seitdem ist das syntaktisch korrekt, macht aber in dieser Form keinen Sinn. Man kann hinter einen Namen einen Doppelpunkt setzen, und dahinter einen beliebigen Ausdruck, der ausgewertet wird und als Metadaten gespeichert wird. Dieser Ausdruck sollte eigentlich in geeigneter Form den erwarteten Typ von dem ergeben was da annotiert wird. Zeichenketten als Ausdruck können sogar Sinn machen, weil man Typen dort auch als Zeichenkette angeben kann. Das muss man beispielsweise bei rekursiven Definitionen machen, weil der Typ den man da annotieren müsste, zu dem Zeitpunkt ja gerade definiert wird und deshalb noch nicht zur Annotation verwendet werden kann.

Die Frage ist hier so ein bisschen wie Du darauf gekommen bist an der Stelle einen Doppelpunkt zu setzen, denn wie man `print()` korrekt verwendet weisst Du ja grundsätzlich, denn das machst Du an anderen Stellen ja richtig. Das ist eine Funktion, die muss man aufrufen, mit dem was ausgegeben werden soll als Argument(e).

Warum Du welches Zeichen setzt musst Du schon wissen, denn Rechner sind da sehr pingelig was Bedeutungen angeht. Rechner machen nicht was man sagen *wollte*, sondern immer nur exakt das was man gesagt *hat*. Die dumme Kiste denkt kein Stück mit, die macht stur was man von ihr verlangt. Wie sie etwas falsches macht, dann hat man was falsches verlangt.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was daran IMHO auch ziemlich schräg / verwirrend ist, ist das `print` zwar in den Annotations auftaucht, aber der Name `print` immer noch an die Funktion gebunden ist und nicht an den String:

Code: Alles auswählen

>>> print: """Hier steht Text"""
>>> print(print)
<built-in function print>
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <cl
ass '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {
'print': 'Hier steht Text'}, '__builtins__': <module 'builtins' (built-in)>}
>>>
Gruß, noisefloor
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@noisefloor: das Schräge ist, dass man einfach so eine Funktion beliebig oft annotieren kann, ohne jemals eine neue Zuweisung zu haben.
Die ganze Annotationssyntax ist in einer Reihe mit := oder Patternmatching. Man packt immer mehr Syntaxvarianten in die Sprache, so dass bald beliebiger Text syntaktisch korrekt ist, aber kein sinnvoller Programmcode.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

noisefloor hat geschrieben: Mittwoch 31. März 2021, 09:44 was daran IMHO auch ziemlich schräg / verwirrend ist, ist das `print` zwar in den Annotations auftaucht, aber der Name `print` immer noch an die Funktion gebunden ist und nicht an den String:
Warum empfindest du das als schräg / verwirrend? Namen werden doch nie an die annotation gebunden, oder stehe ich auf dem Schlauch?
Fritzbox
User
Beiträge: 2
Registriert: Samstag 10. April 2021, 21:36

Hallo ich hätte eine frage, ich möchte ein spiel entwickeln indem man sich immer für eine von 2 Möglichkeit entscheiden muss. Hier mein Problem, wenn man etwas anderes in "input" eingibt außer 1 und 2 möchte ich das eine Fehlermeldung erscheint und der Code wieder dorthin zurückspringt wo die Entscheidung abgefragt wird. Auch gerne andere Verbesserungsvorschläge in die Antwort Sektion ich lerne erst seit ein Paar Tagen Python und würde mich über Feedback freuen.
MFG Fritz.
Hier mein Code:

Code: Alles auswählen

from time import sleep
def entscheidung_1_wahl_10000_rechts():
    print("du läufst nach rechts")

def entscheidung_1_wahl_20000_():
    print("du läufst nach links")



name=input ("gib deinen namen:")
print ("hallo " +name+ " deine legende wird generiert...")
sleep (1)
print ("los geht's ")
print ("Du hast einen Auftrag..... ")
sleep (2)
print ("finde den Diamanten des Königs")
input ("[press to play]")
print (".......")
sleep (2)
print ("du kommst zu einer Wegkreuzung willst du(1)rechts oder (2)links gehen" )

zahl=input ("deine wahl.....")
if int(zahl) >=3:      #entscheidung 1 wahl 30000 [falsch]
    print("[falsche aussage]") # hier wird zwar schon ausgegeben falsche aussage aber das programm läuft nicht weiter

if int(zahl)< 2:#entscheidung 1 wahl 10000 [rechts]
    entscheidung_1_wahl_10000_rechts()

if int(zahl)== 2:               #entscheidung 1 wahl 20000 [links]
    entscheidung_1_wahl_20000_()
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Das was Du brauchst, nennt sich Schleife, hier eine while-True-Schleife. Zusätzlich solltest Du noch abfangen, ob Du überhaupt eine Zahl eingegeben hast.

Code: Alles auswählen

from time import sleep

def auswahl(prompt, optionen):
    while True:
        try:
            zahl = int(input("deine wahl....."))
        except ValueError:
            pass
        else:
            if zahl in optionen:
                return zahl
        print("[falsche aussage]")

def entscheidung_1_wahl_10000_rechts():
    print("du läufst nach rechts")

def entscheidung_1_wahl_20000_links():
    print("du läufst nach links")

def main():
    name = input("gib deinen namen:")
    print(f"Hallo {name}, deine legende wird generiert...")
    sleep(1)
    print("los geht's ")
    print("Du hast einen Auftrag..... ")
    sleep(2)
    print("finde den Diamanten des Königs")
    sleep(2)
    print("du kommst zu einer Wegkreuzung willst du(1)rechts oder (2)links gehen" )

    zahl = auswahl("deine wahl.....", [1, 2])
    if zahl == 1:
        entscheidung_1_wahl_10000_rechts()
    else:
        entscheidung_1_wahl_20000_links()

if __name__ == '__main__':
    main()
Fritzbox
User
Beiträge: 2
Registriert: Samstag 10. April 2021, 21:36

Dankeschön jz funktioniert es gibt es dazu irgendwo ein Tutorial auf YT das ich den Ablauf dahinter vll. noch nachvollziehen kann.
Noch einmal danke saß wirklich lange an dem Problem.
LG
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten