Variablen innerhalb von Klassen & Methoden übergeben

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.
BlackJack

Mal spasseshalber eine allgemeine Funktion für das ausrechnen einer n-nären Operation (n≤26) herausgezogen und damit dann die ganzen Operationen definiert:

Code: Alles auswählen

from __future__ import print_function
from functools import partial
from itertools import islice
from operator import add, mul, pow as pow_, sub, truediv
from string import ascii_lowercase

try:
    input = raw_input
except NameError:
    pass  # We are on Python 3.


def do_n_ary_function(arity, function, text):
    if arity > len(ascii_lowercase):
        raise ValueError(
            'max {} arguments allowed for function'.format(len(ascii_lowercase))
        )
    arguments = [
        int(input(' {} = '.format(var_name)))
        for var_name in islice(ascii_lowercase, arity)
    ]
    result = function(*arguments)
    print(text.format(*arguments, result=result))


multiplicate = partial(
    do_n_ary_function, 2, mul, 'Das Produkt von {} x {} ist gleich: {result}'
)
sum_ = partial(
    do_n_ary_function, 2, add, 'Die Summe von {} und {} ist gleich: {result}'
)
subtract = partial(
    do_n_ary_function, 2, sub, 'Die Differenz von {} zu {} ist: {result}'
)
divide = partial(
    do_n_ary_function, 2, truediv, 'Der Quotient aus {} / {} ist = {result}'
)
square = partial(
    do_n_ary_function,
    1,
    lambda x: x**2,
    'Das Quadrat von {} ist gleich: {result}'
)
power = partial(
    do_n_ary_function, 2, pow_, 'Die Potenz von {} und {} ist gleich: {result}'
)


def main():
    while True:
        for operation in [sum_, subtract, multiplicate, divide, square, power]:
            operation()
        print()


if __name__ == '__main__':
    main()
BSA
User
Beiträge: 38
Registriert: Freitag 6. Dezember 2013, 07:49

Moin.

Ja, das kann sein. Im Nachhinein fällt mir auch auf, dass die Schleife total unnötig ist. Eine einfach if/else hätte wohl gereicht...
Ich werde _versuchen_ in Zukunft etwas mehr darauf zu achten.
Ich muss jedoch dazu sagen, dass ich das ganze nur als Test-Skript geschrieben habe, um die Funktionsweise aus Hyperion's Antwort zu prüfen/verstehen/anzuwenden. Ich hatte da leider keinen Zugriff auf mein eigenes kleines Projekt, bzw. nur auf recht alte Versionen - daher musste ich improvisieren ;-)

Zur 'return'-Anweisung: Ich war eigentlich davon ausgegangen, dass erst so das Ergebnis aus der Funktion an die funktionsaufrufende Variable zurückgegeben wird. Ist das denn nicht so? Das muss ich nachher mal ausprobieren. War bisher davon ausgegangen, dass erst die 'return'-Anweisung den Wert zurückgibt... :K

Das mit einer extra input()-Funktion hatte ich mir ursprünglich auch überlegt, da ich das ganze aber recht fix eintippen musste/wollte, habe ich da evtl. nicht alles umgesetzt, was mir dazu eingefallen wäre.

Das mit der doppelten Berechnung in quadrat() kann ich grad nicht mehr erklären. Ich hab jedoch recht planlos angefangen, was sich am Ergebnis wohl auch ablesen lässt... :oops:

Deinen Code finde ich interessant. Ich werde mich damit die Tage mal beschäftigen, besonders mit den Modulen !!

Zu meinem ursprünglichen Code: Ich habe jetzt alles soweit, dass es läuft. Jedoch bin ich noch dabei, manche Fehler (solche, die mir auffallen...) auszubessern und evtl. unbenötigte Variablen rauszunehmen, sofern sie über den Schleifenablauf sowieso umgesetzt würden, sprich: Wo der Kontrollfluß in meinem Code schon das ein oder andere regelt, bedarf es evtl. der einen oder anderen durch die Funktion gesetzte Variable nicht mehr. Da bin ich noch am rumprobieren...

