I am a python newbie and have been asked to carry out some exercises using while and for loops. I have been asked to make a program loop until exit is requested by the user hitting <Return> only. So far I have:
User = raw_input('Enter <Carriage return> only to exit: ')
running = 1
while running == 1:
Run my program
if User == # Not sure what to put here
Break
else
running == 1
I have tried: (as instructed in the exercise)
if User == <Carriage return>
and also
if User == <Return>
but this only results in invalid syntax.
Please could you advise me on how to do this in the simplest way possible.
Thanks
I ran into this page while (no pun) looking for something else. Here is what I use:
while True:
i = input("Enter text (or Enter to quit): ")
if not i:
break
print("Your input:", i)
print("While loop has exited")
The exact thing you want ;)
https://stackoverflow.com/a/22391379/3394391
import sys, select, os
i = 0
while True:
os.system('cls' if os.name == 'nt' else 'clear')
print "I'm doing stuff. Press Enter to stop me!"
print i
if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
line = raw_input()
break
i += 1
Actually, I suppose you are looking for a code that runs a loop until a key is pressed from the keyboard. Of course, the program shouldn't wait for the user all the time to enter it.
If you use raw_input() in python 2.7 or input() in python 3.0, The program waits for the user to press a key.
If you don't want the program to wait for the user to press a key but still want to run the code, then you got to do a little more complex thing where you need to use kbhit() function in msvcrt module.
Actually, there is a recipe in ActiveState where they addressed this issue. Please follow this link
I think the following links would also help you to understand in much better way.
python cross platform listening for keypresses
How do I get a single keypress at a time
Useful routines from the MS VC++ runtime
I hope this helps you to get your job done.
Use a print statement to see what raw_input returns when you hit enter. Then change your test to compare to that.
This works for python 3.5 using parallel threading. You could easily adapt this to be sensitive to only a specific keystroke.
import time
import threading
# set global variable flag
flag = 1
def normal():
global flag
while flag==1:
print('normal stuff')
time.sleep(2)
if flag==False:
print('The while loop is now closing')
def get_input():
global flag
keystrk=input('Press a key \n')
# thread doesn't continue until key is pressed
print('You pressed: ', keystrk)
flag=False
print('flag is now:', flag)
n=threading.Thread(target=normal)
i=threading.Thread(target=get_input)
n.start()
i.start()
You need to find out what the variable User would look like when you just press Enter. I won't give you the full answer, but a tip: Fire an interpreter and try it out. It's not that hard ;) Notice that print's sep is '\n' by default (was that too much :o)
if repr(User) == repr(''):
break
a very simple solution would be, and I see you have said that you
would like to see the simplest solution possible.
A prompt for the user to continue after halting a loop Etc.
raw_input("Press<enter> to continue")
user_input=input("ENTER SOME POSITIVE INTEGER : ")
if((not user_input) or (int(user_input)<=0)):
print("ENTER SOME POSITIVE INTEGER GREATER THAN ZERO") #print some info
import sys #import
sys.exit(0) #exit program
'''
#(not user_input) checks if user has pressed enter key without entering
# number.
#(int(user_input)<=0) checks if user has entered any number less than or
#equal to zero.
'''
Here is the best and simplest answer. Use try and except calls.
x = randint(1,9)
guess = -1
print "Guess the number below 10:"
while guess != x:
try:
guess = int(raw_input("Guess: "))
if guess < x:
print "Guess higher."
elif guess > x:
print "Guess lower."
else:
print "Correct."
except:
print "You did not put any number."
You are nearly there. the easiest way to get this done would be to search for an empty variable, which is what you get when pressing enter at an input request. My code below is 3.5
running = 1
while running == 1:
user = input(str('Enter <Carriage return> only to exit: '))
if user == '':
running = 0
else:
print('You had one job...')
I recommend to use u\000D. It is the CR in unicode.
Here's a solution (resembling the original) that works:
User = raw_input('Enter <Carriage return> only to exit: ')
while True:
#Run my program
print 'In the loop, User=%r' % (User, )
# Check if the user asked to terminate the loop.
if User == '':
break
# Give the user another chance to exit.
User = raw_input('Enter <Carriage return> only to exit: ')
Note that the code in the original question has several issues:
The if/else is outside the while loop, so the loop will run forever.
The else is missing a colon.
In the else clause, there's a double-equal instead of equal. This doesn't perform an assignment, it is a useless comparison expression.
It doesn't need the running variable, since the if clause performs a break.
If you want your user to press enter, then the raw_input() will return "", so compare the User with "":
User = raw_input('Press enter to exit...')
running = 1
while running == 1:
Run your program
if User == "":
break
else
running == 1
The following works from me:
i = '0'
while len(i) != 0:
i = list(map(int, input(),split()))
Related
So im making a simple console menu for my program.
# Example menu program
menu = """
OPTIONS
1. Option 1
2. Option 2
"""
while True:
uinput = input(menu)
if uinput == "quit": # repetitive code
break
elif uinput == "1":
uinput = input("Input parameters: ")
if uinput == "quit": # repetitive code
break
process_params(uinput, option=1)
elif uinput == "2:
uinput = input("Input parameters: ")
if uinput == "quit": # repetitive code
break
process_params(uinput, option=2)
Whenever the user types quit into any one of those inputs, the loop breaks.
The problem is my program contains a lot of input functions, and I don't want to check if uinput == "quit" every time have an input function. Is there a way to do this? I thought of making a custom input function that checks the input every time, but you can't call break from another function.
The easiest way to break out of a loop (or do anything else exceptional that breaks the normal control flow) from an inner function call without threading a bunch of returns and checks back through multiple scopes is to raise an Exception.
class QuitException(Exception):
pass
def get_input(msg: str) -> str:
uinput = input(msg)
if uinput == "quit":
raise QuitException()
return uinput
while True:
try:
option = get_input(menu)
if option in {"1", "2"}:
process_params(
get_input("Input parameters: "),
option=int(option)
)
except QuitException:
break
I'm not too sure, but is this what it's supposed to do?
menu = """
OPTIONS
1. Option 1
2. Option 2
"""
while True:
print(menu)
uinput = input("Input parameters: ")
if uinput == "quit": # repetitive code
break
if uinput == "1" or uinput == "2":
process_params(uinput, option=int(uinput))
That is a very good question and you almost have the right answer - yes to a dedicated custom input function. Then, the only missing puzzle piece is using exceptions as flow control!
I couldn't find a nice documentation link quickly but I found a good post about it here.
Python is built with using exceptions as a tool to control your code flow in mind. They perform faster than if statements (unless they occur frequently which isn't our case) and let's you write with very few if statements. It might seem unnatural, at first, but it is Pythonic.
The idea is to raise an exception in custom_input for special cases such as "quit". You maintain the logic of when the program should exit (such as "quit", "exit" or others if you need) in one place and indicate to the calling stack (other functions chain) that a special case needs to be handled by raise-ing an exception.
def custom_input(prompt):
value = input(prompt)
if value == 'quit':
raise KeyboardInterrupt("User requested to exit.")
else:
return value
def main():
try:
while True:
value = custom_input(prompt = "Input parameters")
except KeyboardInterrupt:
print("Thank you, come again! Bye!")
And you can use custom_input several times, only needing if statements for menu choices. But, having the quit logic in one place rather than repeating the code.
Couldn't post from my phone fast enough :(
Hopefully this helps. I'm a little unsure what you are requesting.
User_Input = ""
while User_Input != 'quit':
User_Input = input('Get Some Input')
Ok so in this I have an issue where if the answer is "N" then it will still continue to the else statement. How do I fix this? (this is all in a function, edit: with other if statements that work fine)
if command == "Exit":
exit = 1
while exit == 1:
print("Quit? Y/N:", end="")
ex = input()
if ex == "Y":
quit()
elif ex == "N":
break
else:
print("Err")
The Code Seems To work Fine.
I assumed what you Want to do is : on Entering Exit ask user Y or N if user enters Y you quit the program if user enters N you want to break out of while loop. It works fine for both the cases can you add something else to the question to illustrate the problem.
I would also recommend you to try using return statnment while trying to break from multiple loop or if you are creating function for this purpose.
Make sure You are not entering small alphabets . You can use .upper() function to make sure you always use uppercase.
I have been trying to convert some code into a try statement but I can't seem to get anything working.
Here is my code in pseudo code:
start
run function
check for user input ('Would you like to test another variable? (y/n) ')
if: yes ('y') restart from top
elif: no ('n') exit program (loop is at end of program)
else: return an error saying that the input is invalid.
And here is my code (which works) in python 3.4
run = True
while run == True:
spuriousCorrelate(directory)
cont = True
while cont == True:
choice = input('Would you like to test another variable? (y/n) ')
if choice == 'y':
cont = False
elif choice == 'n':
run = False
cont = False
else:
print('This is not a valid answer please try again.')
run = True
cont = True
Now what is the proper way for me to convert this into a try statement or to neaten my code somewhat?
This isn't a copy of the mentioned referenced post as I am trying to manage two nested statements rather than only get the correct answer.
If you want to make your code neater, you should consider having
while run:
instead of
while run == True:
and also remove the last two lines, because setting run and cont to True again isn't necessary (their value didn't change).
Furthermore, I think that a try - except block would be useful in the case of an integer input, for example:
num = input("Please enter an integer: ")
try:
num = int(num)
except ValueError:
print("Error,", num, "is not a number.")
In your case though I think it's better to stick with if - elif - else blocks.
Ok so as a general case I will try to avoid try...except blocks
Don't do this. Use the right tool for the job.
Use raise to signal that your code can't (or shouldn't) deal with the scenario.
Use try-except to process that signal.
Now what is the proper way for me to convert this into a try statement?
Don't convert.
You don't have anything that raises in your code, so there is no point of try-except.
What is the proper way to neaten my code somewhat?
Get rid of your flag variables (run, cont). You have break, use it!
This is prefered way of imlementing do-while, as Python docs says; unfortunately, I cannot find it to link it right now.
If someone finds it, feel free to edit my answer to include it.
def main()
while True: # while user wants to test variables
spuriousCorrelate(directory) # or whatever your program is doing
while True: # while not received valid answer
choice = input('Would you like to test another variable? (y/n) ')
if choice == 'y':
break # let's test next variable
elif choice == 'n':
return # no more testing, exit whole program
else:
print('This is not a valid answer please try again.')
The function below calls for the input command and check if str.isalnum().
def enterPass(str):
x = raw_input("enter password Alpha or Alphanumeric! 'No_Space' :")
if x.isalnum():
print "saved"
else:
print "try again"
return;
Followed from the above is the below function, which exists when the function enterPass has been called 3 times.
_try = 1
while (_try <= 3):
enterPass("password")
_try += 1
My intention was that upon entering password it should verify if it is Alpha-Numerics or not. If so, it should prompt "Saved" and quit, if not then it should ask for the password again, and if the user cannot get the password right 3 times, the program shoudl quit.
The problem I am facing is that I am unable to quit this program once it had successfully accepted the isalnum() with "Saved" prompt. It is going again in the loop asking to enter my password again. Please suggest how I can make this function work as intended, and possibly more efficienty.
The above program is just for academic purpose and has no useful application at present.
A function is probably not needed in this case, as you can then use break:
tries = 0
while tries < 3:
x = raw_input("Enter password Alpha or Alphanumeric! No spaces! ")
if x.isalnum():
print "Saved"
break
print "Try again"
tries += 1
Here's a test:
Enter password Alpha or Alphanumeric! No spaces! Hi!##
Try again
Enter password Alpha or Alphanumeric! No spaces! !##!##
Try again
Enter password Alpha or Alphanumeric! No spaces! ####
Try again
>>>
Enter password Alpha or Alphanumeric! No spaces! No!
Try again
Enter password Alpha or Alphanumeric! No spaces! Okay
Saved
>>>
You could import sys and do sys.exit(0)
import sys
if x.isalnum():
print "saved"
sys.exit(0)
Now sys.exit will give you a bunch of errors when it's exiting the program when running in an IDLE, ignore those because in the actual final program they will not appear.
But that is if you want to terminate the whole program. If you simply want to break out of the loop and continue the program with something else you can do
if x.isalnum():
print "saved"
break
Break must also be in a loop for it to work.
I have set up a script to say something when the user enters something other than Yes. However it still says this when the user says Yes. What am I doing wrong?
I am using Python 2.7.2.
Here is my code:
print 'Hi! Welcome!'
begin = raw_input ('Will you answer some questions for me? ')
if begin == 'yes':
print 'Ok! Let\'s get started then!'
else:
print 'Well then why did you open a script clearly entiled\'QUIZ\'?!'
Just change the line
if begin == 'yes':
to
if begin.lower() == 'yes':
Because string compare is case sensitive, the match will only if true iff user enters the reply in lower case
The issue here is case sensitivity.
>>> "yes" == "Yes"
False
Try using str.lower() on the user input before your comparison to ignore case. E.g:
print 'Hi! Welcome!'
begin = raw_input ('Will you answer some questions for me? ')
if begin.lower() == 'yes':
print 'Ok! Let\'s get started then!'
else:
print "Well then why did you open a script clearly entiled\'QUIZ\'?!"
#If a single apostrophe is used inside the print str then it must be surrounded by double apostrophes.
Abhijit's method also works if you just want to accept more than one version of a string from a user. For example, I'm using this to confirm whether the user wants to exit:
confirm = input('Are you sure you would like to exit? N to re-run program')
if confirm.lower() in ('n','no'): #.lower just forces the users input to be changed to lower case
print("I'll take that as a no.")
return confirm #this then just goes back to main()
else:
exit()
This way either 'n' or 'N'; 'no' or 'NO' or 'nO' are all accepted cases of 'no'.