3

私のコードでは、アイテムpercentgradeはforループの各反復でリストlnpercentgradeに追加されていませんが、理由はわかりません。lnpercentgrade(コードの最後)の項目を合計しようとすると、lnpercentgradeがempyであるため、0が返されます。maininput()関数の外部でグローバル変数としてlnpercentgradesを宣言しています。そうしないと、コードの下部でsum(lnpercentgrades)を実行しようとすると、「lnpercentgradesnotdefined」が返されます。

.append関数の前に正しく入力したと確信しているにもかかわらず、lnpercentgradesはmaininput()関数内で何らかの形で変更されていないと推測しています。

私が実際にやろうとしているのは、sum(lnpercentgrades)を100と一致させることですが、値が20の5つの項目をすべて入力すると、合計は100ではなく0になります。

重要な行は矢印でマークされています<<<<<<<<<<<<<<<<<<<<<

lnpercentgrades = []   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
def maininput():
    numtests = int(input("Enter # of tests:"))
    numassign = int(input("Enter # of assignments:"))
    numquizzes = int(input("Enter # of quizzes:"))
    numlabs = int(input("Enter # of labs:"))

    l = [numtests, numassign, numquizzes, numlabs]
    ln = ["test", "assignments", "quizzes", "labs"]
    lnpercentgrades = [] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    testwavg = None
    numassignwavg = None
    numquizzeswavg = None
    numlabswavg = None
    numfinalwavg = None

    lnwavg = [testwavg, numassignwavg, numquizzeswavg, numlabswavg]
    print(l[0])
    print("Is there a separately weighted final?")
    yn = int(input("Enter 1 for yes. 2 for no:"))
    while (yn > 2 or yn < 1):
        yn = int(input("Enter 1 for yes. 2 for no, please:"))

    n = 4 
    if yn == 1:
        final = 1
        l.append(final)
        ln.append("final")
        lnwavg.append(numfinalwavg)
        n = 5


    for i in range (n):
        if l[i] > 0:
            print("Enter % of total grade of",ln[i],":") 
            percentgrade = float(input("")) 
            print("you inputed:", percentgrade)
            lnpercentgrades.append(percentgrade) <<<<<<<<<<<<<<<<<<<<<<
            percentgrade = percentgrade*.01 


            varscoreslist = []
            for x in range(l[i]):
                print("Enter score of", ln[i], x+1,"as a fraction:")
                from fractions import Fraction
                inputfrac = input("")
                varscore = float(sum(Fraction(s) for s in inputfrac.split())) 
                #the above converts fractional inputs to decimals
                varscoreslist.append(varscore)

            if ln[i] == "labs":
                score = sum(varscoreslist)
            else:
                sumscores = sum(varscoreslist)
                score = sumscores/l[i]

            lnwavg[i] = score*percentgrade

maininput()
print(lnpercentgrades)
print("sum of percent of grades", sum(lnpercentgrades)) <<<<<<<<<<<<<<<

if float(sum(lnpercentgrades)) != 100:  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    print("Sorry, the grade percent of each item enter did not sum to 100:")
    print("Program will rerun.")
    input("")
    maininput()

coursegrade = sum(lnwavg)
print("Your course grade is:", coursegrade)

input("")
4

1 に答える 1

8

一見すると、スコーピングの問題があるように見えます。関数内でリストを変更していますが、これはリストのローカルコピーであることに注意してください。外側のスコープで宣言しているにもかかわらず、前にを付けていませんglobal。つまり、代わりに関数ローカルコピーを作成し、ビジネスを実行してから終了し、「メイン」リストにはまったく影響しません。

必要なリストを返すように関数を変更して、期待どおりに使用できるようにすることをお勧めします。基本的な例を次に示します。

def MyFunc():
    l1 = ['my', 'first', 'list']
    l2 = ['another', 'list']
    return l1, l2

main_list, second_list = MyFunc()

print(main_list)
print(second_list)

出力されます:

['my', 'first', 'list']
['another', 'list']

変数を本当に外側のスコープに保持したい場合はglobal、関数の内側で前に付ける必要があります(ただし、おそらく最初のメソッドを使用します)。

main_list = []
second_list = []

def MyFunc():
    global main_list
    global second_list
    main_list = ['more', 'good', 'stuff']
    second_list = ['another', 'list']


MyFunc()

print(main_list) # ['more', 'good', 'stuff']
print(second_list) # ['another', 'list']
于 2012-11-20T02:30:29.773 に答える