Seite 1 von 1

Funktionen definieren abhaengig von ver. Parametern

Verfasst: Donnerstag 15. August 2013, 20:56
von peter99
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

Re: Funktionen definieren abhaengig von ver. Parametern

Verfasst: Donnerstag 15. August 2013, 20:57
von peter99
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;)

Re: Funktionen definieren abhaengig von ver. Parametern

Verfasst: Donnerstag 15. August 2013, 21:11
von peter99
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)

Re: Funktionen definieren abhaengig von ver. Parametern

Verfasst: Donnerstag 15. August 2013, 21:33
von pillmuncher
@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.

Re: Funktionen definieren abhaengig von ver. Parametern

Verfasst: Freitag 16. August 2013, 00:49
von Sirius3
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?

Re: Funktionen definieren abhaengig von ver. Parametern

Verfasst: Freitag 16. August 2013, 03:18
von peter99
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.