为什么我会得到;应为缩进块“;当我尝试运行Python脚本时?

为什么我会得到;应为缩进块“;当我尝试运行Python脚本时?,python,indentation,Python,Indentation,我有一个错误,上面写着“需要一个缩进块” 你能指导我如何处理这个错误吗。谢谢:) 代码示例: for ch in f: ( translatedToken = english_hindi_dict[ch] ) if (ch in english_hindi_dict) else (translatedToken = ch) Python使用缩进(代码行前面的空格/制表符)来指示代码块的开始和结束位置,相对于它前面的Python语句 因此,以PHP为例: if ($blah == 'foo')

我有一个错误,上面写着“需要一个缩进块” 你能指导我如何处理这个错误吗。谢谢:)

代码示例:

for ch in f: ( translatedToken = english_hindi_dict[ch] ) if (ch in english_hindi_dict) else (translatedToken = ch) 
Python使用缩进(代码行前面的空格/制表符)来指示代码块的开始和结束位置,相对于它前面的Python语句

因此,以PHP为例:

if ($blah == 'foo')
{
  // this is line 1 of my code block
  // this is line 2
}
if will_is_awesome:
    print "You're right"
else:
    print "You lie!"
if will_is_awesome:
print "You're right"
else:
print "You lie!"
if light_is_green:
    go_now()
else:
    # go_anyway()
do_something_else()
在python下,将是:

if blah == 'foo':
    # this is line 1 of my code block
    # this is line 2
    pass

你能提供一些代码和确切的错误吗?

Python是一种严重依赖缩进来决定程序结构的语言,不像C和其他一些使用大括号的语言

当你有这样的陈述时:

if true:
pass
它会抱怨,因为
if
没有缩进语句。您需要将其修复为:

if true:
    pass
这听起来像是您遇到的那种错误,不过如果您发布了实际代码,可能会更加明显。在说明问题时,最好给出代码,并解释预期行为是什么以及与实际行为的关系。你将使那些试图帮助你的人的生活变得更加轻松:-)


还要记住,即使代码看起来正确,也可能会出现此问题。在源代码中混合空格和制表符通常会导致这种情况。

您可能将制表符与空格混合在一起。它看起来有锯齿,但实际上没有


您的代码给了我一个不同的错误:

for ch in f:                                                  \
  ( translatedToken = english_hindi_dict[ch] )                \
    if (ch in english_hindi_dict) else (translatedToken = ch)
                                                        ↑

SyntaxError: invalid syntax
也许你的意思是:

for ch in f:
  if ch in english_hindi_dict:
    translatedToken = english_hindi_dict[ch]
  else:
    translatedToken = ch
也许你的意思是:

for ch in f:
  translatedToken = english_hindi_dict[ch] if ch in english_hindi_dict else ch
两者都应该运行良好,我预计第二个会比前一个更快


它们都可以优化为
translated=str(英文的chindi dict.get(ch,ch)表示ch in f)
,但这不是问题的关键。

Python通过缩进来确定块,而不是像C/C++/Java/PHP/那样通过字符
{
}
来确定块。。。通过在某些其他语言中找到的
if
/
endif
begin
/
end
对执行或执行。所以你必须小心缩进-同时混合制表符和空格也不好。

编辑答案以匹配代码示例

是无效的Python

首先,可读性计数。您的代码很难阅读,因此很难调试。什么是“ch”和“f”?更重要的是,您可以用Python编写一行程序,但不推荐这样做,因此将的
放在单独的一行中。然后缩进

for chunk in file: 
    ( translatedToken = english_hindi_dict[chunk] ) if (chunk in english_hindi_dict) else (translatedToken = chunk)
现在我们可以知道出了什么问题。在条件语句中进行变量赋值。这在Python中是不允许的。我猜你有C/C++背景,并且习惯于这样做。在Python中,为了防止编写模糊代码,您不能这样做。因此,你最终会:

for chunk in file: 
    translatedToken = english_hindi_dict[chunk] if chunk in english_hindi_dict else chunk
如果您使用Python2.5+,这段代码应该可以工作。但是三元运算符在较旧的Python版本中还不可用。让我们更友好一点:

for chunk in file: 
    translatedToken = chunk
    if chunk in english_hindi_dict:
        translatedToken = english_hindi_dict[chunk]
