0

I am trying to make a currency calculator on python:

print("Please choose which currency you want to convert:")
print("A - Korean Won to US Dollar (Exchange Rate: 0.000905)")
print("B - Korean Won to Euro (Exchange Rate: 0.000807350908)")
print("C - Korean Won to Japanese Yen (Exchange Rate: 0.0919061643)")
print("D - Korean Won to Chinese RMB (Exchange Rate: 0.00603703605)")
print("E - Quit ")

A=0
B=0
C=0
D=0

usd = 0.000905
eur = 0.000807350908
yen = 0.0919061643
rmb = 0.00603703605

def main():
    (option, amount) = Input()
    Output(totalamount)

def Input():
    option = eval(input("Enter your option: "))
    amount = eval(input("Enter the amoutn in Korean Won: "))
    if option == "A":
        totalamount = (amount * usd)
        print (amount +"Won equals to "+totalamount+" USD")
    elif option== "B":
        totalamount = (amount * eur)
        print (amount +"Won equals to "+totalamount+" Euro")
    elif option== "C":
        totalamount = (amount * yen)
        print (amount +"Won equals to "+totalamount+" Yen")
    elif option== "D":
        totalamount = (amount * rmb)
        print (amount +"Won equals to "+totalamount+" Chinese RMB")
    else:
        quit

main()

I am still learning how to use python, but I am wondering why I get this error whenever I run the program:

TypeError: cannot unpack non-iterable NoneType object

How could I fix this?

7
  • Where does this error appear? Which line? Commented Jun 2, 2020 at 15:24
  • 1
    (option, amount) = Input() That code means you're expecting Input() to return two values, but it returns nothing at all. Commented Jun 2, 2020 at 15:25
  • 1
    Your Input() function always returns None. Perhaps you meant to have return option,amount as the last line of your function. Commented Jun 2, 2020 at 15:25
  • Its on the line 19th where the error appears. Commented Jun 2, 2020 at 15:26
  • What does it say on the 19th line? Commented Jun 2, 2020 at 15:26

3 Answers 3

2

You are returning nothing and putting the output None in two different variables. This is not right. at the end of the funciton add

return option, amount
Sign up to request clarification or add additional context in comments.

Comments

2
def main():
    (option, amount) = Input()
    Output(totalamount)

Here the value to assign option and amount variable should be provided by input() function but as you can see Your input function is no where returning some value, so by default its return None

You're expecting to return some value.

Here is your complete code


print("Please choose which currency you want to convert:")
print("A - Korean Won to US Dollar (Exchange Rate: 0.000905)")
print("B - Korean Won to Euro (Exchange Rate: 0.000807350908)")
print("C - Korean Won to Japanese Yen (Exchange Rate: 0.0919061643)")
print("D - Korean Won to Chinese RMB (Exchange Rate: 0.00603703605)")
print("E - Quit ")

A=0
B=0
C=0
D=0

usd = 0.000905
eur = 0.000807350908
yen = 0.0919061643
rmb = 0.00603703605
def main():
    (option, amount,totalamount) = Input()  #modified
    print(totalamount)  


def Input():
    option = input("Enter your option: ")
    amount = eval(input("Enter the amoutn in Korean Won: "))
    totalamount=0  #added here
    if option == "A":
        totalamount = (amount * usd)
        print (str(amount) +"Won equals to "+str(totalamount)+" USD")
    elif option== "B":
        totalamount = (amount * eur)
        print ("{} Won equals to {} Euro".format(amount,totalamount))
    elif option== "C":
        totalamount = (amount * yen)
        print ("{} Won equals to {} Yen".format(amount,totalamount))
    elif option== "D":
        totalamount = (amount * rmb)
        print ("{} Won equals to {} Chinese RMB".format(amount,totalamount))
    else:
        quit

    return option,amount,totalamount


main()

Comments

0

Here some suggestions / and fixes. There's many more things which can be improved, but I wanted to show some basic ones, that are hopefully not too complicated to understand, but can make your code nicer.

The idea is to write code, that is easy to read and easy to change.

usd = 0.000905
eur = 0.000807350908
yen = 0.0919061643
rmb = 0.00603703605


def print_choices():
    """
    This is a doc string. Here you should describe what your function is doing.

    This function prints the choices, that a user can make
    """
    print("Please choose which currency you want to convert:")
    # DRY: (=Don't Repeat Yourself). you have the exchange rate already in
    # variables. so use them, so that if the exchange rate changes you 
    # need to change only one line in your code.
    print("A - Korean Won to US Dollar (Exchange Rate: %f)" % usd)
    print("B - Korean Won to Euro (Exchange Rate: %f)" % eur)
    print("C - Korean Won to Japanese Yen (Exchange Rate: %f)" % yen)
    print("D - Korean Won to Chinese RMB (Exchange Rate: %f)" % rmb)
    print("E - Quit")
    # describe what happens if you enter another value
    # lateron you might want to rewrite your code such, that it rejects 
    # any option, that is not A, B, C, D, E and asks for input until it is
    # correct.
    print("any other input will Quit ")

# variables A,B,C,D are not used in your code, so remove them

# function names should only use lowercase characters and '_' 
# This is a way of telling others, that this is a variable or a function
# It is got practice, that function names start with a verb and then an object.
def get_user_input():
    """ 
    This function prompts the user for an option and an amount in
    Korean Won and returns it to the caller.

    returns: options, amount
    """

    option = input("Enter your option: ")
    # convert option to uppercase, so even if the user enters 'a', 
    # option 'A' will be chosen
    option = option.upper()

    # eval should not be used it is a dangerous function. Use float instead
    amount = float(input("Enter the amount in Korean Won: "))
    return option, amount

def calculate_and_print_converted_amount(option, amount):
    """ 
    depending on option, amount is converted to another currency
    This function calculates and displays the converted amount
    and the currency. 
    If option "E" is selected Nothing is displayed.
    if an unknown option is selected a small warning will be displayed
    and no currency conversion is performed.
    """

    if option == "A":
        conversionrate = usd
        currency = "USD"
    elif option == "B":
        conversionrate = eur
        currency = "Euro"
    elif option== "C":
        conversionrate = yen
        currency = "Yen"
    elif option== "D":
        conversionrate = rmb
        currency = "Chinese RMB"
    elif option== "E":
        return
    else:
        # quit is no python command use return instead to return from
        # a function.
        # alternatively you can exit the entire python script 
        # with sys.exit()
        print("unknown option %s. Will quit" % option)
        return
    # Use only one print statement, so you can change formatting by changin
    # only one line
    totalamount = amount * conversionrate
    print ("%.2f Won equals to %.2f %s" % (amount, totalamount, currency))


def main():
    print_choices()
    (option, amount) = get_user_input()
    calculate_and_print_converted_amount(option, amount)
    # if you wanted to you could have one function (calculate_amount), 
    # that just calculates the amount and returns the amount and the 
    # currency and another function printing the answer.
    # you see that many programs separate 'calculation' from 'presentation'
    # one function does the work, the other one decides how to 'present' 
    # the information. (print to the terminal, write to a file, display 
    # with a GUI framework.
    # If you'd separate code like that you could re use the calculation if
    # you change your user interface and you just had to reimplement the
    # function presenting the result


main()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.