JOHN
JOHN

Reputation: 33

python function calculate grades

i want to code python program that calculate grades

first list is final exam grade. second list is homework final grade list.

the wight of the score is 70% for exam grade (list 1) and 30% for homework grade

def func_calc(a,b):

    for i in range(len(a)):
        exam1 = a[i]
        homework1= b[i]
         print(0.70*exam1+0.30*homework1)
    e = [70,80,67,89,100]
    h= [100,80,56,89,100]
    func_calc(e,h)

why the list in main() not working in the func_calc(only one arg sent)?

Upvotes: 2

Views: 264

Answers (6)

Zac Lochhead
Zac Lochhead

Reputation: 56

It's your indentation. Should be:

def func_calc(a,b):

    for i in range(len(a)):
        exam1 = a[i]
        homework1= b[i]
        if a[i] < 60:
            print (a[i])
        else:
            print(0.70*exam1+0.30*homework1)

def main():
    exam = [70,80,67,89,100]
    homework= [100,80,56,89,100]
    func_calc(exam,homework)

main()

Upvotes: 0

Pavel Sem
Pavel Sem

Reputation: 1753

I am not sure what is your background but maybe it helps to understand better if there is used java/c# syntax. Python use indentation to show what belongs to nested block. As you have for and if they will be executed sequentially

def func_calc(a,b):

    for i in range(len(a)):
        exam1 = a[i]
        homework1= b[i]
    if a[i] < 60:
        print (a[i])
    else:
         print(0.70*exam1+0.30*homework1)

rewritten to other language will be executed as

void func_calc(a,b){

    for (i = 0; i < a.Length(a); i++){
        exam1 = a[i]
        homework1= b[i]
    }

    if(a[i] < 60){
        print (a[i])
    }
    else{
         print(0.70*exam1+0.30*homework1)
    }
}

So simply indent if so it is executed as part of your for loop

def func_calc(a,b):

    for i in range(len(a)):
        exam1 = a[i]
        homework1= b[i]
        if a[i] < 60:                         # this is indented
            print (a[i])                      # this is indented
        else:                                 # this is indented
             print(0.70*exam1+0.30*homework1) # this is indented

Equivalent in java/c# will be

void func_calc(a,b){

    for (i = 0; i < a.Length(a); i++){
        exam1 = a[i]
        homework1= b[i]

        if(a[i] < 60){
            print (a[i])
        }
        else{
             print(0.70*exam1+0.30*homework1)
        }
    }
}

Upvotes: 1

imvishi
imvishi

Reputation: 253

Your code indentation is incorrect. Please correct the indentation of if-else part as given below:

def func_calc(a,b):
    for i in range(len(a)):
        exam1 = a[i]
        homework1 = b[i]
        if a[i] < 60:
            print (a[i])
        else:
            print (0.70*exam1+0.30*homework1)

Upvotes: 1

kederrac
kederrac

Reputation: 17322

you are iterating over all your grades and keep only the last one, you can fix this with including your if statement under your for loop


also, you can use a list comprehension :

exam = [70,80,67,89,100]
homework= [100,80,56,89,100]
[0.7*e + 0.3*h if e > 60 else 0.7* e for e, h in zip(exam, homework)]

output:

[79.0, 80.0, 63.7, 89.0, 100.0]

Upvotes: 0

Eric
Eric

Reputation: 1213

Well it doesn't work as your indentation is quite incorrect. You loop over the grades by index assignign them to unused variables. Than you do something with the index outside of the loop (where it is either undefined or takes the last value of the loop so in this case 4). This can be done a lot shorter with a list generator:

def func_calc(a,b):
   return [0.7*exam + 0.3*home if exam >= 60 else exam for exam,home in zip(a,b)]

Upvotes: 1

Badgy
Badgy

Reputation: 819

You forgot to indent your if statement in your loop. Try

    for i in range(len(a)):
        exam1 = a[i]
        homework1= b[i]
        if a[i] < 60:
            print (a[i])
        else:
             print(0.70*exam1+0.30*homework1)

Upvotes: 1

Related Questions