问题
I'm having a problem where when I ask my program to quit out it prints like I ask it to, however shows my menu of options as well continuously.
So I'm getting this:
>>>
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to begin: q
Goodbye!
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to continue:
Where I want it to display this if I choose 'q':
>>>
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to begin: q
Goodbye!
Here is my complete code, please explain why my menu is reprinting, did I make my while loop wrong, or is something out of place in my code?
def hw8():
print('(S)huffle a message.')
print('(U)nshuffle a message.')
print('(Q)uit program.')
x = input('Choose a option to begin: ')
if x == 'Q' or x == 'q':
print('Goodbye!')
while x != 'q' or 'Q' :
if x == 'S' or x == 's':
y = input('Enter a message to shuffle: ')
q1 = ''
for i in y:
if ord(i) in range(65,90) or ord(i) in range(97,122):
q = chr(ord(i) + 1)
q1 = q1 + q
elif ord(i) == 90:
q = chr(ord(i) + 7)
q1 = q1 + q
elif ord(i) == 122:
q = 'A'
q1 = q1 + q
else:
q = i
q1 = q1 + q
print(q1)
if x == 'U' or x == 'u':
f = input('Enter a message to unshuffle: ')
t2 = ''
for i in f:
if ord(i) in range (66,91) or ord(i) in range(98,123):
t = chr(ord(i) - 1)
t2 = t2 + t
elif ord(i) == 65:
t = 'z'
t2 = t2 + t
elif ord(i) == 97:
t = 'Z'
t2 = t2 + t
else:
t = i
t2 = t2 + t
print(t2)
print('(S)huffle a message.')
print('(U)nshuffle a message.')
print('(Q)uit program.')
x = input('Choose a option to continue: ')
hw8()
I want the program to display the menu after shuffling a message, or unshuffling a message, as well as at the beginning, but not after the user has asked to quit the program by choosing 'q'.
Edited code:
def hw8():
print('(S)huffle a message.')
print('(U)nshuffle a message.')
print('(Q)uit program.')
x = input('Choose a option to begin: ')
while x != 'q' or x != 'Q' :
if x == 'S' or x == 's':
y = input('Enter a message to shuffle: ')
q1 = ''
for i in y:
if ord(i) in range(65,90) or ord(i) in range(97,122):
q = chr(ord(i) + 1)
q1 = q1 + q
elif ord(i) == 90:
q = chr(ord(i) + 7)
q1 = q1 + q
elif ord(i) == 122:
q = 'A'
q1 = q1 + q
else:
q = i
q1 = q1 + q
print(q1)
if x == 'U' or x == 'u':
f = input('Enter a message to unshuffle: ')
t2 = ''
for i in f:
if ord(i) in range (66,91) or ord(i) in range(98,123):
t = chr(ord(i) - 1)
t2 = t2 + t
elif ord(i) == 65:
t = 'z'
t2 = t2 + t
elif ord(i) == 97:
t = 'Z'
t2 = t2 + t
else:
t = i
t2 = t2 + t
print(t2)
print('(S)huffle a message.')
print('(U)nshuffle a message.')
print('(Q)uit program.')
x = input('Choose a option to continue: ')
if x == 'Q' or x == 'q':
print('Goodbye!')
hw8()
New Output:
>>> ================================ RESTART ================================
>>>
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to begin: s
Enter a message to shuffle: hello
ifmmp
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to continue: q
Goodbye!
(S)huffle a message.
(U)nshuffle a message.
(Q)uit program.
Choose a option to continue:
回答1:
Your problem is this line:
while x != 'q' or 'Q' :
The problem is that Q
itself will always return True
, so the expression will always be true. Try changing the line with:
while x != 'q' and x != 'Q' :
回答2:
x != 'q' or 'Q'
is being handled as (x != 'q') or 'Q'
, and 'Q' is always True.
It would better be:
x not in 'qQ'
or x.lower() != 'q'
来源:https://stackoverflow.com/questions/13575426/while-loop-fail-caesar-cipher