Schlüsselwortparameter durch Nutzereigabe erzeugen

Code-Stücke können hier veröffentlicht werden.
Antworten
Nobody0815
User
Beiträge: 16
Registriert: Dienstag 23. Februar 2021, 21:25

Montag 22. März 2021, 09:42

Guten Morgen,

ich möchte einer Funktion das Argument "X" übergeben. Allerdings soll "X" durch Nutzereingabe einem bestimmten Schlüsselwort Parameter übergeben werden.
Der Nutzer gibt also die Parameterbezeichnung ein und nicht das Argument. Ist sowas überhaupt möglich?

Code: Alles auswählen

def playfield(field1 = 1, field2 = 2, field3 = 3, field4 = 4, field5 = 5, field6 = 6, field7 = 7, field8 = 8, field9 = 9):
    print(str(field1) + " - " + str(field2) + " - " + str(field3))
    print(str(field4) + " - " + str(field5) + " - " + str(field6))
    print(str(field7) + " - " + str(field8) + " - " + str(field9))

# Spielfeld anzeigen
playfield()

# Bsw. wählt hier der Nutzer die "4"
move = input("wähle Deinen Zug (1-9): ")
fieldmove = "field" + p1_move

# Hat der Nutzer "4" gewählt, wird jetzt hier "field4" geprintet
print(fieldmove)

# fieldmove soll jetzt das Argument "X" an den Schlüsselparameter field4 der Funktion übergeben und damit die "4" als Vorauswahl überschreiben.
# playfield(field4 = "X") --> so müsste der Schlüsselparameter eigentlich aufgerufen werden.
# Da ich aber den Parameter durch den Nutzer bestimmen lassen möchte, fällt mir nix sinnvolles ein ...
playfield(fieldmove = "X")
Zur Verdeutlichung:
Ausgangspunkt
1 - 2 - 3
4 - 5 - 6
7 - 8 - 9

(gewünschtes) Ergebnis für das Bsp.: Nutzereingabe = 4
1 - 2 - 3
X - 5 - 6
7 - 8 - 9

Falls Ihr eine Idee habt würde ich mich freuen.
VG
Benutzeravatar
__blackjack__
User
Beiträge: 8580
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Montag 22. März 2021, 10:52

@Nobody0815: Nummerierte Namen sind ein Warnhinweis, dass da was falsch läuft. Warum hat die Funktion nicht *ein* Argument, und zwar eine Liste mit den `field*`-Werten?

`playfield` ist kein guter Name für eine Funktion. Das ist ein guter Name für ein Spielfeld. Funktionsnamen beschreiben üblicherweise Tätigkeiten um sie leichter von eher passiven Werten, wie eben einem Spielfeld, unterscheiden zu können.

Code: Alles auswählen

#!/usr/bin/env python3
from more_itertools import chunked


def print_fields(fields):
    for row in chunked(map(str, fields), 3):
        print(" - ".join(row))


def main():
    fields = list(range(1, 10))
    print_fields(fields)

    # Bsw. wählt hier der Nutzer die "4"
    move = int(input("wähle Deinen Zug (1-9): ")) - 1
    fields[move] = "X"
    print_fields(fields)


if __name__ == "__main__":
    main()
“Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”
Nobody0815
User
Beiträge: 16
Registriert: Dienstag 23. Februar 2021, 21:25

Montag 22. März 2021, 12:01

@blackjack: Das ist so, weil ich noch am Anfang von Python bin und es noch nicht besser weiß. ;o)
Mir gefällt Deine Lösung. Danke dafür!
__blackjack__ hat geschrieben:
Montag 22. März 2021, 10:52
@Nobody0815: Nummerierte Namen sind ein Warnhinweis, dass da was falsch läuft. Warum hat die Funktion nicht *ein* Argument, und zwar eine Liste mit den `field*`-Werten?
@blackjack: Ok, ist notiert!
__blackjack__ hat geschrieben:
Montag 22. März 2021, 10:52
`playfield` ist kein guter Name für eine Funktion. Das ist ein guter Name für ein Spielfeld. Funktionsnamen beschreiben üblicherweise Tätigkeiten um sie leichter von eher passiven Werten, wie eben einem Spielfeld, unterscheiden zu können.
@blackjack: Könntest Du genauer erklären, wie die Funktion "print_fields" funktioniert?
__blackjack__ hat geschrieben:
Montag 22. März 2021, 10:52
def print_fields(fields):
for row in chunked(map(str, fields), 3):
print(" - ".join(row))

Wie schon geschrieben ist Deine Lösung sehr gut. Mir stellt sich allerdings nochimmer die Frage:

Kann der Nutzer die Parameterbezeichnung eingeben und nicht das Argument. Ist sowas überhaupt möglich? (siehe meinen ursprünglichen Post)
Benutzeravatar
__blackjack__
User
Beiträge: 8580
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Montag 22. März 2021, 14:10

@Nobody0815: Wo liegt denn das konkrete Problem beim Verständnis der `print_fields()`-Funktion? Da ist eine ``for``-Schleife, die eingebauten Funktionen `str()`, `map()`, und `print()`, und die `join()`-Methode auf Zeichenketten. Das ist alles in der Python-Dokumentatuon erklärt. Und die externe Funktion `more_itertools.chunked()` ist in der Dokumentation von `more_itertools` erklärt.

Wenn die Dokumentation alleine nicht hilft, probiert man einfach die einzelnen Teilausdrücke aus und schaut wie die konkreten Zwischenergebnisse aussehen:

Code: Alles auswählen

In [7]: fields                                                                  
Out[7]: [1, 2, 3, 'X', 5, 6, 7, 8, 9]

In [8]: list(map(str, fields))                                                  
Out[8]: ['1', '2', '3', 'X', '5', '6', '7', '8', '9']

In [9]: list(more_itertools.chunked(map(str, fields), 3))                       
Out[9]: [['1', '2', '3'], ['X', '5', '6'], ['7', '8', '9']]

In [10]: " - ".join(['1', '2', '3'])                                            
Out[10]: '1 - 2 - 3'
“Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”
Antworten