variableninhalt als variable

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.
conray
User
Beiträge: 20
Registriert: Donnerstag 4. März 2010, 22:39

Hallo liebe Python Gemeinde,

Habe mal ne doofe frage:
Kann man den Inhalt einer Variable auch als Variable nutze?
also ich hab zb
a = 123
b = 456
c = 789
nun soll der Programmbenutzer die Variable "test" bestimmen ob a b od c.
also
test = <stdin> (?richtig so?:D)

der Benutzer weist der Variable test jetzt den wert a zu

wie kann ich (außer mit Abfragen) nun einfach per print befehl die Variable test ausgeben sodass die ausgabe nicht "a" sonder 123 also der Wert von Variable a ist?

Ich weis ehrlichgesagt auch nich wie bzw. nach was ich danach googlen sollte :oops:
mir reicht eigendlich schon die bezeichnung dieses Szenario :D

mfg
conray
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

>>> a = 123
>>> b = 456
>>> c = 789
>>> var = raw_input('Enter the variable name: ')
Enter the variable name: b
>>> val = locals().get(var)
>>> if val is not None:
...     print('{0!r} has the value {1}'.format(var, val))
... 
'b' has the value 456
Besser ist es allerdings ein eigenes dictionary zu verwenden statt auf locals() zurückzugreifen.
conray
User
Beiträge: 20
Registriert: Donnerstag 4. März 2010, 22:39

derdon hat geschrieben:

Code: Alles auswählen

>>> a = 123
>>> b = 456
>>> c = 789
>>> var = raw_input('Enter the variable name: ')
Enter the variable name: b
>>> val = locals().get(var)
>>> if val is not None:
...     print('{0!r} has the value {1}'.format(var, val))
... 
'b' has the value 456
Besser ist es allerdings ein eigenes dictionary zu verwenden statt auf locals() zurückzugreifen.

Ihr seit immer so wahnsinnig schnell :)
Erstmal Danke !

kann mir mal einer {0!r} erklären? ich sehe was dabei rauskommt aber was tut das genau?

mfg
conray
conray
User
Beiträge: 20
Registriert: Donnerstag 4. März 2010, 22:39

Okay ich danke dir derdon. werde mir die Links mal zu Gemüte führen :)

thx a lot

mfg
conray

kann geclosed werden.
conray
User
Beiträge: 20
Registriert: Donnerstag 4. März 2010, 22:39

mal noch eine Frage dazu:
Kann man das auch als Teil eines Definitionsnamen bzw Import machen?

zb ich habe die Definition "Spieler1" und "Spieler2" darin steht das der meinet wegen "Klaus" heist.
also
def Spieler1() :
name='Klaus'

def Spieler2() :
name='Horst'

Jetzte will ich schauen ob der nutzer der die variable input belegt hat Spieler1 oder Spieler2 eingegeben hat.
und dann jeweils von dieser definition den namen ausgegeben.
geht das auch mit locals() oder sollte man sich dafür dann doch liber einen Dictionary anlegen ?

mfg
conray
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

>>> def spieler1():
...     name = 'Klaus'
... 
>>> def spieler2():
...     name = 'Horst'
... 
>>> func_name = raw_input()
spieler1
>>> func = {
...     'spieler1': spieler1,
...     'spieler2': spieler2
... }.get(func_name)
>>> func.func_code.co_consts[1]
'Klaus'
Allerdings denke ich, dass du deine gesamte Programmstruktur noch einmal überdenken solltest. Eine Funktion, die lediglich einen lokalen Namen definiert, ist sehr seltsam. Und Funktionsnamen zu nummerieren, ist auch ein Indikator für "code smell".
conray
User
Beiträge: 20
Registriert: Donnerstag 4. März 2010, 22:39

Danke dir derdon!

Nummerieren will ich nicht war nur ein beispiel:D

Ich versuch mein Lieblingsbrettspiel (Hotel) aufs CLI zu bringen :D
Eher zur übung als das es einen echten nutzen hätte ^^
Code smell wirds mit hoher Wahrscheinlichkeit da es mein erster Pythoncode wird der über 30 Zeilen umfasst :D
Aber naja Übung macht den Meister ;)
Vielen dank nochmal!
mfg
conray
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

was hältst du denn von dem hier?

Code: Alles auswählen

# kommen wahrscheinlich eigentlich aus einer Datei...
NAMES = frozenset('Klaus', 'Horst')

def name_exists(name):
    return name in NAMES

def main():
    name = raw_input('name: ')
    print name if name_exists(name) else 'Error: user {0} does not exist.'.format(name)

