目標は、スコアを「0から1」のシステムから「FからA」のシステムに変換するプログラムを構築することです。
score >= 0.9
は「A」を出力しますscore >= 0.8
は「B」を出力しますこれはそれを構築する方法であり、プログラムで動作しますが、いくぶん反復的です:
if scr >= 0.9:
print('A')
Elif scr >= 0.8:
print('B')
Elif scr >= 0.7:
print('C')
Elif scr >= 0.6:
print('D')
else:
print('F')
複合ステートメントが繰り返しにならないように関数を作成する方法があるかどうか知りたいのですが。
私は完全に初心者ですが、次のようになります:
def convertgrade(scr, numgrd, ltrgrd):
if scr >= numgrd:
return ltrgrd
if scr < numgrd:
return ltrgrd
可能ですか?
ここでの意図は、後で引数としてscr、numbergrade、およびletter gradeを渡すだけで呼び出すことができるようにすることです。
convertgrade(scr, 0.9, 'A')
convertgrade(scr, 0.8, 'B')
convertgrade(scr, 0.7, 'C')
convertgrade(scr, 0.6, 'D')
convertgrade(scr, 0.6, 'F')
より少ない引数を渡すことが可能である場合、それはさらに良いでしょう。
辞書を使用できます。
コード
def grade(score):
"""Return a letter grade."""
grades = {100: "A", 90: "A", 80: "B", 70: "C", 60: "D"}
return grades.get((score // 10) * 10, "F")
デモ
[grade(scr) for scr in [100, 33, 95, 61, 77, 90, 89]]
# ['A', 'F', 'A', 'D', 'C', 'A', 'B']
スコアが実際に0と1の間にある場合は、最初に100を掛けてからスコアを検索します。
次に、より簡潔で理解しにくいアプローチをいくつか示します。
最初のソリューションでは、math
ライブラリからのfloor関数を使用する必要があります。
from math import floor
def grade(mark):
return ["D", "C", "B", "A"][min(floor(10 * mark - 6), 3)] if mark >= 0.6 else "F"
そして、何らかの理由でmath
ライブラリのインポートが面倒な場合。あなたはfloor関数に回避策を使うことができます:
def grade(mark):
return ["D", "C", "B", "A"][min(int(10 * mark - 6) // 1, 3)] if mark >= 0.6 else "F"
これらは少し複雑なので、何が起こっているのかを理解していない限り、使用しないことをお勧めします。これらは、等級の増分が0.1であるという事実を利用する特定のソリューションです。つまり、0.1以外の増分を使用しても、この手法では機能しない可能性があります。また、マークをグレードにマッピングするための簡単なインターフェースもありません。 bisectを使用したdawgによる解決策などのより一般的な解決策は、おそらくより適切であるか、schwobasegglの非常にクリーンな解決策です。なぜ私がこの答えを投稿しているのか本当にわかりませんが、Pythonの多用途な性質を示す1行でライブラリなしで問題を解決しようとする試みです(ライブラリの使用は悪いとは言いません)。
以下が役立つことを願っています:if scr> = 0.9:print( 'A')Elif 0.9> scr> = 0.8:print( 'B')Elif 0.8> scr> = 0.7:Print( 'C')Elif 0.7 scr> = 0.6:print( 'D')else:print( 'F')