BMI ausrechnen... etwas optimieren!

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 28. Juli 2006, 12:52

DatenMetzgerX hat geschrieben:

Code: Alles auswählen

gewicht = float(string.replace(gewicht, ',', '.')) #Ersetzt das Komma durch einen Punkt
groesse = float(string.replace(groesse, ',', '.'))

Kleine Sache:
string.replace ist deprecated. Entweder str.replace nehmen oder gleich gewicht.replace(',', '.').
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Freitag 28. Juli 2006, 13:15

Danke ;)

gleich mal umgeschrieben.


So und mein Problem mit der EXE ich weiß nicht warum aber ich finds komisch. Ich habe Pyinstaller nun mal doch auf dem Notebook(Windows) auisgeführt und es klappt einwandfrei. Aber wenn ich es wieder unter Linux zur EXE mache klappt es wieder nicht. Auch der Inhalt ist komplett anders.

Kann es sein das ich unter Linux nicht wirklich eine EXE für Windows XP machen kann?

MfG ChrissiG
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Mittwoch 2. Mai 2007, 14:49

Ich trau mich jetzt einfach mal zu einer Neuauflage... ;)

Nur... ganz funktionieren tut das noch nicht. Ich habe endlich mal eine Möglichkeit gefunden, wo ich mich mal an 'lambda' Ausdrücken ausprobieren kann. Nur... ich habs einfach nicht drauf.

Wo habe ich meine Lambda's falsch definiert? Sieht jemand von euch eventuell den Fehler?


Code: Alles auswählen

# -*- coding: cp1252 -*-
# den BMI des Menschen ausrechnen
# BMI = Körpergewicht : (Körpergröße in m)²

import re, sys

POS = {
    'Untergewicht': (lambda x,y: x<20 and y<19),
    'Normalgewicht': (lambda x,y: (x in range(20, 25)) and (y in range(19,24))),
    'Übergewicht': (lambda x,y: (x in range(25, 31)) and (y in range(24,31))),
    'Adipositas': (lambda x,y: (x in range(30, 41)) and (y in range(30,41))),
    'massive Adipositas': (lambda x,y: x>40 and y>40),
}

def check_input(data):
    return round(float(re.sub(r'[a-zA-Z_]+', '', data).replace(',', '.')))

def create_bmi_table():
    result = []
    for i in xrange(6):
        result.append([14 + i * 10, 24 + i * 10, 19 + i])
    result[0][0] = 0
    result[-1][1] = sys.maxint
    return result

def main():
    print 'Mit diesem Programm wird Ihr BMI (Body Mass Index) ausgerechnet'
    print '--------------------------------------------------------------'

    weight = check_input(raw_input('Geben Sie bitte Ihr Körpergewicht an: '))
    height = check_input(raw_input('Geben Sie bitte Ihre Körpergröße(in Meter) an: '))
    bmi = weight / (height**2)
    print 'Ihr BMI ist %.2f' % bmi
    print 'Bitte geben Sie ihr alter an:'
    age = check_input(raw_input(' '))
    bmi_table = create_bmi_table()
    for floor, cap, bmi_floor in bmi_table:
        if floor < age < cap:
            print ('Ihr BMI-Wert sollte Ihrem Alter entsprechend zwischen'
                   ' %d und %d liegen.' % (bmi_floor, bmi_floor + 5))

    # Hier kommt mein Problem... wo hab die die lambda's falsch definiert?
    print
    for x in POS:
        print "Sie haben %s: %s" % (x, POS[x](bmi, age))

if __name__ == '__main__':
    main()


MfG EnTeQuAk

€dit: BMI == Body Mass Index...
Danke, birkenfeld! *g*
Zuletzt geändert von EnTeQuAk am Mittwoch 2. Mai 2007, 14:54, insgesamt 3-mal geändert.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Mittwoch 2. Mai 2007, 14:50

Das Ding heißt übrigens "Body Mass Index"... ;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 2. Mai 2007, 14:59

EnTeQuAk hat geschrieben:Wo habe ich meine Lambda's falsch definiert? Sieht jemand von euch eventuell den Fehler?


Ich glaube du hast die range-Funktion noch nicht richtig verstanden.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Mittwoch 2. Mai 2007, 14:59

HAAALT Komando zurück ;)

Diese Abfrage ist stuss, stuss und nichts als stuss *g*
http://www.uni-hohenheim.de/wwwin140/in ... es/bmi.htm

Sagt, das das nicht mit Alter<==>BMI zu tun hat, sondern mit Mänlich und Weiblich ... gut... gleich mal umschreiben *g*


€dit:
Ich glaube du hast die range-Funktion noch nicht richtig verstanden.

Nicht?
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Mittwoch 2. Mai 2007, 15:11

Und so funktioniert nun meine Neuauflage, für die BMI-Berechnung.

Code: Alles auswählen

# -*- coding: cp1252 -*-
# den BMI des Menschen ausrechnen
# BMI = Körpergewicht : (Körpergröße in m)²

