1

这个问题有两个问题:

  1. 是否有一组特定的条件优先规则与 while 循环中的条件相关?
  2. 我怎样才能获得两个满足条件之一(即condition_x OR condition_y)来完成一个循环?

细节:

作为一个 python 新手,我在 while 循环中遇到了一种情况,其中某些条件优先于其他条件。

我正在尝试制作:

  1. 所需的两个值之一,即“y”或“n”
  2. 但是,如果选择“n”,则返回一个自定义提示,然后允许值“ok”
  3. 并使其在步骤 1 中输入 'y' 或在步骤 3 中输入 'ok' 将完成循环

发生的情况是,当输入“n”时,第一个条件优先并返回语句:

please enter 'y' or 'n'

当我希望它返回时:

oh come on, enter 'ok'

代码:

(我知道使用两个break's 可能是错误的 - 我不知道如何让 '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
4

1 回答 1

2

您正在构建错误的布尔逻辑;利用:

elif user_input not in ('y', 'n'):

反而。

该表达式user_input is not 'y' or 'n'被解释为(user_input is not 'y') or ('n'),它始终True为 True (在布尔上下文中考虑非空字符串):

>>> if 'n': print 'n!'
...
n!

您还应该使用==相等测试而不是is身份测试。is测试两个操作数是否是同一个对象,而==测试两个操作数是否具有相同的值。对于有时碰巧同时为 True 的小字符串,但这是 Python 优化,而不是您可以依赖的东西来处理所有字符串。

下一个问题是,当用户输入是您过度使用elif. 例如,当user_input是,不是或,所以匹配,排除所有其他分支ok ynelif 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这些都与循环无关。

于 2013-03-20T14:46:45.960 回答