Funktionen definieren abhaengig von ver. Parametern

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.
Antworten
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Hi, sorry fuer die Fragen, aber ich muss meine Arbeit bald abliefern und habe ziemlichen Druck.
Ich bin momentan dabei meinen code u.a. zu vereinfachen und eines der Hauptprobleme ist, dass sich gewisse Strukturen wiederholen. Deshalb will ich eine Funktion schreiben, die ich dann z.B. spaeter abhaengig von anderen Parametern ausfuehern kann.

Code: Alles auswählen

def main():
    Qcont, A1, Around, nameiso, abu, qdivbya, abu2, information = readcontaminationfile()
    cavmaxCSS, cavmaxreal, factor = readcavmaxfile()
    betaS, geff, Lambda, phi, Qin, A, E, Ein, minimumf, maximumf, Vebitmax, check2, check1, check3, check4, \
           number, minnumber, maxnumber, diffqa0, cavlist, combo = getInputs(A1, Around, nameiso, Qcont, factor)
    alarm(cavlist, cavmaxCSS, number)
    decision(betaS, geff, Lambda, phi, Qin, A, E, Ein, minimumf, maximumf, Vebitmax, check2, check1, check3, check4,\
             number, minnumber, maxnumber, cavlist, factor, cavmaxCSS, cavmaxreal)
    clickrow(Qcont, A1, nameiso, abu, qdivbya, abu2, information, A, diffqa0, check3, check4, factor, \
             betaS, geff, Lambda, phi, minimumf, maximumf, cavmaxreal, combo)


def clickrow(Qcont, A1, nameiso, abu, qdivbya, abu2, information, A, diffqa0, check3, check4, factor, betaS, geff, Lambda, phi,\
             minimumf, maximumf, cavmaxreal, combo):
 if combo == "all":
                    liste = []
                    for a,b,c,d,e in zip(qdivbya,Qcont,nameiso, A1,abu2):
                        diffqa = abs(beamqdivbya - a )
                        diffqaoverqa = float(diffqa)/float(Qchosen)* A
                        if diffqa < diffqa0:
    # here another if structure, so that either shows only stable isotopes or all the isotopes
                            liste.append(a)
                            len(liste)
                            table1.setCellText(len(liste) - 1 , 0, str(c))
                            table1.setCellText(len(liste) - 1 , 1, str(b))
                            table1.setCellText(len(liste) - 1 , 2, str(d))
                            table1.setCellText(len(liste) - 1 , 3, str(a))
                            table1.setCellText(len(liste) - 1 , 4, str(diffqaoverqa))
                            table1.setCellText(len(liste) - 1 , 5, str(e))
# something is needed to update the contaminationlist in case there is no contamination! otherwise the old contamination from another row you pressed before
                if combo == "stable":
                    liste = []
                    for a,b,c,d,e in zip(qdivbya,Qcont,nameiso, A1,abu2):
                        if float(e) > 0:
                            diffqa = abs(beamqdivbya - a )
                            diffqaoverqa = float(diffqa)/float(Qchosen)* A
                            if diffqa < diffqa0:
# here another if structure, so that either shows only stable isotopes or all the isotopes
                                liste.append(a)
                                len(liste)
                                table1.setCellText(len(liste) - 1 , 0, str(c))
                                table1.setCellText(len(liste) - 1 , 1, str(b))
                                table1.setCellText(len(liste) - 1 , 2, str(d))
                                table1.setCellText(len(liste) - 1 , 3, str(a))
                                table1.setCellText(len(liste) - 1 , 4, str(diffqaoverqa))
                                table1.setCellText(len(liste) - 1 , 5, str(e))

if __name__ == '__main__': main()

Ich habe natuerlich noch andere Funktionen in meiner main-Funktion, aber den Kontext reinzukopieren, haette horrende Ausmasse- so extrem effizient wie ich meinen code geschrieben habe;)
Ich wuerde gern sowas in der Art durchfuehren, habe aber keine Ahnung wie:(

Code: Alles auswählen

def main():
    Qcont, A1, Around, nameiso, abu, qdivbya, abu2, information = readcontaminationfile()
    cavmaxCSS, cavmaxreal, factor = readcavmaxfile()
    betaS, geff, Lambda, phi, Qin, A, E, Ein, minimumf, maximumf, Vebitmax, check2, check1, check3, check4, \
           number, minnumber, maxnumber, diffqa0, cavlist, combo = getInputs(A1, Around, nameiso, Qcont, factor)
    alarm(cavlist, cavmaxCSS, number)
    decision(betaS, geff, Lambda, phi, Qin, A, E, Ein, minimumf, maximumf, Vebitmax, check2, check1, check3, check4,\
             number, minnumber, maxnumber, cavlist, factor, cavmaxCSS, cavmaxreal)
    clickrow(Qcont, A1, nameiso, abu, qdivbya, abu2, information, A, diffqa0, check3, check4, factor, \
             betaS, geff, Lambda, phi, minimumf, maximumf, cavmaxreal, combo)

def printer(a,b,c,d,e,beamqdivbya, Qchosen, A):
    diffqa = abs(beamqdivbya - a )
    diffqaoverqa = float(diffqa)/float(Qchosen)* A
    if diffqa < diffqa0:
        liste.append(a)
        len(liste)
        table1.setCellText(len(liste) - 1 , 0, str(c))
        table1.setCellText(len(liste) - 1 , 1, str(b))
        table1.setCellText(len(liste) - 1 , 2, str(d))
        table1.setCellText(len(liste) - 1 , 3, str(a))
        table1.setCellText(len(liste) - 1 , 4, str(diffqaoverqa))
        table1.setCellText(len(liste) - 1 , 5, str(e))


def clickrow(Qcont, A1, nameiso, abu, qdivbya, abu2, information, A, diffqa0, check3, check4, factor, betaS, geff, Lambda, phi,\
             minimumf, maximumf, cavmaxreal, combo):
    if combo == "all":
        liste = []
        for a,b,c,d,e in zip(qdivbya,Qcont,nameiso, A1,abu2):
            printer(a, b, c, d, e, beamqdivbya, Qchosen, A)
                            
    if combo == "stable":
        liste = []
        for a,b,c,d,e in zip(qdivbya,Qcont,nameiso, A1,abu2):
        if float(e) > 0:
            printer(a, b, c, d, e, beamqdivbya, Qchosen, A)

if __name__ == '__main__': main()
Freue mich ueber jegliche Hilfe!
Liebe Gruesse,
Peter
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

und sorry, es hat 1,2 Einschuebe nicht genommen, der erste code funktioniert, der zweite natuerlich nicht, er soll nur eine Idee davon geben, was ich erreichen will;)
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

