環境
Windows10
Anaconda5.0.1
Python3.6.5
XAMPPを利用してのローカル環境でのテストとなってます。
発生している問題・エラーメッセージ
割り出されたBMIをもとに「痩せすぎ」「普通」「肥満」などの分類も表示しようと思ったのですが、これが想定通りに動作しません。
フォームに height(身長)「100」(cm表記です), weight(体重)「10」と入力した場合、
BMI[10.0] Status[痩せすぎ]
という結果を想定していたのですが実際には
BMI[10.0] Status[痩せ]
と出力されます。BMIが1.0でも3.5でも同様で「痩せすぎ」が出力されるほしい部分すべてが「痩せ」と出力されてしまいます。
しかし他の「痩せ気味」「普通」「前肥満」、以降すべての要素は正しい結果出力がなされます。
問題はソースコード二つ目(bmi.py)の、辞書型を参照している変数 bmi_status にあると思うのですがなぜそのような動作になるのかがわかりません。
該当のソースコード
html
1<--index.html--> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Brython test</title> 6 <script type="text/javascript" src="./brython_files/brython.js"></script> 7 <script type="text/javascript" src="./brython_files/brython_stdlib.js"></script> 8 </head> 9 10 <body onload="brython()"> 11 <script type="text/python" src="./bmi.py"></script> 12 <h3>BMIを計算します。</h3> 13 <input type="text" id="height" placeholder="height [cm]" /> 14 <br><input type="text" id="weight" placeholder="weight [kg]" /> 15 <br><button id="execute">計算!</button> 16 17 <br><input id="result"> 18 </body> 19</html>
python
1# bmi.py 2# coding: utf-8 3from browser import document 4 5 6def calc_bmi(): 7 height = float(document["height"].value) / 100.0 8 weight = float(document["weight"].value) 9 10 bmi = weight/(height*height) 11 bmi_status = { 12 15.99: "痩せすぎ", 13 16.99: "痩せ", 14 18.49: "痩せぎみ", 15 24.99: "普通", 16 29.99: "前肥満", 17 34.99: "肥満(1度)", 18 39.99: "肥満(2度)" 19 } 20 21 status_text = "" 22 for status in bmi_status.keys(): 23 if bmi <= float(status): 24 status_text = bmi_status[status] 25 break 26 else: 27 status_text = "肥満(3度)" 28 res = document["result"] 29 res.value = "BMI[{0}] Status[{1}]".format(str(round(bmi, 3)), status_text) 30 31excute_button = document["execute"] 32excute_button.bind("click", calc_bmi) 33
試したこと
まずブラウザのキャッシュで変更が適用されてないのかと思いキャッシュの削除、ブラウザの再起動、複数のブラウザ(Google Chrome, Firefox, Edge)での動作確認をしましたがどれも結果は同様でした。
次に変数bmi_statusを次のように書き換えたところ正しく「痩せすぎ」の」判定が出力されました。
(それに伴い、bmi.pyの判定部分を「if bmi < float(status):」に書き換えました。)
python
1bmi_status = { 2 16.00: "痩せすぎ", 3 17.00: "痩せ", 4 18.50: "痩せぎみ", 5 25.00: "普通", 6 30.00: "前肥満", 7 35.00: "肥満(1度)", 8 40.00: "肥満(2度)" 9 }
しかし気になったので上記の変数の書き換えを行わず判定部分だけ取り出し少し変更を加えてターミナルから実行したところ、こちらは意図した結果の「痩せすぎ」が得られました。コードは以下です。
python
1# bmi_test.py 2# coding: utf-8 3 4def calc_bmi(height, weight): 5 weight = float(weight) 6 height = float(height) / 100.0 7 8 bmi = weight/(height*height) 9 bmi_status = { 10 15.99: "痩せすぎ", 11 16.99: "痩せ", 12 18.49: "痩せぎみ", 13 24.99: "普通", 14 29.99: "前肥満", 15 34.99: "肥満(1度)", 16 39.99: "肥満(2度)" 17 } 18 status_text = "" 19 for status in bmi_status: 20 print(status) 21 if bmi <= status: 22 status_text = bmi_status[status] 23 break 24 else: 25 status_text = "[肥満(3度)]" 26 27 print(status_text) 28 29 30if __name__ == "__main__": 31 calc_bmi(100, 10)
これはどういった理由で「該当のソースコード」で示したコードでは意図した動作にならないのでしょうか。
何か答えになりそうなことに心当たりがございましたらご教示お願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/04 23:13
2018/04/04 23:23
2018/04/05 00:03