web-dev-qa-db-ja.com

採点システム機能で繰り返しif-Elifステートメントを簡略化するにはどうすればよいですか?

目標は、スコアを「0から1」のシステムから「FからA」のシステムに変換するプログラムを構築することです。

  • score >= 0.9は「A」を出力します
  • score >= 0.8は「B」を出力します
  • 0.7、C
  • 0.6、D
  • そして、そのポイントを下回る任意の値、Fを出力します

これはそれを構築する方法であり、プログラムで動作しますが、いくぶん反復的です:

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を掛けてからスコアを検索します。

0
pylang

次に、より簡潔で理解しにくいアプローチをいくつか示します。

最初のソリューションでは、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行でライブラリなしで問題を解決しようとする試みです(ライブラリの使用は悪いとは言いません)。

0
Fizzlebert

以下が役立つことを願っています: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')

0
Amanda