if __name__ == '__main__':
    main()
conray
User
Beiträge: 20
Registriert: Donnerstag 4. März 2010, 22:39

Auch gut aber die Namen sollen ja Variabel sein also jeder der Spielen will soll seinen eigenen Namen angeben.
Das war eher eine allgemeine Frage weil es im Spiel 8 Hotels gibt und wenn jemand eins kauft soll es den Namen des Hotels eingeben und die variable hotel zb.

Code: Alles auswählen

hotel = raw_input
Eines der Hotels heist zb Royal und der Spieler will es kaufen also
hotel = 'Royal' nach der Usereingabe.
im Modul royal.py stehen die ganzen Preise etc. also auch der Kaufpreis.
Nun soll der Kaufpreis ausdem modul royal ausgelesen werden und vom Konto (Variable money :D ) abgezogen werden.
Dann will ich nicht erst ewig rum if'en welches es denn ist sondern den Inhalt gleich benutzen.
Alsosozusagen :)

Code: Alles auswählen

 money = money - InhaltderVariablehotel.price 
sozusagen :)

mfg
conray
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Du hast für jedes Hotel ein eigenes Modul? Wenn ja -> nix gut!

Bei Spielern bieten sich doch Klassen (Klassenname ``Player``) an.
conray
User
Beiträge: 20
Registriert: Donnerstag 4. März 2010, 22:39

Ja ich habe für jedes Hoel ein eigenes Modul.
Was ist daran Schlimm?
Wollte nicht alles in einem (riesengroßen Script haben :D

Bei den Spilern bin ich nopch ganicht :D Aber ich hatte mir schon sowas mit Klassen überlegt.

mfg
conray
BlackJack

@conray: Warum hast Du ein Modul pro Hotel? Unterscheiden die sich so stark vom Code her das es Sinn macht? Ich denke mal eher es sollte eine Klasse für Hotels allgemein geben von der dann für jedes Hotel ein Exemplar erstellt wird. Und vergiss ganz schnell den Quelltext den derdon gezeigt hat um an Konstanten innerhalb einer Funktion heranzukommen.

@derdon: In diesem Zusammenhang: Supertoll das Du solche Tricks kennst, aber die ohne den *sehr deutlichen* Hinweis dass das nicht ernst gemeint ist, sollte man das niemandem als Lösung anbieten. Selbst mit Hinweis ist das noch IMHO gefährlich.
conray
User
Beiträge: 20
Registriert: Donnerstag 4. März 2010, 22:39

BlackJack hat geschrieben:@conray: Warum hast Du ein Modul pro Hotel? Unterscheiden die sich so stark vom Code her das es Sinn macht? Ich denke mal eher es sollte eine Klasse für Hotels allgemein geben von der dann für jedes Hotel ein Exemplar erstellt wird. Und vergiss ganz schnell den Quelltext den derdon gezeigt hat um an Konstanten innerhalb einer Funktion heranzukommen.

naja manche Hotels haben 3 Häuser andere 4 oder 5 die jeweils einen eigenen Preis haben und auch die Meitpreise sind unterschiedlich.
Meine Module sehen alle etwa so aus:

Code: Alles auswählen

#!/usr/bin/python
#waikiki.py

name = 'Waikiki'
price = 2500
halfprice = 1250
entrance = 200
house = ['3500', '2500', '2500', '1750', '1750', '2500']
houses = 6
rent1 = ['200', '350', '500', '500', '650', '1000']
rent2 = ['400', '700', '1000', '1000', '1300', '2000']
rent3 = ['600', '1050', '1500', '1500', '1950', '3000']
rent4 = ['800', '1400', '2000', '2000', '2600', '4000']
rent5 = ['1000', '1750', '2500', '2500', '3250', '5000']
rent6 = ['1200', '2100', '3000', '3000', '3900', '6000']
rent = [rent1, rent2, rent3, rent4, rent5, rent6] 
Nicht schönb aber selten :D

ich wollte halt dann bei den mieten so vorgehen:

i = zufall(würfel)
h=anzahl der stehenden hotels

price = waikiki.rent[h]

geht das eig?:D

BlackJack hat geschrieben: @derdon: In diesem Zusammenhang: Supertoll das Du solche Tricks kennst, aber die ohne den *sehr deutlichen* Hinweis dass das nicht ernst gemeint ist, sollte man das niemandem als Lösung anbieten. Selbst mit Hinweis ist das noch IMHO gefährlich.


was meinst du damit?
mfg
conray
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

conray hat geschrieben:
BlackJack hat geschrieben: @derdon: In diesem Zusammenhang: Supertoll das Du solche Tricks kennst, aber die ohne den *sehr deutlichen* Hinweis dass das nicht ernst gemeint ist, sollte man das niemandem als Lösung anbieten. Selbst mit Hinweis ist das noch IMHO gefährlich.
was meinst du damit?
Das Zeugs was dir derdon gezeigt hat ist absolut unangebracht hinsichtlich der Tatsache dass du offensichtlich Programmiereinsteiger bist. Er hat zwar deine Fragen korrekt beantwortet, nachhaltig wäre hier aber nur der Hinweis auf das Überdenken der Programmstruktur gewesen. (Was er ja auch tat, allerdings mit bösen bösen Pythonhacks.)
Deswegen: Vergiss das mal wieder! :-)