import re, sys

POS = {
    'Untergewicht': (lambda g,b,a: (g=='m' and b<20) or (g=='w' and b<19)),
    'Normalgewicht': (lambda g,b,a: (g=='m' and b in range(20, 26)) or (g=='w' and (b in range(19,25)))),
    'Übergewicht': (lambda g,b,a: (g=='m' and b in range(25, 31)) or (g=='w' and (b in range(24,31)))),
    'Adipositas': (lambda g,b,a: (g=='m' and b in range(30, 41)) or (g=='w' and (b in range(30,41)))),
    'massive Adipositas': (lambda g,b,a: b>40),
}

def check_input(data):
    return round(float(re.sub(r'[a-zA-Z_]+', '', data).replace(',', '.')))

def create_bmi_table():
    result = []
    for i in xrange(6):
        result.append([14 + i * 10, 24 + i * 10, 19 + i])
    result[0][0] = 0
    result[-1][1] = sys.maxint
    return result

def main():
    print 'Mit diesem Programm wird Ihr BMI (Body Mass Index) ausgerechnet'
    print '--------------------------------------------------------------'

    weight = check_input(raw_input('Geben Sie bitte Ihr Körpergewicht an: '))
    height = check_input(raw_input('Geben Sie bitte Ihre Körpergröße(in Meter) an: '))
    bmi = weight / (height**2)
    print 'Ihr BMI ist %.2f' % bmi
    print 'Bitte geben Sie ihr alter an:'
    age = int(check_input(raw_input(' ')))
    gender = raw_input("Ihr geschlecht (m, w): ")
    bmi_table = create_bmi_table()
    for floor, cap, bmi_floor in bmi_table:
        if floor < age < cap:
            print ('Ihr BMI-Wert sollte Ihrem Alter entsprechend zwischen'
                   ' %d und %d liegen.' % (bmi_floor, bmi_floor + 5))
    print
    for x in POS:
        print "Sie haben %s: %s" % (x, POS[x](gender, int(bmi), age))

if __name__ == '__main__':
    main()


Nun mag ich aber eure Verbesserungsvorschläge hören?

MfG EnTeQuAk

€dit: nur nen blöödes kommentar rausgemacht
Zuletzt geändert von EnTeQuAk am Mittwoch 2. Mai 2007, 15:33, insgesamt 2-mal geändert.
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 2. Mai 2007, 15:13

EnTeQuAk hat geschrieben:Nicht?


Ich habe es mir nicht im Detail angeschaut, aber es sieht so aus, als versuchst du einen Test der Art: FLOAT in range(...)

Im Speziellen meine ich die Zeile 46:

Code: Alles auswählen

POS[x](bmi, age)


Falls ich die Umwandlung in einen Integer nicht gesehen habe, darfst du mir gerne sagen wo, Suchen ist mir zu anstrengend :D
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Beitragvon Sr4l » Mittwoch 2. Mai 2007, 15:13

Ich habe Py2Exe auf Linux laufen.

Habe dazu folgendes gemacht:
pwe Wine python25 .msi installiert
per wine die dazugehörende py2exe .exe
und nun kann ich auch per Wine die python.exe ansprechen bzw. auch PythonWin32 ;-)

WINE ist schon sehr schick.

zu dem %f

Code: Alles auswählen

>>> x = 5
>>> print "H: %s"%x
H: 5
>>> print "H: %i"%x
H: 5
>>> print "H: %f"%x
H: 5.000000


%s = Strings
%i Ganzezahlen (intergers)
%f = Flieskommazahlen (floats)
%d = double ~ Übersetzung? ^^

PS: Kann es sein EnTeQuAk das du unter falschen Nick schreibst? Du sagt das Forum ist Klasse hast aber schon 600 Posts :-D, oder kann man das einfach nicht oft genug sagen :-D ?
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Mittwoch 2. Mai 2007, 15:20

Huch, da kommen ja ganz alte Sachen wieder hoch... ;)

@Sr4l: Supi --> gleich mal ausprobieren, wenn ich wieder zu Hause bin... :)

@EyDu: Allerdings... das war mein Fehler *g* --> hab ihn aber vorher gefunden. Wie 'rage' funktioniert, weiß ich ja... nur daran habe ich nicht gedacht.


Alles in Allem ein schönes Programm geworden ;)
(siehe letzter Post von mir!)

Ich musste den Thread einfach vortführen... sonst währ ich hier auf Arbeit eingeschlafen ...


MfG EnTeQuAk

€dit:
PS: Kann es sein EnTeQuAk das du unter falschen Nick schreibst? Du sagt das Forum ist Klasse hast aber schon 600 Posts Very Happy, oder kann man das einfach nicht oft genug sagen?

Früher hieß ich hier mal 'ChrissiG' :) Und schau mal auf das Datum... das ist ein Thread, aus meinen Anfangszeiten... nein.. das war sogar mein erstes "richtiges" Pythonprogramm, was ich geschrieben habe.(damals!)

