2012-11-20 162 views
1

在我的代碼中,項目百分比不添加到for循環的每次迭代中的列表lnpercentgrade,但我不知道爲什麼。當我嘗試在lnpercentgrade(代碼結尾)中彙總項目時,我返回0,因爲lnpercentgrade是empy。 我將lnpercentgrades聲明爲maininput()函數之外的全局變量,因爲否則在代碼底部時,當我嘗試求和(lnpercentgrades)時,我返回「lnpercentgrades not defined」。項目不附加到列表,或列表返回爲空python?

我猜在maininput()函數內部不會修改lnpercentgrades,儘管我確信我在.append函數之前正確地輸入了它。

什麼我真的想做的是與100相匹配的總和(lnpercentgrades),但是當我進入5個項目全部爲20的值,總和爲0,而不是100

重要線路都標用箭頭< < < < < < < < < < < < < < < < < < < < <

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("") 
+0

爲什麼不把它作爲返回函數結果 - 那麼你並不需要的功能 –

+0

RocketDonkey人之前指定它準備完成你需要的所有解釋 –

回答

6

乍一看,它看起來像你可能有一個範圍界定問題。您正在修改函數內部的列表,但請記住這是列表的本地副本。儘管你在外部範圍聲明它,但你並沒有用global來表示它,這意味着它會創建一個函數本地副本,完成它的業務然後退出,而不會影響'main'列表。

我會建議修改你的函數來返回你想要的列表,以便你可以像預期的那樣使用它們。這是一個基本的例子:

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'] 
+0

嗯......進出是幹什麼的? – LazerSharks

+0

@ShaltNot對不起,這可能比它需要更混亂 - 那就是使用IPython解釋器。我將用您將放在模塊中的東西來替換。 – RocketDonkey

+0

好的,我很欣賞幫助。如果您願意,您仍然可以保留當前代碼,並添加其他版本。儘管我會嘗試全局變量。 – LazerSharks