循环中的条件优先级,并使用两个可能条件之一完成循环

时间:2013-03-20 14:45:29

标签: python-2.7 while-loop conditional-statements

这个问题有两个问题:

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

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

    我想做:

    1. 需要两个值中的一个,即'y'或'n'
    2. 但是如果选择'n',则返回自定义提示,然后允许值'ok'
    3. 并使其在第1步输入'y'或在第3步'ok'完成循环
    4. 当发生'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
      

1 个答案:

答案 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_inputok时,它 yn,因此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循环无关。