oder vielleicht allgemeiner:

Code: Alles auswählen

def function(a,b,c):
    do something
def otherfunction(check, d, e, f):
    if check == 1:
        function(d, e, f)
Benutzeravatar
pillmuncher
User
Beiträge: 1532
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@peter99: Irgendwie verstehe ich dein Problem nicht. Du hast es doch schon fast, du musst nur die Funktion printer() so ändern, dass du zusätzlich die fehlenden Sachen übergeben kannst, also liste und table1 (was übrigens ziemlich schlechte Namen sind, wie auch deine anderen Namen).

Ich vermute übrigens, deine Aussage "der erste code funktioniert, der zweite natuerlich nicht" bezieht sich darauf, dass du einen NameError bekommst. Das nächste mal bitte die Fehlermeldung samt Traceback mitposten, damit man nicht raten muss.
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

die ganzen Variablennamen sagen mir natürlich gar nichts, aber sagt Dir in zwei Monaten noch was »check3« oder »check4« war??
a,b,c,d,e werden ja auch aus Listen gezogen, die einigermaßen bessere Namen haben, warum tauchen die dann nicht in den Laufvariablen auf?
In Wirklichkeit ist ja die for-Schleife immer die selbe, also mußt Du nur den Test, welche Einträge ausgewählt werden, in eine Funktion stecken:

Code: Alles auswählen

def set_cells(table, row, *args):
    for i, value in enumerate(args):
        table.setCellText(row, i, str(value))

def clickrow(table, beamqdivbya, Qchosen,
        Qcont, A1, nameiso, abu, qdivbya, abu2, information, A, diffqa0,
        check3, check4, factor, betaS, geff, Lambda, phi,
        minimumf, maximumf, cavmaxreal, combo):
    TESTS = {
        "all": lambda a,b,c,d,e: True,
        "stable": lambda a,b,c,d,e: float(e)>0
    }
    
    test = TESTS[combo]
    
    result = []
    for a,b,c,d,e in zip(qdivbya,Qcont,nameiso, A1,abu2):
        if test(a,b,c,d,e):
            diffqa = abs(beamqdivbya - a )
            if diffqa < diffqa0:
                diffqaoverqa = float(diffqa)/float(Qchosen)* A
                result.append(a)
                set_cells(table, len(result)-1, c, b, d, a, diffqaoverqa, e)
    return result
Ich hab noch ein paar fehlende Parameter für »clickrow« ergänzt, die sollten auch nicht als globale Variablen irgendwo herumfliegen. Welche Zeilen werden da geclickt?
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

wow, dein code sieht sehr elegant und komptakt aus. Danke!
Momentan liefert mir das Programm(CSS) einen Error
An error has occurred. See error log for more details.
TypeError: None required for void return
ich habe es jetzt einfach so probiert, dass ich die set_cells(table1, row, *args)-Funktion in meiner

Code: Alles auswählen

def main():
    Qcont, A1, Around, nameiso, abu, qdivbya, abu2, information = readcontaminationfile()
    cavmaxCSS, cavmaxreal, factor = readcavmaxfile()
    betaS, geff, Lambda, phi, Qin, A, E, Ein, minimumf, maximumf, Vebitmax, check2, check1, check3, check4, \
           number, minnumber, maxnumber, diffqa0, cavlist, combo = getInputs(A1, Around, nameiso, Qcont, factor)
    alarm(cavlist, cavmaxCSS, number)
    decision(betaS, geff, Lambda, phi, Qin, A, E, Ein, minimumf, maximumf, Vebitmax, check2, check1, check3, check4,\
             number, minnumber, maxnumber, cavlist, factor, cavmaxCSS, cavmaxreal)
    clickrow(table1, Qcont, A1, nameiso, abu, qdivbya, abu2, information, A, diffqa0, check3, check4, factor, \
             betaS, geff, Lambda, phi, minimumf, maximumf, cavmaxreal, combo)
main funktion stehen habe ohne sie extra aufzurufen. --> also ich habe sie vor der clickrow-Funktion ohne sie oben nochmal aufzurufen.
Antworten