zallke
zallke

Reputation: 49

How do I get a function that is called within another function to return a value? PYTHON

I am working on a roman number converter + roman number calculator project.

I am now stuck on the calculator part, because I cannot get the functions to return the values I need to continue.

The way I have done it is that I have defined a bunch of functions. This is the order I call them.

romanCalculator(number,operator)

This function takes the input number, say x+v. Devides them into 2 romen numbers, num1=x, num2=v.

These numbers are then separatly sent to romanValidation(num1)

This function checks if the input roman number is a real roman number and then sends them of to a third function romanTOarab(num1). This is where the problem starts.

romanTOarab(num1) converts the roman number to an arab number, so num1=x would become 10. I want the romanTOarab(num1) to return the value of num1 and num2 to the function romanCalculator(number,operator) so that I within romanCalculator(number,operator) can write somthing like:

num1Trans = romanValidation(num1)

num2Trans = romanValidation(num2)

And the should make the value of num1Trans = 10 and num2Trans = 5. However when I run my code and print num1Trans or num2Trans all I get is None.

How do I fix this?

Also, you have to excuse my english! :) Here is the code I wrote for all the functions mentioned.

def romanCalculator(number,operator):

    number = number.replace(" ", "")                                
    num1,num2 = number.split(operator)                              


    num1Trans = romanValidation(num1)
    num2Trans = romanValidation(num2)

    print(num1, ":" ,num1Trans)
    print(num2, ":" ,num2Trans)
    print(operator)

def romanValidation(number):

    i = 0 

    while i < len(number):

        s = number[i]

        if i < (len(number)-1):                                     # Kollar så att det är fler än en bokstav.

            if letterMap[s] < letterMap[number[i+1]]:               # Kollar ifall bokstaven som ska analyseras är mindre än den efter.
                temp = letterMap[number[i+1]] - letterMap[s]        # Tar ut skillnaden mellan dem i värde.
                control = temp / 10**(len(str(temp))-1)             # Gör om skillnaden så att den alltid blir i storleksordning 10^0.

                if control == 9.0 or control == 4.0:                # Om kontrollen är ==9 eller ==4 så kommer bokstäverna i en giltig följd.
                    try:
                        temp = letterMap[number[i+2]]               # Testar om det finns en tredje boskav efter den andra.
                        print(temp)
                        if letterMap[s] <= temp:                    # Testar om denna tredje boskatav är störren än den första,
                            print(SPACE,number,WRONG)               # Om så är fallet är det inget giltigt tal.
                            print("Ett romerskt tal kan bara ha en mindre siffra följt av en större siffra.")
                            main()
                    except:                                         # Om allt är som det ska hoppar vi över den andra bosktaven eftersom den nu också är analyserad.
                        pass
                        #i += 1
                else:
                    print(SPACE,number,WRONG)
                    print("Skilladen mellan mellan en mindra siffra och en större siffrar får endast vara 4*10^x eller 9*10^x.")
                    main()

            elif letterMap[s] == letterMap[number[i+1]]:            # Testar om följaden bosktav är av samma storlek som den som analyseras.

                i += 1                                              # Hoppar en boskatav fram i talet.
                temp = letterMap[s]

                if temp == 5 or temp == 50 or temp == 500:
                    print(SPACE,number,WRONG)
                    print("Romerska tecknena V, L och D får inte komma som 2 likada i följd. (ex: VV eller DD.)")
                    main()

                try:
                    temp = letterMap[number[i+1]]                   # Testar om det är 3 likadan bokstäver i följd.
                    if letterMap[s] == letterMap[number[i+1]]:
                        i += 1

                    elif letterMap[s] < temp:                      # Testar om denna tredje boskatav är störren än den första,
                            print(SPACE,number,WRONG)               # Om så är fallet är det inget giltigt tal.
                            print("Ett romerskt tal kan bara ha en mindre siffra följt av en större siffra.")
                            main()
                except:
                    pass

                try:
                    temp = letterMap[number[i+1]]                   # Testar om det kommer 4 likadana boksträver i följd.
                    if letterMap[s] == letterMap[number[i+1]]:
                        print(SPACE,number,WRONG)
                        print("Ett romerskt tal kan max innehålla samma tecken 3 gånger på rad.")
                        main()

                    elif letterMap[s] < temp:                       # Testar om denna tredje boskatav är störren än den första,
                            print(SPACE,number,WRONG)               # Om så är fallet är det inget giltigt tal.
                            print("Ett romerskt tal kan bara ha en mindre siffra följt av en större siffra.")
                            main()

                except:
                    pass

        i += 1    

    romanTOarab(number)

def romanTOarab(number):

    total = 0
    i = 0


    while i < len(number):

        s = number[i]
        if i < (len(number)-1):                                     # För att kunna köra tal som bara innehåller ett tecken.

            if letterMap[s] < letterMap[number[i+1]]:               # Kollar när ett mindre tal är följt av ett större (IV = 5-1 = 4)
                total += (letterMap[number[i+1]] - letterMap[s])
                i += 1                                              # Eftersom att denna sats kollar 2 tecken på samma gång så hopper vi över det andra.

            else:
                total += letterMap[s]                               # Alla andra tecken är bara att rakt översätta och lägga på totalen.

        else:
            total += letterMap[s]                                   # När det bara är ett tal som ska översättas.


        i += 1


    print("Resultat:",total)

    return total   

Upvotes: 1

Views: 141

Answers (1)

brianmearns
brianmearns

Reputation: 9967

Very simple fix, you just left out the return in romanValidation. The last line of this function should be changed from

romanTOarab(number)

to

return romanTOarab(number)

Upvotes: 2

Related Questions