global alternative Python?

2 Antworten

Ein Konzept wie lokale static-Variablen gibt es in Python leider nicht. Für ein Singleton Pattern musst Du etwas tricksen:

def a():
    if a.a is None:
        a.a = input("a=")
    return a.a
a.a = None

Hier wird die versteckte Variable a.a nur beim ersten Aufruf initialisiert. Falls die Abfrage in a() zu teuer ist, weil die Funktion extrem oft aufgerufen wird, kann die Funktion sich beim ersten Aufruf umdefinieren:

def a():
    aa = input("a=")
    global a
    a = lambda: aa
    return aa

Solche Konstrukte sind aber äußerst unüblich. Man könnte damit zum Beispiel Ressourcen (Images, Fonts, ...) implementieren, die erst dann instantiiert werden, wenn sie irgendwo gebraucht werden.

Gewöhnlich schreibt man besser eine Klasse, die im Konstruktor alle nötigen Variablen einliest oder anderweitig initialisiert. Die kann dann an jede Funktion übergeben werden, die einen oder mehrere Werte daraus braucht.


letthegamebegin 
Fragesteller
 26.02.2023, 23:32

Cool danke werde ich gleich Mal mit einer Klasse ausprobieren

0

Variablen innerhalb einer Funktion sind lokal für die Funktion und nicht global. Was meinst du?

Du rufst a() auf, statt b + 2, also a() + 2, du machst einen Funktionsaufruf um den Wert zu bekommen.


letthegamebegin 
Fragesteller
 26.02.2023, 23:16

Ich hatte den Code vor paar Tagen einem discor User geschickt. Er meinte, dass ich komplett auf globale Variablen verzichten, und stattdessen alle als Parameter übergeben solle.

Leider habe ich 0 plan wie weil ich ja die Variablen erst in der Funktion einen Wert übergebe und der ja bei jedem Durchlauf der Funktion anders ist.(ich lerne erst seit einem Monat und habe bis jetzt nur folgendes gelernt:

def a(name):

print (f"Hallo {Name}")

a("Max")

Ich Hefte dir Mal den Code untern rein. (Er ist noch unvollständig weil ich ihn gerade umbauen und shorten will):

import random

def allready_choosen():
    print("Keine gültige Eingabe! Bitte versuche es erneut\n")

def add_player():
    a = input("Bitte Namen des Spielers eingeben:\n")
    return a


extra_player_count = 0
players = []
all_numbers = []

def player_options():
    while True:
        global extra_player_count, players
        print("*** Willkommen zum Zahlenrätsel-Spiel! ***\nFür jeden Spieler werden die Zahlen um 10 erweitert.\n")
        first_player = add_player()
        second_player = add_player()
        players.append(first_player)
        players.append(second_player)
        print(players)
        more_player = input("Möchten Sie noch mehr Spieler hinzufügen?\nY/N:\n")
        try:
            more_player = str(more_player)
        except:
            allready_choosen()
        if more_player == "y" or more_player == "Y":
            while True:
                extra_player_count = input("Wie viele Spieler möchtest du hinzufügen?(max. 2)\n")
                try_int(extra_player_count)
                if extra_player_count == "1":
                    third_player = add_player()
                    players.append(third_player)
                    return players
                if extra_player_count == "2":
                    players.append(add_player())
                    players.append(add_player())    # SPÄTER WEG FINDEN UM DIE SPIELER ZU BESCHRIFTEN
                    print(len(players))
                    return players
                elif extra_player_count < "2":
                    allready_choosen()
        elif more_player == "n" or more_player == "N":
            return
        else:
            allready_choosen()


def try_int(a):
    while True:
        try:
            a = int(a)
        except ValueError:
            print("111")
        finally:
            return a



def int_game():
    global extra_player_count, players, all_numbers, pin, value_numbers
    counter = 0
    value_player = 2 + int(extra_player_count)

    total_trys = value_player * 3

    print(pin)
    current_player = players[0]
    if counter == int(total_trys) - int(value_player):
        print("Achtung! Letzter Versuch für alle Spieler.")
    elif counter == int(total_trys):
        print("Keine Versuche mehr!")
        run = False
        return run
    zahl = input("Spieler " + str(current_player) + " Eingabe:\n")
    try_int(zahl)
    if zahl in all_numbers:
        allready_choosen()
    if int(zahl) == pin:
        print("Glückwunsch, Spieler " + str(current_player) + " hat gewonnen!")
        run = False
        return run
    elif zahl < str(pin):
        print("zu klein")
    elif zahl > str(pin):
        print("zu groß")
    else:
        allready_choosen()
    all_numbers.append(zahl)
    players.append(players.pop(0))
    counter += 1

pin = random.randint(1, value_numbers)
value_numbers = value_player * 10

def main():
    global players
    player_options()
    while True:
        int_game()

main()
0