Posts: 84
Threads: 36
Joined: Jul 2017
As an example of what my program is supposed to do, lets say, for example, that the user's name was John, and he chose option 0, and then chose option 100.
The resulting cd mix name should be "John's Angry Heavy Metal Mix".
#!/usr/bin/env python3
#BuildYourOwnCDmixName.py
def heavyMetalCDMixName():
yourName = input("What is your name: ")
VWL = ["Angry", "Violent", "Crazy", "Dangerous", "Berserk"] #VWL = ViolentWordList
print("The words in the list include: "
+ "[0]:" + VWL[0] + ", [1]:" + VWL[1] + ", [2]:" + VWL[2] + ", [3]:"
+ VWL[3] + ", [4]:" + VWL[4])
print("Choose index numbers from [0] to [4] to complete the name for your "
+ str(yourName) + "'s _______ Heavy Metal mix. Enter 100 when you're done.")
mixName = (str(yourName) + "'s ")
#option = VWL[]#declare option, so we can use it inside while loop
while option != 100:
option = int(input("Enter index number to append to your CD mix's name: "))
if option == 0:
mixNameList = list(mixName)#convert mixName to a list,
mixNameList.insert(0, VML[0])#so we can add the word at VML[0] to the cd mix name
mixName = ''.join(mixNameList)#convert mixName back to a string
elif option == 1:
mixNameList = list(mixName)
mixNameList.insert(0, VML[1])
mixName = ''.join(mixNameList)
elif option == 2:
mixNameList = list(mixName)
mixNameList.insert(0, VML[2])
mixName = ''.join(mixNameList)
elif option == 3:
mixNameList = list(mixName)
mixNameList.insert(0, VML[3])
mixName = ''.join(mixNameList)
elif option == 4:
mixNameList = list(mixName)
mixNameList.insert(0, VML[4])
mixName = ''.join(mixNameList)
elif option == 100:
print("You named your CD mix: " + mixName)
break
else:
print("You must enter a valid index number between 0 and 4 from VML.")
continue
def main():
heavyMetalCDMixName()
main() The error is this:
Error: What is your name: Sam
The words in the list include: [0]:Angry, [1]:Violent, [2]:Crazy, [3]:Dangerous, [4]:Berserk
Choose index numbers from [0] to [4] to complete the name for your Sam's _______ Heavy Metal mix. Enter 100 when you're done.
Traceback (most recent call last):
File "I:/Python/Python36-32/SamsPrograms/BuildYourOwnCDmixName.py", line 48, in <module>
main()
File "I:/Python/Python36-32/SamsPrograms/BuildYourOwnCDmixName.py", line 46, in main
heavyMetalCDMixName()
File "I:/Python/Python36-32/SamsPrograms/BuildYourOwnCDmixName.py", line 16, in heavyMetalCDMixName
while option != 100:
UnboundLocalError: local variable 'option' referenced before assignment
I understand what the error is, but I don't know how to declare it (so I can use it) without having to initialize it.
How do I fix this problem?
Posts: 4,802
Threads: 77
Joined: Jan 2018
You cannot evaluate the boolean expression option != 100 if option does not already have a value. You could as well replace the while option != 100 by while True .
Posts: 84
Threads: 36
Joined: Jul 2017
(Jan-22-2018, 06:36 AM)Gribouillis Wrote: You cannot evaluate the boolean expression option != 100 if option does not already have a value. You could as well replace the while option != 100 by while True . It still doesn't work:
#!/usr/bin/env python3
#BuildYourOwnCDmixName.py
def heavyMetalCDMixName():
yourName = input("What is your name: ")
VWL = ["Angry", "Violent", "Crazy", "Dangerous", "Berserk"] #VWL = ViolentWordList
print("The words in the list include: "
+ "[0]:" + VWL[0] + ", [1]:" + VWL[1] + ", [2]:" + VWL[2] + ", [3]:"
+ VWL[3] + ", [4]:" + VWL[4])
print("Choose index numbers from [0] to [4] to complete the name for your "
+ str(yourName) + "'s _______ Heavy Metal mix. Enter 100 when you're done.")
mixName = (str(yourName) + "'s ")
option = true
while true:
option = int(input("Enter index number to append to your CD mix's name: "))
if option == 0:
mixNameList = list(mixName)#convert mixName to a list,
mixNameList.insert(0, VML[0])#so we can add the word at VML[0] to the cd mix name
mixName = ''.join(mixNameList)#convert mixName back to a string
elif option == 1:
mixNameList = list(mixName)
mixNameList.insert(0, VML[1])
mixName = ''.join(mixNameList)
elif option == 2:
mixNameList = list(mixName)
mixNameList.insert(0, VML[2])
mixName = ''.join(mixNameList)
elif option == 3:
mixNameList = list(mixName)
mixNameList.insert(0, VML[3])
mixName = ''.join(mixNameList)
elif option == 4:
mixNameList = list(mixName)
mixNameList.insert(0, VML[4])
mixName = ''.join(mixNameList)
elif option == 100:
print("You named your CD mix: " + mixName)
break #so is "break" equivalent to "option = false"?
else:
print("You must enter a valid index number between 0 and 4 from VML.")
continue
def main():
heavyMetalCDMixName()
main() Error: What is your name: Sam
The words in the list include: [0]:Angry, [1]:Violent, [2]:Crazy, [3]:Dangerous, [4]:Berserk
Choose index numbers from [0] to [4] to complete the name for your Sam's _______ Heavy Metal mix. Enter 100 when you're done.
Traceback (most recent call last):
File "I:\Python\Python36-32\SamsPrograms\BuildYourOwnCDmixName.py", line 48, in <module>
main()
File "I:\Python\Python36-32\SamsPrograms\BuildYourOwnCDmixName.py", line 46, in main
heavyMetalCDMixName()
File "I:\Python\Python36-32\SamsPrograms\BuildYourOwnCDmixName.py", line 15, in heavyMetalCDMixName
option = true
NameError: name 'true' is not defined
Also, I never understood the code statement "while true". While what is true?
Posts: 4,802
Threads: 77
Joined: Jan 2018
Jan-22-2018, 07:17 AM
(This post was last modified: Jan-22-2018, 07:17 AM by Gribouillis.)
(Jan-22-2018, 07:01 AM)RedSkeleton007 Wrote: I never understood the code statement "while true". While what is true? In python, true is written True with a capital T. The while True idiom means loop indefinitely. It may seem strange but it's simple logic: a while condition: loop runs until the condition becomes false. The True condition never becomes false, so while True loops indefinitely, without the need to add a new keyword such as repeat in the language.
C programmers traditionally write while(1) to loop indefinitely. This is the ancestor of python's while True . The latter is cleaner from a purist's point of view because a condition is a boolean rather than an integer. However even python uses 1 for True and 0 for False, for example
>>> True + 1
2 but
>>> True is 1
False
Posts: 84
Threads: 36
Joined: Jul 2017
My VWL list is out of scope:
#!/usr/bin/env python3
#BuildYourOwnCDmixName.py
def heavyMetalCDMixName():
yourName = input("What is your name: ")
VWL = ["Angry", "Violent", "Crazy", "Dangerous", "Berserk"] #VWL = ViolentWordList
print("The words in the list include: "
+ "[0]:" + VWL[0] + ", [1]:" + VWL[1] + ", [2]:" + VWL[2] + ", [3]:"
+ VWL[3] + ", [4]:" + VWL[4])
print("Choose index numbers from [0] to [4] to complete the name for your "
+ str(yourName) + "'s _______ Heavy Metal mix. Enter 100 when you're done.")
mixName = (str(yourName) + "'s ")
option = True
while True:
option = int(input("Enter index number to append to your CD mix's name: "))
if option == 0:
mixNameList = list(mixName)#convert mixName to a list,
mixNameList.insert(0, VML[0])#so we can add the word at VML[0] to the cd mix name
mixName = ''.join(mixNameList)#convert mixName back to a string
elif option == 1:
mixNameList = list(mixName)
mixNameList.insert(0, VML[1])
mixName = ''.join(mixNameList)
elif option == 2:
mixNameList = list(mixName)
mixNameList.insert(0, VML[2])
mixName = ''.join(mixNameList)
elif option == 3:
mixNameList = list(mixName)
mixNameList.insert(0, VML[3])
mixName = ''.join(mixNameList)
elif option == 4:
mixNameList = list(mixName)
mixNameList.insert(0, VML[4])
mixName = ''.join(mixNameList)
elif option == 100:
print("You named your CD mix: " + mixName)
break #so is "break" equivalent to "option = false"?
else:
print("You must enter a valid index number between 0 and 4 from VML.")
continue
def main():
heavyMetalCDMixName()
main() Error: What is your name: Sam
The words in the list include: [0]:Angry, [1]:Violent, [2]:Crazy, [3]:Dangerous, [4]:Berserk
Choose index numbers from [0] to [4] to complete the name for your Sam's _______ Heavy Metal mix. Enter 100 when you're done.
Enter index number to append to your CD mix's name: 0
Traceback (most recent call last):
File "I:\Python\Python36-32\SamsPrograms\BuildYourOwnCDmixName.py", line 48, in <module>
main()
File "I:\Python\Python36-32\SamsPrograms\BuildYourOwnCDmixName.py", line 46, in main
heavyMetalCDMixName()
File "I:\Python\Python36-32\SamsPrograms\BuildYourOwnCDmixName.py", line 20, in heavyMetalCDMixName
mixNameList.insert(0, VML[0])#so we can add the word at VML[0] to the cd mix name
NameError: name 'VML' is not defined
Do I really have to put it inside the while loop? Is there another way to deal with that scope problem?
Posts: 1,150
Threads: 42
Joined: Sep 2016
Problem is that you first defined VWL, not VML.
Posts: 4,802
Threads: 77
Joined: Jan 2018
(Jan-22-2018, 07:52 AM)RedSkeleton007 Wrote: My VWL list is out of scope: How does VWL become VML ?
Posts: 84
Threads: 36
Joined: Jul 2017
Nothing shows up for the mixName string:
#!/usr/bin/env python3
#BuildYourOwnCDmixName.py
def heavyMetalCDMixName():
yourName = input("What is your name: ")
VWL = ["Angry", "Violent", "Crazy", "Dangerous", "Berserk"] #VWL = ViolentWordList
print("The words in the list include: "
+ "[0]:" + VWL[0] + ", [1]:" + VWL[1] + ", [2]:" + VWL[2] + ", [3]:"
+ VWL[3] + ", [4]:" + VWL[4])
print("Choose index numbers from [0] to [4] to complete the name for your "
+ str(yourName) + "'s _______ Heavy Metal mix. Enter 100 when you're done.")
name = (str(yourName) + "'s ")
option = True
while True:
mixNameList = []
mixName = ""
option = int(input("Enter index number to append to your CD mix's name: "))
if option == 0:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[0])
mixName = ''.join(mixNameList)
elif option == 1:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[1])
mixName = ''.join(mixNameList)
elif option == 2:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[2])
mixName = ''.join(mixNameList)
elif option == 3:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[3])
mixName = ''.join(mixNameList)
elif option == 4:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[4])
mixName = ''.join(mixNameList)
elif option == 100:
print("You named your CD mix: " + name + " " + mixName + "Heavy Metal Mix")
break
else:
print("You must enter a valid index number between 0 and 4 from VML.")
continue
def main():
heavyMetalCDMixName()
main() Error: What is your name: Sam
The words in the list include: [0]:Angry, [1]:Violent, [2]:Crazy, [3]:Dangerous, [4]:Berserk
Choose index numbers from [0] to [4] to complete the name for your Sam's _______ Heavy Metal mix. Enter 100 when you're done.
Enter index number to append to your CD mix's name: 0
Enter index number to append to your CD mix's name: 1
Enter index number to append to your CD mix's name: 100
You named your CD mix: Sam's Heavy Metal Mix
The result should be "Sam's AngryViolent Heavy Metal Mix", not "Sam's Heavy Metal Mix".
What is going on?
Posts: 1,150
Threads: 42
Joined: Sep 2016
Jan-22-2018, 08:52 AM
(This post was last modified: Jan-22-2018, 08:53 AM by j.crater.)
Quote:mixNameList = []
mixName = ""
You put this in the beginning / inside of while loop. Each loop iteration, you "reset" these two variables. Pay attention to variables scope.
Posts: 84
Threads: 36
Joined: Jul 2017
Mission accomplished! Code works correctly:
#!/usr/bin/env python3
#BuildYourOwnCDmixName.py
def heavyMetalCDMixName():
yourName = input("What is your name: ")
VWL = ["Angry", "Violent", "Crazy", "Dangerous", "Berserk"] #VWL = ViolentWordList
print("The words in the list include: "
+ "[0]:" + VWL[0] + ", [1]:" + VWL[1] + ", [2]:" + VWL[2] + ", [3]:"
+ VWL[3] + ", [4]:" + VWL[4])
print("Choose index numbers from [0] to [4] to complete the name for your "
+ str(yourName) + "'s _______ Heavy Metal mix. Enter 100 when you're done.")
name = (str(yourName) + "'s ")
mixNameList = []
mixName = ""
option = True
while True:
option = int(input("Enter index number to append to your CD mix's name: "))
if option == 0:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[0])
mixName = ''.join(mixNameList)
elif option == 1:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[1])
mixName = ''.join(mixNameList)
elif option == 2:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[2])
mixName = ''.join(mixNameList)
elif option == 3:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[3])
mixName = ''.join(mixNameList)
elif option == 4:
mixNameList = list(mixName)
mixNameList.insert(0, VWL[4])
mixName = ''.join(mixNameList)
elif option == 100:
print("You named your CD mix: " + name + mixName + " Heavy Metal Mix")
break
else:
print("You must enter a valid index number between 0 and 4 from VML.")
continue
def main():
heavyMetalCDMixName()
main() Admins, you can now close this thread. Thanks for your help everyone ;)
|