@Random08: Bei welchem Code oder welcher Eingabe passiert das was Du im Text beschreibst denn? In dem Code den Du gezeigt hast, bekomme ich entweder einen `RecursionError` oder einen `NameError`:
Code: Alles auswählen
$ python3.7 forum19.py
Bitte geben Sie ihren Namen ein um am Gewinnspiel teilzunehmen:
... (sehr viele Leerzeilen)
Traceback (most recent call last):
File "forum19.py", line 8, in <module>
Nop1 = No_Input_Check(Nop=Name_1_Participater)
File "forum19.py", line 7, in No_Input_Check
No_Input_Check(Nop=Nop)
File "forum19.py", line 7, in No_Input_Check
No_Input_Check(Nop=Nop)
File "forum19.py", line 7, in No_Input_Check
No_Input_Check(Nop=Nop)
[Previous line repeated 992 more times]
File "forum19.py", line 6, in No_Input_Check
print(Nop)
RecursionError: maximum recursion depth exceeded while calling a Python object
$ python3.7 forum19.py
Bitte geben Sie ihren Namen ein um am Gewinnspiel teilzunehmen: BlackJack
Traceback (most recent call last):
File "forum19.py", line 19, in <module>
te_ste = ste_te()
File "forum19.py", line 13, in ste_te
if counter == 1:
NameError: name 'counter' is not defined
Wenn Du ein Problem hast, dann zeige Bitte den Code der auch tatsächlich zur Problembeschreibung passt.
Anmerkungen zum tatsächlich gezeigten Code:
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).
Man nummeriert keine Namen. Dann will man sich entweder sinnvollere Namen überlegen, oder gar keine Einzelnamen/-werte, sondern eine Datenstruktur. Oft eine Liste. Beim gezeigten Quelltext sind die die 1en einfach nur überflüssig.
Ich würde auch dringend empfehlen nicht wie Yoda zu ”sprechen”. `name_participator` klingt komisch für einen Teilnehmernamen. Das wäre `participator_name`.
Man mischt Programm und Funktionsdefinitionen (oder Klassendefinitionen) nicht auf Modulebene. Das Hauptprogramm hat da nichts zu suchen, das steht üblicherweise in einer Funktion die `main()` heisst.
Man sollte Module importieren können, ohne das da mehr passiert als die Definition von Konstanten, Funktionen, und Klassen. Das bedeutet insbesondere auch keine globalen Variablen. Vergiss am besten gleich wieder, dass es das Schlüsselwort ``global`` überhaupt gibt. Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen, als Argument(e) übergeben.
Namen sollten keine kryptischen Abkürzungen enthalten und schon gar nicht nur daraus bestehen. Was `nop` als Argumentname bedeuten soll, ist mir auch nach angestrengtem Nachdenken nicht klar. Das Ergebnis einer Funktion die `ste_te()` heisst, an den Namen `te_ste` zu binden ist auch alles andere als selbsterklärend. Gute Namen sind wichtig. Die vermitteln dem Leser die Bedeutung des Wertes der dahinter steckt. Die sollten nicht zum rätselraten zwingen.
Wenn eine Funktion *ein* Argument entgegen nimmt, ist es in der Regel nicht sinnvoll das als Schlüsselwort-Argument zu übergeben. Falls das den Code wirklich verständlicher macht, was hier eindeutig nicht der Fall ist, sollte man überlegen ob der Funktionsname nicht besser sein könnte.
`nop1` müsste von der Bedeutung her eigentlich weiterhin `participator_name` heissen, denn das ist ja weiterhin der Name des Teilnehmers. Wobei hier auch `name` reichen würde, falls es nicht noch andere Namen im gleichen Kontext gibt, gegen die man diesen Namen abgrenzen müsste.
Die `no_input_check()`-Funktion ist kaputt, selbst wenn man das fehlende ``return`` ergänzt. Wenn der Benutzer etwas eingibt, was den ``if``-Test besteht, ist alles okay, aber im anderen Fall hat man eine sinnlose Endlosrekursion. Der rekursive Aufruf ist hier an sich schon falsch, weil selbst wenn da etwas sinnvolles getan würde, wäre das kein rekursives Problem was da gelöst wird, und Rekursion ist kein sinnvoller Ersatz für eine einfache Schleife. Zumindest nicht in Programmiersprachen die keine „tail call optimisation“ garantieren.
Man muss einen Rückgabewert nicht eine Zeile vor dem ``return`` an einen Namen binden. insbesondere wenn das sowieso nur eine literale Zeichenkette ist, macht das überhaupt gar keinen Sinn.
In `ste_te()` wird entweder "te" oder "ste" oder `None` zurückgegeben. Letzteres *implizit* weil der Fall im Code einfach nicht berücksichtigt wird. So etwas sollte man nicht machen. An der Stelle sollte man entweder *explizit* `None` zurückgeben, oder eine Ausnahme auslösen, oder diesen Fall anders sinvoll behandeln.
Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale. Beziehungsweise kann man beim `print()` auch nutzen, dass dort mehrere Argumente angegeben werden können, die von `print()` dann in Zeichenketten umgewandelt und mit Leerzeichen getrennt ausgegeben werden.
Überarbeitet, aber immer noch mit den gleichen Problemen/Ausnahmen wie das Original:
Code: Alles auswählen
#!/usr/bin/env python3
def no_input_check(text):
if text.isalnum():
return text
else:
print(text)
return no_input_check(text)
def function_in_a_need_for_a_better_name(counter):
if counter == 1:
return "ste"
if counter > 1:
return "te"
raise ValueError(f"expected counter value in 1.., got {counter}")
def main():
name = no_input_check(
input(
"Bitte geben Sie ihren Namen ein um am Gewinnspiel teilzunehmen: "
)
)
need_a_better_name_here = function_in_a_need_for_a_better_name(counter)
print(
f"{name} hat bei diesem Gewinnspiel teilgenommen und ist der"
f" {counter}{need_a_better_name_here} Teilnehmer"
)
if __name__ == "__main__":
main()