为什么运行我的Python脚本时出现“预期缩进块”错误?

6 投票
6 回答
82100 浏览
提问于 2025-04-15 19:14

我遇到了一个错误,上面写着“期待一个缩进的代码块”。

你能帮我看看该怎么解决这个错误吗?谢谢你!:)

代码示例:

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

6 个回答

11

Python是一种编程语言,它通过缩进来决定代码的结构,这和C语言以及其他一些语言用大括号来区分代码块的方式不一样。

比如说,当你写出这样的代码:

if true:
pass

程序会报错,因为这个if后面没有缩进的代码。你需要把它改成:

if true:
    pass

这听起来像是你遇到的错误,不过如果你能贴出实际的代码,可能会更明显。当你描述问题时,最好提供代码,并解释一下你期望的结果是什么,以及实际的结果是什么。这样能让那些想帮你的人更容易理解你的问题 :-)

另外要注意,即使你的代码看起来没问题,也可能会出现这个错误。因为在代码中混用空格和制表符(Tab)常常会导致这种情况。

14

编辑答案以匹配代码示例。

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

这段代码在Python中是无效的。

首先,代码的可读性很重要。你的代码很难读懂,因此也很难调试。“ch”和“f”是什么?更重要的是,虽然Python可以写成一行代码,但不推荐这样做,所以应该把for放在单独的一行,并进行缩进。

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

这段代码应该可以工作,前提是你使用的是Python 2.5及以上版本。但在旧版本的Python中,三元运算符还不可用。让我们把它写得更友好一些:

for chunk in file: 
    translatedToken = chunk
    if chunk in english_hindi_dict:
        translatedToken = english_hindi_dict[chunk]

你可能会说这样写更长,没错。但你花在阅读代码上的时间往往比写代码的时间要多,所以让代码易读是有意义的。当然,一旦你掌握了Python,你会尝试用更“Pythonic”的方式来写代码。听说过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个空格,或者反过来。然后缩进所有的代码块,最后对齐同一块中的所有指令。

有趣的是,这个问题之前在SO上没有出现。毕竟,这确实不是那么明显。

在Python中,你用空格或制表符来分隔代码块,而不是用“{”。

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

现在,大多数情况下,你会因为缩进了,但使用了制表符和空格而导致错误。在Python程序中,你应该只使用制表符或空格,但绝不能在同一个文件中同时使用两者。

例如:

if (age > 18)
{
    printf("You can vote")
}

变成:

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 ?")

看起来不错,但会引发异常。为了避免这个问题,最好只使用制表符或空格。PEP8,大多数人用作编码风格参考,推荐使用4个空格。

大多数编辑器都有全局的“查找和替换”功能,可以帮助你解决这个问题。有些编辑器像Geany或Ulipad甚至有“将所有制表符替换为空格”的功能。

13

你可能是把制表符和空格搞混了。看起来是有缩进,但实际上并没有。


你的代码给我带来了不同的错误:

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(english_hindi_dict.get(ch, ch) for ch in f),但这不是问题的重点。

撰写回答