SyntaxError:在使用if时使用缩进块,在使用空块时使用elif

Jam*_*nch 1 python shell python-idle

显然我的代码有问题.当我使用Python 3.3.3 Shell运行以下模块时,我收到错误SyntaxError: expected an indented block.然后IDLE突出显示elif在第7行.

def user_input():
    print('[1]: ASCII to Binary')
    print('[2]: Binary to ASCII')
    user_input = input('Please choose [1] or [2]: ')
    if user_input == ('1', '[1]'):
        #
    elif user_input == ('2', '[2]'):
        #
    else:
        print('Please enter a valid input...')
        user_input()
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

必须在每个ifelif块中都有实际的代码,你不能只使用注释.

在这种情况下使用pass声明:

if user_input == ('1', '[1]'):
    pass
elif user_input == ('2', '[2]'):
    pass
else:
    print('Please enter a valid input...')
    user_input()
Run Code Online (Sandbox Code Playgroud)

此外,您实际上不能user_input在函数中使用本地变量名称,仍然可以通过该名称调用该函数.局部变量影响全局变量,因此套件中的user_input()调用else:将引发a,TypeError因为它实际上是将被调用的局部变量引用的字符串.为局部变量使用不同的名称; choice将是一个不错的选择.

接下来,您将字符串与元组进行比较,这两种类型永远不会相等in用于测试元组中是否存在等于用户输入的字符串:

if choice in ('1', '[1]'):
    pass
Run Code Online (Sandbox Code Playgroud)

如果你使用了{element1, element2, ...}甚至更好的sets(),那么在测试afwindt时,一个集合会更快.

可以反转并组合测试,而不需要那些空块:

choice = input('Please choose [1] or [2]: ')
if choice not in {'1', '[1]', '2', '[2]'}:
    print('Please enter a valid input...')
    user_input()
Run Code Online (Sandbox Code Playgroud)

最后,使用循环而不是递归来重复输入错误的问题.如果没有将递归调用结果返回到调用链上并且避免递归限制(你无法在没有无限期返回的情况下调用函数,那么你可以避免你在这里犯的错误,并且你会惊讶于有多少用户会尝试看看他们可以跟上多久的不良选择.

一个while True循环真的会继续:

def user_input():
    print('[1]: ASCII to Binary')
    print('[2]: Binary to ASCII')
    while True:
        choice = input('Please choose [1] or [2]: ')
        if choice in {'1', '[1]', '2', '[2]'}:
            return choice
        print('Please enter a valid input...')
Run Code Online (Sandbox Code Playgroud)

return退出函数(等循环),否则永远是用户被告知要提供有效的输入.