喵喵时光机
为什么压痕很重要?在Python中,缩进用于分隔代码块..这与使用大括号的许多其他语言不同。{}为了分隔诸如Java、Javascript和C等块,Python用户必须密切关注他们何时以及如何缩进代码,因为空格很重要。当Python在程序缩进中遇到问题时,它会引发一个名为IndentationError或TabError.一点历史Python使用缩进的历史原因与可以说更普遍接受的大括号相比{}概述Guido van Rossum关于Python历史的一篇文章-Python的创建者:Python对缩进的使用直接来自于ABC,但是这个想法并不是起源于ABC-它已经由DonaldKnuth提出了并且是一个众所周知的编程风格的概念。(Occam编程语言也使用了它。)然而,abc的作者确实发明了冒号的使用,它将引号子句从缩进块中分离出来。在没有冒号的早期用户测试之后,人们发现,对于初学者来说,缩进的含义并不清楚,他们学习了编程的第一步。冒号的添加清楚地说明了这一点:冒号某种程度上引起了人们对以下内容的关注,并以正确的方式将前后的短语联系在一起。我如何缩进我的代码?缩进Python代码的基本规则(考虑到将整个程序视为“基本块”)是:Basic块中的第一条语句,它之后的每条后续语句都必须缩进相同的量。因此,从技术上讲,下面的Python程序是正确的:def perm(l):
# Compute the list of all permutations of l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r然而,正如您可能从上面可以看出的,随机缩进您的代码是非常困难的阅读和遵循程序的流程。最好是保持一致,并遵循一种风格。Python样式指南PEP 8建议每个缩进级别有四个空格应使用:每个缩进级别使用4个空格。那是,启动新块的每个语句和新块中的每个后续语句都应该从当前缩进级别缩进四个空格。..以下是根据PEP 8风格指南缩进的上述程序:def perm(l):
# Compute the list of all permutations of l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r我还能用标签吗?Python意识到有些人仍然更喜欢制表符而不是空格,遗留代码可能使用制表符而不是空格,因此它允许使用制表符作为缩进。PEP 8涉及这个主题。:空格是首选的缩进方法。应该只使用选项卡来保持与已经缩进制表符的代码的一致性。注意,不过,有一个重要的警告是不要同时使用两个选项卡和压痕空间..这样做会导致各种奇怪的难以调试的缩进错误。Python将选项卡扩展到下一列,但如果编辑器设置为4列的选项卡大小,或者使用空格和选项卡,则可以很容易地生成缩进代码。相貌在您的编辑器中很好,但是Python将拒绝运行。Python 3编译器明示拒绝包含制表符和空格的模糊混合的任何程序,通常是通过引发TabError..但是,在默认情况下,Python 2仍然允许混合制表符和空格,但强烈建议不要使用这种“特性”。使用-t和-tt命令行标志强制Python 2分别发出警告或(最好)错误。PEP 8也讨论了这个主题。:Python 3不允许混合使用制表符和空格进行缩进。带有制表符和空格混合缩进的Python 2代码应该转换为只使用空格。当使用-t选项调用Python2命令行解释器时,它会发出关于非法混合制表符和空格的代码的警告。当使用-TT时,这些警告将成为错误。强烈推荐这些选项!“IndationError:意外缩进”是什么意思?问题当语句不必要地缩进或其缩进与同一块中以前语句的缩进不匹配时,就会发生此错误。例如,下面程序中的第一条语句不必要地缩进:>>> print('Hello') # this is indented
File "<stdin>", line 1
print('Hello') # this is indented
^IndentationError: unexpected indent在本例中,can_drive = True中的行if块与前一条语句的缩进不匹配:>>> age = 10>>> can_drive = None>>> >>> if age >= 18:... print('You can drive')... can_drive = True # incorrectly indented
File "<stdin>", line 3
can_drive = True # incorrectly indented
^IndentationError: unexpected indent固定这个错误的修正是首先确保有问题的行甚至需要缩进。例如,上面的示例使用print可以固定,只需不缩进行:>>> print('Hello') # simply unindent the lineHello但是,如果您确定该行确实需要缩进,则缩进需要与同一块中的前一个语句的缩进匹配。在上面的第二个示例中,使用if,我们可以通过确保can_drive = True中的前一语句在同一级别缩进。if尸体:>>> age = 10>>> can_drive = None>>> >>> if age >= 18:... print('You can drive')...
can_drive = True # indent this line at the same level....“IndationError:预期的缩进块”是什么意思?问题当Python看到复合语句的“标头”时,会发生此错误,如if <condition>:或while <condition>:但是复合陈述的身体或块从来没有定义过。例如,在下面的代码中,我们开始了一个if语句,但我们从未为该语句定义一个主体:>>> if True:...
File "<stdin>", line 2
^IndentationError: expected an indented block在第二个例子中,我们开始编写一个for循环,但我们忘记了缩进for循环体。因此Python仍然需要一个缩进块作为for回路体:>>> names = ['sarah', 'lucy', 'michael']>>> for name in names:... print(name)
File "<stdin>", line 2
print(name)
^IndentationError: expected an indented block评论不算作身体:>>> if True:... # TODO...
File "<stdin>", line 3
^IndentationError: expected an indented block固定此错误的修正是简单地包含复合语句的主体。正如上面所示,新用户的一个常见错误是他们忘记了缩进身体。如果是这样的话,请确保将包含在复合语句主体中的每个语句缩进复合语句的起始项下的同一级别。下面是上面的固定示例:>>> names = ['sarah', 'lucy', 'michael']>>> for name in names:... print(name) # The for loop body is now correctly indented.... sarah
lucy
michael另一种常见的情况是,由于某种原因,用户可能不想为复合语句定义一个实际的主体,或者可能将主体注释掉。在这种情况下,pass语句可以使用。这个pass语句可以在Python需要一个或多个语句作为占位符的任何地方使用。的文件pass:PASS是一个空操作-当它被执行时,什么都不会发生。当语句在语法上是必需的,但不需要执行代码时,它作为占位符非常有用,例如:def f(arg): pass # a function that does nothing (yet)class C: pass # a class with no methods (yet)下面是上面使用if语句,通过使用pass关键词:>>> if True:... pass # We don't want to define a body.... >>>“INDISTationError:UNINENDENT不匹配任何外部缩进级别”是什么意思?问题当您取消一个语句的缩进时,会发生此错误,但现在该语句的缩进级别与任何前一个语句的缩进级别不匹配。例如,在下面的代码中,我们取消了第二个调用print..但是,缩进级别与以前的任何语句不匹配:>>> if True:... if True:... print('yes')... print()
File "<stdin>", line 4
print()
^IndentationError: unindent does not match any outer indentation level这个错误很难捕捉,因为即使是一个空格也会导致代码失败。固定修复方法是确保在取消对语句进行缩进时,缩进级别与前一条语句的缩进级别相匹配。再考虑一下上面的例子。在这个示例中,我希望第二个调用在第一个调用中打印。if陈述体。因此,我需要确保行的缩进级别与第一个语句中的前一个语句的缩进级别相匹配。if声明正文:>>> if True:... if True:... print('yes')... print() # indentation level now matches former statement's level.... yes>>>我仍然得到一个IndationError,但我的程序似乎是正确的缩进。我做什么好?如果您的程序在视觉上看起来有正确的缩进,但是您仍然得到一个IndentationError你最有可能带空格的混合制表符..这有时会导致Python引发奇怪的错误。见本款特例在……下面“TabError:缩进中不一致地使用制表符和空格”是什么意思?更深入地解释这个问题。“TabError:缩进中不一致地使用制表符和空格”是什么意思?问题此错误仅在尝试将制表符和空格混合为缩进字符时发生。如前所述,Python将不允许程序包含制表符和空格的混合,并将引发特定的异常。TabError如果它发现你有。例如,在下面的程序中,标签和空格的混合用于缩进:>>> if True:... if True:... print()... print()... print()
File "<stdin>", line 5
print()
^TabError: inconsistent use of tabs and spaces in indentation这里有一张图片,它直观地显示了上述程序中的空白。灰色点是空格,灰色箭头是标签:我们可以看到,我们确实有混合空格和制表符的缩进。特例注Python不会 总提出TabError如果你把制表符和空格混合到你的程序中。如果程序缩进是明确的,Python将允许制表符和空格混合。例如:>>> if True:... if True: # tab... pass # tab, then 4 spaces... >>>有时Python只是简单地将制表符和空格混合起来,并错误地引发IndentationError异常时,TabError会更合适。另一个例子:>>> if True:... pass # tab... pass # 4 spaces
File "<stdin>", line 3
pass # 4 spaces
^IndentationError: unindent does not match any outer indentation level如您所见,以这种方式运行代码可能会产生神秘的错误。即使程序目视看起来不错,Python试图解析用于缩进和错误输出的制表符和空格时感到困惑。这些很好的例子说明了为什么不混合制表符和空格并使用-t和-tt使用Python 2时的解释器标志。固定如果你的程序是短的,也许最简单和最快的解决方法就是简单地重新缩进程序。确保每个语句在每个缩进级别上缩进四个空格(参见我如何缩进我的代码?).但是,如果您已经有了一个将制表符和空格混合到的大型程序,则可以使用一些自动化工具将所有缩进转换为仅为空格的缩进。许多编辑,如皮查姆和亚石灰质文本有自动将制表符转换为空格的选项。还有一些在线工具,如制表符到空格或褐变这样您就可以快速地重新缩进代码。还有用Python编写的工具。自动接收8例如,可以自动重新缩进您的代码和其他缩进错误。即使是最好的工具,有时也无法修复所有的缩进错误,您必须手动修复它们。这就是为什么从一开始就正确地缩进代码是很重要的。关于“SyntaxError”相关缩进问题的注记虽然不经常,但有时肯定SyntaxError异常是由于不正确的缩进引起的。例如,查看下面的代码:if True:
passpass # oops! this statement should be indented!.else:
pass当运行上述代码时,SyntaxError is raised:Traceback (most recent call last):
File "python", line 4
else:
^SyntaxError: invalid syntax虽然Python引发了SyntaxError,真品以上代码的问题是,第二个pass语句应缩进。因为第二个pass没有缩进,Python没有意识到if声明和else语句是用来连接的。这种错误的修正是简单地正确地重新缩进您的代码。若要查看如何正确缩进代码,请参阅我如何缩进我的代码?.我仍然很难使用Python的缩进语法。我做什么好?如果你还在挣扎,不要灰心。使用Python的空格语法规则需要时间。以下是一些帮助的建议:获取一个编辑器,该编辑器将在出现缩进错误时告诉您。有些商品如上面所说,皮查姆, 亚石灰质文本,和木星笔记本.当你缩进你的代码时,大声地数一数你按空格键(或标签键)的次数。例如,如果您需要将一行缩进四个空格,您就会大声说出“一, 二, 三, 四“每次同时按空格键的时候,这听起来很傻,但它有助于训练你的大脑思考你的代码缩进有多深。”如果您有一个编辑器,看看它是否有自动将制表符转换为空格的选项。查看其他人的代码。浏览GitHub或StackOverflow并查看Python代码的示例。写代码就行了。这是最好的方法。编写Python代码越多,效果就越好。所用资源https://en.wikipedia.org/https://docs.python.org/3/http:/python-History.blogpot.com/2009/02/早期语言-设计和开发.htmlhttps://www.python.org/dev/peps/pep-0008/