Im Übrigen schreit dein Beispiel mit den Hotels nach Vererbung:

Code: Alles auswählen

class Hotel(object):
    name = NotImplemented
    price = NotImplemented
    houses = NotImplemented
    # ...

    @property
    def half_price(self):
        return self.price/2

class Royal(Hotel):
    name = "Royal"
    price = 42
    houses = [
        3500, 2500, 2500, 1750, 1750, 2500
    ]
und so weiter.

Für die Spieler bietet sich ein Dictionary mit Objekten einer `Player`-Klasse an, ebenso für das Mapping "Eingabe des Hotelnames - zugehörige Pythonklasse".

Und falls dir das noch nicht genug Hirngewurschtel ist, lagere diese ganzen Daten mit den Preisen und so in eine JSON-Datei aus und/oder generiere sie zur Laufzeit, falls ein System dahinterstecken sollte.

:-)
BlackJack

@conray: Module würde man auf diese Weise nicht verwenden. `houses` und `halfprice` sind überflüssig, da redundant. Die Anzahl der Häuser steckt in der Länge der Preisliste für die Gebäude und die Hälfte vom Grundstückspreis kann man bei Bedarf ganz einfach ausrechnen.

Ich würde auch wie Dauerbaustelle vorgeschlagen hat, mal schauen ob bei den Tabellen irgendwelche mathematischen Zusammenhänge bestehen, so dass man die nicht komplett als Daten speichern muss.

Warum sind die Mieten eigentlich als Zeichenketten abgelegt? Damit musst Du doch am Ende *rechnen*.

`house` würde ich eher `category` oder `stars` nennen, denn die letzte Ausbaustufe ist ja kein Haus mehr.

@Dauerbaustelle: Man könnte da Vererbung verwenden, aber es schreit IMHO nicht danach. Die Hotels verhalten sich alle identisch, es sind nur die Daten die sich ändern. Und nur für Daten würde ich mir Subklassen stark überlegen. Eine Hotelklasse deren Exemplare je nach Hotel mit den entsprechenden Daten gefüttert werden, tut's auch.
conray
User
Beiträge: 20
Registriert: Donnerstag 4. März 2010, 22:39

Du scheinst das Spiel ja zu kennen.
Das die letzte Ausbaustufe kein Hotel sonder eig. ein Park ist ist doch egal kommt doch nur auf den Preis an. Am ende sinds eh alles bloß bunte Sternchen aufn Spielfeld :D

Die listen für die Miete haben folgenenden Grund:
wenn man auf ein gegnerisches Hotel kommt und bezahlen soll muss man erst nochmal würfeln die Zahl der augen ergibt dann mit der Anzahl der stehenden Häuser einen Preis.
Außerdem wollte ich gleich auf fertige Variablen zugreifen anstatt späternoch zu rechenn auch wenns einfach wäre :D


Die Preise der Mieten haben die damaligen Spieleentwickler wohl per zufall gesetzt.

Für mich war die Variante der einfachste weg :D ( da Anfänger ^^ )

mfg
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

conray, BlackJacks Frage war eher dahingehend, warum du *Zeichenketten* verwendest statt Zahlen (Integers).

BlackJack, hm, aber wenn man jetzt von einem Haus mehrere haben will? (Stichwort "Reihenhaus" :-D) Für das wäre dann eine Protoypen-basierte Sprache gut -- `copy` :-)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Reihenhäuser sind bei dem Spiel "Hotel" nicht möglich (soweit ich mich erinnern kann) ;)

Ist aber auch lange her, dass ich es das letzte Mal gespielt habe...
BlackJack

@Dauerbaustelle: Wenn man zwei "Royal" haben möchte dann erstellt man eben zwei Exemplare mit den gleichen Grunddaten. Den Namen sollte man allerdings variieren damit man die auch auseinanderhalten kann.
Antworten