-1

編集:別の方法で解決 grades=[71,70,72] results=['y','n','x'] for index, grade in enumerate(grades): grades.index(grade) if grade in grade: grade=input('grade: ') print (grades[index], results[index]) ................................... ................................................................... ……

私のコードは与えるはずだった

>>>71
[71, 'y']
>>>70
[70, 'n']
>>>72
[72, 'error']

しかし、if ステートメントからランダムな (?) 値を取ります。それは与えます

>>> 
grade: 71
[72, 'n']
grade: 

また、input() 行で EOFerror が発生し、raw_input() を配置した場合も同じです。

コードは次のとおりです。

grades = [70,71,72]
result1 = 'y'
result2 = 'n'
result3 = 'error'
r = 'x'
grade = input('grade: ')

def get_result(r):   
    """
    (str) -> (str)
    you're in or out

    >>>71
    [71, 'y']

    >>>70
    [70, 'n']

    >>>72
    [72, 'error']

    """

    r = 'x'
    for grade in grades:
        list=[grade, r]

        if grade is 71:
            r = result1             
        elif grade is 70:
            r = result2           
        else:
            r = result3           
    return(list)
print(get_result(r))
4

1 に答える 1

4
r = 'x'
for grade in grades:
    list=[grade, r]

    if grade is 71:
        r = result1             
    elif grade is 70:
        r = result2           
    else:
        r = result3
return(list)

の古い値で既に作成しており、 の新しい値で何もしないため、これらのifステートメントは何も変更しません。list=[grade, r]rr

ステートメントのlist=[grade, r]後に移動してみてください。if

ただし、実際には変数に名前を付けるべきではありませんlist。これは組み込み型の名前だからです。

また、変数に対して何もせずに返すので、実際には必要ありません。

そう:

    if grade is 71:
        r = result1             
    elif grade is 70:
        r = result2           
    else:
        r = result3
    return [grade, d]

ただし、コードには他にもいくつかの問題があります。grades1 つには、それぞれが を再定義する をループしているlistため、最後のものだけを返すことになります。では、ループのポイントは何ですか? 私はあなたがこのようなものが欲しいと思います:

retval = []
for grade in grades:
    r = 'x'
    if grade is 71:
        r = result1             
    elif grade is 70:
        r = result2           
    else:
        r = result3
    retval.append([grade, r])
return retval

また、結果を 3 つの個別の変数ではなく、 に入れることを検討するdictこともできます。これにより、コードが大幅に簡素化されます。

results = { 71: 'y', 70: 'n', 72: 'error' }
retval = []
for grade in grades:
    retval.append([grade, results.get(grade, 'x')])
return retval

そして、「空のリストを作成し、それに追加するための簡単なループを実行する」というパターンが、まさにリスト内包表記の目的であることに気付くかもしれません。したがって、これをさらに簡単にすることができます。

results = { 71: 'y', 70: 'n', 72: 'error' }
return [[grade, results.get(grade, 'x')] for grade in grades]

一方、パラメータにアクセスすることはなく、実際にはローカル変数に再バインドするのに、なぜにrパラメータを渡すのですか? (または同様のツールを実行すると、このような問題が検出されます。) 本当に必要なのはパラメーターでしょうか?get_resultrpylintgrades

後のコメントから、実際に必要なのはgradeパラメーターのように聞こえるため、特定のグレードの結果を取得できます。そのためにすべてのグレードをループする必要はありません。少し書き直してみましょう。

def get_result(grade):
    return [grade, results.get(grade, 'x')]

それでおしまい。さて、スクリプト全体は次のとおりです。

results = { 71: 'y', 70: 'n', 72: 'error' }

def get_result(grade):
    return [grade, results.get(grade, 'x')]

grade = input('grade: ')
print(get_result(grade))
于 2012-12-13T21:13:11.730 に答える