Und ansonsten.... nein!, das kann man nicht oft genug sagen. Das Forum hier ist KLASSEEEE!
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Beitragvon joost » Mittwoch 2. Mai 2007, 15:31

Die lambdas sind richtig, in den jeweils letzten Klammern meintest Du wohl a statt x - damit ist auch range() richtig eingesetzt.

bmi = float(weight) / float((height/100)**2)
print 'Ihr BMI ist %2f' % float(bmi)

Probleme gibts unten - und an anderer Stelle als Dein Kommentar. Das hier funktioniert schon besser (bitte genau hinsehen):

Code: Alles auswählen

    bmi = float(weight) / float((height/100)**2)
    print 'Ihr BMI ist %2f' % float(bmi)
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Mittwoch 2. Mai 2007, 15:35

joost hat geschrieben:Die lambdas sind richtig, in den jeweils letzten Klammern meintest Du wohl a statt x - damit ist auch range() richtig eingesetzt.

siehe letzte Version *g* habs ja selber gefunden...
und äähm --> nein... 'b' statt 'x' wäre richtig gewesen ;)
bmi = float(weight) / float((height/100)**2)
print 'Ihr BMI ist %2f' % float(bmi)

Probleme gibts unten - und an anderer Stelle als Dein Kommentar. Das hier funktioniert schon besser (bitte genau hinsehen):

Code: Alles auswählen

    bmi = float(weight) / float((height/100)**2)
    print 'Ihr BMI ist %2f' % float(bmi)


Hmm? 'check_input', gibt mir ne wunderschöne 'float' Zahl zurück. Daher brauche ich das nicht mehr so umständlich machen ;)

MfG EnTeQuAk
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Mittwoch 2. Mai 2007, 15:43

So... nochmal eine kleine Fehlerbereinigte Version, wo die Ausgabe auch wieder schön ist:

Code: Alles auswählen

# -*- coding: cp1252 -*-
# den BMI des Menschen ausrechnen
# BMI = Körpergewicht : (Körpergröße in m)²

import re, sys

POS = {
    'Untergewicht': (lambda g,b,a: (g=='m' and b<20) or (g=='w' and b<19)),
    'Normalgewicht': (lambda g,b,a: (g=='m' and b in range(20, 26)) or (g=='w' and (b in range(19,25)))),
    'Übergewicht': (lambda g,b,a: (g=='m' and b in range(25, 31)) or (g=='w' and (b in range(24,31)))),
    'Adipositas': (lambda g,b,a: (g=='m' and b in range(30, 41)) or (g=='w' and (b in range(30,41)))),
    'massive Adipositas': (lambda g,b,a: b>40),
}

def check_input(data):
    return float(re.sub(r'[a-zA-Z_]+', '', data).replace(',', '.'))

def create_bmi_table():
    result = []
    for i in xrange(6):
        result.append([14 + i * 10, 24 + i * 10, 19 + i])
    result[0][0] = 0
    result[-1][1] = sys.maxint
    return result

def main():
    print 'Mit diesem Programm wird Ihr BMI (Body Mass Index) ausgerechnet'
    print '--------------------------------------------------------------'

    weight = check_input(raw_input('Geben Sie bitte Ihr Körpergewicht an: '))
    height = check_input(raw_input('Geben Sie bitte Ihre Körpergröße(in Meter) an: '))
    bmi = weight / (height**2)
    print 'Ihr BMI ist %.2f' % bmi
    print 'Bitte geben Sie ihr alter an:'
    age = int(check_input(raw_input(' ')))
    gender = raw_input("Ihr geschlecht (m, w): ")
    for x in POS:
        if POS[x](gender, int(bmi), age):
            print 'Sie haben %s... und...' % x
    bmi_table = create_bmi_table()
    for floor, cap, bmi_floor in bmi_table:
        if floor < age < cap:
            print ('... Ihr BMI-Wert sollte Ihrem Alter entsprechend zwischen'
                   ' %d und %d liegen.' % (bmi_floor, bmi_floor + 5))
    print

if __name__ == '__main__':
    main()


Viel Spaß, beim ausprobieren!
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Beitragvon joost » Mittwoch 2. Mai 2007, 16:12

EnTeQuAk, darum ging es nicht. Es geht um den gestrichenen Punkt in '%2f' und die '/100'.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Beitragvon Sr4l » Mittwoch 2. Mai 2007, 16:35

Ich muss mich korrigieren mit Py2Exe schaffe ich es nicht eine EXE unter Linux zu builden. Aber der Fehler ist warscheinlich nicht das es nicht geht. Man muss sicherlich nur den Code etwas anpassen. Es gibt einen nicht implementiert Error nach dem er die benötigten Datein hat und versucht sie zusammen zu kopieren.

Spielt auch keine Rolle, weil ich gerade ein Tkinter Exe und eine Consollen Exe unter Linux mit Pyinstaller gebuildet habe und sie laufen mit WINE unter Linux und auch auf Windows (getestet mit XP SP.1)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]