你可能会争辩说写起来要长一些,你是对的。但是你花在阅读代码上的时间比写代码要多,所以让代码易于阅读是有意义的。当然,一旦有了Python抓地力,您将尝试以更具Python风格的方式使其工作。听说过EAFTP吗

for chunk in file: 
    try:
        translatedToken = english_hindi_dict[chunk]
    except KeyError:
        translatedToken = chunk
但是Python充满了惊喜,您将了解到这些经典用例中的大多数已经得到了处理。标准库通常提供一个简洁易懂的解决方案:

for chunk in file: 
    translatedToken = english_hindi_dict.get(chunk, chunk)
作为结论:不要像编写C那样编写Python,也不要像编写Perl那样编写Java。其他工具,其他风格


若要解决此问题,请启动编辑器的“搜索并替换”功能,并制作一个巨大的“全部替换”,将所有选项卡更改4个空格,或相反。然后缩进所有块,最后对齐同一块中的所有指令

有趣的是,以前没有出现过。毕竟,事实并非如此显而易见

在Python中,使用空格或制表符而不是“{”分隔块

因此,每当你进入一个块(一个函数、一个循环、一个类等),你都必须缩进你的代码。这不仅仅是一个好的实践,这是强制性的。如果你不这样做,你的程序就会崩溃

现在,大多数情况下,您都会出现此错误,因为您使用了缩进,但使用了制表符和空格。在Python程序中,您应该使用制表符或空格,但决不能在同一文件中同时使用

例如:

变成:

if age > 18:
    print("You can vote")
在大多数语言中,您可以执行以下操作:

if (age > 18)
{
printf("You can vote")
}
在Python中,您不能:

if age > 18:
print("You can vote")
引发异常。此外,必须对齐同一块的所有指令,以便:

if age > 18:
    print("You can vote")
    print("How cool is that ?")
很好,但是:

if age > 18:
    print("You can vote")
   print("How cool is that ?")
引发了一个异常

最终,不能在同一块中混合制表符和空格。因此:

if age > 18:
    print("You can vote")
    print("How cool is that ?")
看起来不错,但会引发异常。若要避免此问题,请使用制表符或空格。最常用作编码样式参考的文本建议使用4个空格


大多数编辑器都有一个全局“搜索并替换”功能,可以解决任何可能出现的问题。有些编辑器像Geany,甚至有一个“用空格替换所有选项卡”功能。

缩进错误可能是由很多不同的事情引起的。我想:

  • 根本忘了缩进

    Python使用缩进来分隔语法块。例如:

    if ($blah == 'foo')
    {
      // this is line 1 of my code block
      // this is line 2
    }
    
    if will_is_awesome:
        print "You're right"
    else:
        print "You lie!"
    
    if will_is_awesome:
    print "You're right"
    else:
    print "You lie!"
    
    if light_is_green:
        go_now()
    else:
        # go_anyway()
    do_something_else()
    
    您将得到一个缩进错误:如果忘记缩进,则预期会出现缩进块错误。例如:

    if ($blah == 'foo')
    {
      // this is line 1 of my code block
      // this is line 2
    }
    
    if will_is_awesome:
        print "You're right"
    else:
        print "You lie!"
    
    if will_is_awesome:
    print "You're right"
    else:
    print "You lie!"
    
    if light_is_green:
        go_now()
    else:
        # go_anyway()
    do_something_else()
    
  • 注释出缩进块

    例如:

    if ($blah == 'foo')
    {
      // this is line 1 of my code block
      // this is line 2
    }
    
    if will_is_awesome:
        print "You're right"
    else:
        print "You lie!"
    
    if will_is_awesome:
    print "You're right"
    else:
    print "You lie!"
    
    if light_is_green:
        go_now()
    else:
        # go_anyway()
    do_something_else()
    
    这将产生一个
    IndentationError:应该是一个缩进的块,因为注释使
    else:
    后面的行在解析器看来是空的。添加
    pass
    语句将解决此问题。例如:

    if light_is_green:
        go_now()
    else:
        # go_anyway()
        pass
    do_something_else()
    
  • 缩进中混合了制表符和空格

    制表位在不同的机器和编辑器之间可能会有所不同。如果制表位和空格混合得恰到好处,可能会出现错误,但它通常会产生缩进错误:未缩进不匹配任何外部缩进级别,因此不太可能是您的pr