而Loop Conditional语句只调用第一个条件

时间:2016-12-03 10:35:33

标签: python python-2.7

我的代码的if语句遇到了不需要的行为。当我在while loop内调用条件语句时,无论提供哪个输入,都只调用第一个条件。我希望正确的输入调用正确描述的函数,然后继续回到循环的开头,要求用户进行另一个选择。

color_modes = ['sangria', 'ham', 'nightHawk']
print color_modes
def sangria():
    my_range = list(range(20))
    print my_range
def ham():
    print 'foo'
def nightHawk():
    print 'nightHawk'
while True:
    user_input = input('...')
    if 'sangria':
        ham()
        continue
    if 'ham':
        sangria()
        continue
    if 'nightHawk':
        nightHawk()
        continue
    else:
        break

此外,当我使用语法时:

if user_input == 'ham':而不是简写if 'ham:,条件不起作用。先感谢您。

3 个答案:

答案 0 :(得分:1)

if 'ham'将始终通过,因为非空字符串始终为True

相反,您必须使用==运算符检查是否相等。

正确的代码是:

color_modes = ['sangria', 'ham', 'nightHawk']
print color_modes
def sangria():
    my_range = list(range(20))
    print my_range
def ham():
    print 'foo'
def nightHawk():
    print 'nightHawk'
while True:
    user_input = input('...')
    if user_input == 'sangria':
        ham()
        continue
    if user_input == 'ham':
        sangria()
        continue
    if user_input == 'nightHawk':
        nightHawk()
        continue
    else:
        break

答案 1 :(得分:1)

if 'sangria':只是if bool('sangria'):的简写,总是评估为if True,因此无论输入是什么,第一件事就是

您需要比较输入字符串。没有简写/替代方式来编写它像Java switch case语句

顺便说一下,这段代码看起来很奇怪。

if 'sangria':
    ham()
    continue
if 'ham':
    sangria()
    continue

如果我理解你想要的东西,你可以创建一个功能图。

funcs = {"ham": ham, "sangria" : sangria, "nightHawk" : nightHawk} 
user_input = input() 
funcs[user_input]() # use the string to get the function object, then call it 

答案 2 :(得分:1)

在Python 2中

user_input = input('...')

尝试评估用户的输入。如果您输入一个字符串,例如ham,Python将尝试计算将失败的表达式ham,如下所示(除非在作用域中有一个类似命名的变量)。

>>> input('...')
...ham
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'ham' is not defined

您可以使用raw_input()来修复它:

user_input = raw_input('...')

然后使用字符串比较:

while True:
    user_input = raw_input('...')
    if user_input == 'ham':
        ham()
    elif user_input == 'sangria':
        sangria()
    elif user_input == 'nightHawk':
        nightHawk()
    else:
        break

此代码还使用elif来避免不必要的continue语句。

更好的方法是使用字典将用户输入映射到关联的函数:

input_map = {'ham': ham, 'sangria': sangria, 'nightHawk': nightHawk}
while True:
    func = input_map.get(raw_input('...'))
    if func is None:
        break
    func()