这个问题有两个问题:
详情:
作为一个python新手我遇到了一个while循环的情况,其中某些条件优先于其他条件。
我想做:
当发生'n'时,第一个条件优先并返回声明:
please enter 'y' or 'n'
当我希望它返回时:
oh come on, enter 'ok'
代码:
(我知道使用两个break
可能是错的 - 我无法弄清楚如何让'y'或'ok'完成循环)
while True:
user_input = raw_input('question? (y/n)')
my_string = 'here is a string '
if len(user_input) == 0:
print 'question? (y/n)'
elif user_input is not 'y' or 'n':
print 'please enter \'y\' or \'n\''
elif user_input is 'n':
print 'oh come on, enter \'ok\''
elif user_input is 'ok':
print my_string + ', ' \
.join(list_var[:-1]), list_var[-1] + '?'
break
else:
print my_string + ', ' \
.join(list_var[:-1]), list_var[-1] + '?'
break
答案 0 :(得分:2)
你正在构建你的布尔逻辑错误;使用方法:
elif user_input not in ('y', 'n'):
代替。
表达式user_input is not 'y' or 'n'
被解释为(user_input is not 'y') or ('n')
,总是为True(在布尔上下文中非空字符串被视为True
):< / p>
>>> if 'n': print 'n!'
...
n!
您还应该使用==
等式测试而不是is
身份测试。 is
测试两个操作数是否是相同的对象,而==
测试是否具有相同的值。对于有时恰好是True的小字符串,但这是一个Python优化,而不是你可以依赖的所有字符串。
下一个问题是当用户输入过度使用elif
时会发生什么。例如,当user_input
为ok
时,它不 y
或n
,因此elif user_input not in ('y', 'n')
匹配,不包括所有其他elif
分支。
你真的想简化你的逻辑:
if user_input not in ('y', 'n', 'ok'):
print "please enter 'y' or 'n'"
elif user_input == 'n':
print "oh come on, enter 'ok'"
else:
print '{}{}{}?'.format(my_string, ', '.join(list_var[:-1]), list_var[-1])
break
这些都与while
循环无关。