Die Länge der physikalischen Zeilen hat sich jedoch kaum merklich geändert, dafür gibt es allerdings auch keine Klasse mehr und eine mainloop() kümmert sich um (fast) alle anderen Funktionsaufrufe...außerdem gibt es die geforderten DocStrings und eine neue kleine (Steuerungs-)Funktion, die mainloop()...mal schauen, zufrieden bin ich wie gesagt selber noch nicht damit !
Veröffentlichen werde ich sie wahrscheinlich morgen oder übermorgen - je nachdem wieviel Zeit ich bis dahin noch über habe.

Viele Grüße
BSA
Oftmals beschleicht mich hier im Forum das heimliche Gefühl, an verschiedenen Stellen mal ein einfaches "Bahnhof" zu posten.

Wann du den Fisch auch fängst, er ist frisch. Sprichwort
BlackJack

@BSA: Das mit ``return`` hast Du schon richtig verstanden. Es ist halt ungewöhnlich das eine Funktion das Ergebnis dem Benutzer ausgibt *und* dann noch zum Aufrufer zurück gibt. Man macht normalerweise entweder das eine oder das andere. In der Regel eher zurückgeben, denn wenn man Berechnung und Ausgabe trennt, kann man die Funktion flexibler verwenden, zum Beispiel sowohl in einem Kommandozeilenprogramm als auch in einer GUI. Oder in einer Webanwendung, oder…
BSA
User
Beiträge: 38
Registriert: Freitag 6. Dezember 2013, 07:49

Moin BlackJack,

klingt logisch. Berechnen in Bspw. Func1(), Func2() etc., zurückgeben an (bspw.) Ausgabe() und dort dann erstmalig ausgeben und evtl. auch speichern, bzw. wenn man über eine main() arbeiten sollte:
-- main() [ruft auf] a=func1(), b=func2() ... [main() [erhält Werte a / b zurück]
-> main() [ruft auf] (bspw.) output() / work_with / write_sequential() ... -> die übergebenen Werte sind weitergereicht und werden "dort" weitergenutzt

Gestern Abend ist bei meinem Spiel noch eine weitere Funktion hinzugekommen, außerdem ist eine weitere Variable rausgeflogen, die anscheinend keine wichtige Funktion hatte (while-Schleife und if-Abfrage mit einer anderen Variable tun das gleiche)

Jetzt habe ich das Problem, dass ich überhaupt keine globalen Werte mehr habe, was vorher noch anders war.
Das führt bei mir zu einem Problem mit der Sound-Ausgabe, da ich nicht jede Sounddatei als Variable immer manuell hin- und herreichen möchte, insbesondere da es ja immer mal sein kann, dass noch Sounddateien dazukommen bzw. verändert werden sollen.
Daher überlege ich mir an dieser Stelle doch wieder tatsächlich eine Klasse Sound zu erstellen.
Das wird aber wohl eine _besonders einfache_ Klasse werden, da nur eine Methode "play" benötigt wird. Mit der __init__ müsste ich mich allerdings nochmal beschäftigen, da dort ja die Sounddateien bzw. die File-Attribute initiiert (definiert) werden müssten.

Wie schon zuvor einmal geschrieben:

Code: Alles auswählen

from fun.local import stress, hammer

tastatur = True

def symbiose():
  if fun == stress:
    print('Es bleibt spannend...')
  elif fun > stress:
    print('Das ist aber toll!')
  else:
    tastatur.hammer.go()
;-)
Oftmals beschleicht mich hier im Forum das heimliche Gefühl, an verschiedenen Stellen mal ein einfaches "Bahnhof" zu posten.

Wann du den Fisch auch fängst, er ist frisch. Sprichwort
Antworten