PythonBoy69
PythonBoy69

Reputation: 115

Python Amateur - 'Greeting program' - 'Referenced before assignment error'

Like I said in my previous question, I'm a python amateur. I've made a couple silly mistakes. I'm attempting to make a highly simple greeting program using Python 3.4 however I have encountered an error. The error I have is:

UnboundLocalError: local variable 'lastNameFunction' referenced before assignment

Here's my code (I know I probably don't need to post it all, but there isn't much of it):

def main():
import time 
running = True
while (running):
    firstNameInput = input("What is your first name?\n")
    firstName = firstNameInput.title()
    print ("You have entered '%s' as your first name. Is this correct?"%firstName)
    time.sleep (1)
    choice = input("Enter 'Y' for Yes or 'N' for No\n")
    if(choice.upper() == "Y"):
        lastNameFunction()
    elif(choice.upper() == "N"):
        main()

    def lastNameFunction():
        lastNameInput = input("Hi %s. Please enter your last name. \n"%firstName)
        lastName = lastNameInput.title() 
if __name__ == '__main__':
main()

I'd appreciate any help and advice! Please take into consideration I am really new to this stuff. I'm also not quite sure on having a function inside of a function, but I thought it would be a fix so that the 'firstName' was available when entering the 'lastName'.

Thanks in advance! :)

Upvotes: 2

Views: 155

Answers (4)

BlackJack
BlackJack

Reputation: 4689

The organisation of the whole program seems a little bit off.

  1. Imports usually go at the top of the module.
  2. Functions defined in functions are usually just for closures, which you a) don't need here and b) might be a bit advanced for your current experience level.
  3. Recursive calls like your calling main() from within main() are wrong. When you adopt that style of control flow instead of a loop, you will eventually run into limitations of recursive calls (→ RuntimeError). You already have the necessary loop, so simply leaving out the elif branch already asks the user again for the first name.
  4. running isn't used anywhere, so you can remove it and just use while True:.

I would move asking the user for ”anything” + the question if the input was correct into its own function:

def ask_string(prompt):
    while True:
        result = input(prompt).title()
        print("You have entered '{0}'. Is this correct?".format(result))
        choice = input("Enter 'Y' for Yes or 'N' for No\n")
        if choice.upper() == 'Y':
            return result


def main():
    first_name = ask_string('What is your first name?\n')
    last_name = ask_string(
        'Hi {0}. Please enter your last name.\n'.format(first_name)
    )
    print(first_name, last_name)


if __name__ == '__main__':
    main()

Upvotes: 0

famousgarkin
famousgarkin

Reputation: 14126

You need to move the lastNameFunction declaration somewhere before you call it using lastNameFunction(), e.g.:

def main():
    import time
    running = True
    while (running):
        firstNameInput = input("What is your first name?\n")
        firstName = firstNameInput.title()
        print ("You have entered '%s' as your first name. Is this correct?" % firstName)

        time.sleep (1)
        choice = input("Enter 'Y' for Yes or 'N' for No\n")

        def lastNameFunction():
            lastNameInput = input("Hi %s. Please enter your last name. \n" % firstName)
            lastName = lastNameInput.title()

        if(choice.upper() == "Y"):
            lastNameFunction()
        elif(choice.upper() == "N"):
            main()

if __name__ == '__main__':
    main()

You can also move it outside the main function, but you will then need to pass the firstName in using the function arguments:

def lastNameFunction(firstName):
    lastNameInput = input("Hi %s. Please enter your last name. \n" % firstName)
    lastName = lastNameInput.title()

def main():
    ...
    lastNameFunction(firstName)
    ...

Upvotes: 2

Intrepid Traveller
Intrepid Traveller

Reputation: 95

The problem is you called lastNameFunction() before you defined it in the while loop. Try defining the function outside the while loop.

Upvotes: 0

GWW
GWW

Reputation: 44141

Move your lastNameFunction to somewhere before the call. Ideally, you would place this above the main function.

def lastNameFunction():
    lastNameInput = input("Hi %s. Please enter your last name. \n"%firstName)
    lastName = lastNameInput.title() 

def main():
    ...

Upvotes: 2

Related Questions