程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

python散装笔记——3: 缩进

hfteth 2025-01-18 20:05:49 技术文章 15 ℃

1: 简单示例

对于 Python,Guido van Rossum(python语言的创立者) 将语句分组基于缩进。冒号 : 用于声明缩进代码块,如以下示例所示:

class ExampleClass:
    # 属于一个类的每个函数都必须同样缩进
    def __init__(self):
        name = "example"
        
    def someFunction(self, a):
        # 注意属于函数的所有内容都必须缩进
        if a > 5:
            return True
        else:
            return False
          
# 如果函数没有缩进到同一级别,则不会被视为父类的一部分
def separateFunction(b):
    for i in b:
    # 循环也是缩进的,嵌套条件开始新的缩进
        if i == 1:
            return True
    return False
separateFunction([2,3,5,6,1])

制表符和空格?

建议的缩进为 4 个空格,但可以使用制表符或空格,只要它们在整个文件中保持一致即可。不要在一个文件中混合使用制表符和空格,因为这会导致出现错误。

2: 如何解析缩进

缩进产生的空白在解析之前由解析器处理。

解析器使用堆栈来存储缩进级别。开始时,堆栈仅包含值 0,这是最左侧的位置。每当嵌套块开始时,新的缩进级别就会被推送到堆栈上,并且 “INDENT” 标记会被插入并传递给解析器的标记流中。一行中不能有多个 “INDENT” 标记 ,这将产生 IndentationError 的报错。

当遇到具有较小缩进级别的行时,将从堆栈中弹出值,直到顶部有一个值等于新的缩进级别(如果未找到,则会发生语法错误)。对于弹出的每个值,都会生成一个 “DEDENT” 标记。显然,一行中可以有多个 “DEDENT” 标记。

解析器会跳过仅包含空格和可能的注释的空行,并且永远不会为它们生成“INDENT”或“DEDENT”标记。

在源代码的末尾,为堆栈上留下的每个缩进级别生成 “DEDENT” 标记,直到只剩下 0。

例如:

if foo:
    if bar:
        x = 42
else:
    print foo

解析为下面这个样子:

<if> <foo> <:> [0]
<INDENT> <if> <bar> <:> [0, 4]
<INDENT> <x> <=> <42> [0, 4, 8]
<DEDENT> <DEDENT> <else> <:> [0]
<INDENT> <print> <foo> [0, 2]
<DEDENT>

解析器将 “INDENT” 和 “DEDENT” 令牌作为区块分隔符处理。

3: 缩进的错误示范

间距应均匀一致。不正确的缩进可能会导致 IndentationError 或导致程序执行意外操作。以下示例引发 IndentationError

a = 7
if a > 5:
    print "foo"
else:
    print "bar"
  print "done"

或者,如果冒号后面的行没有缩进,也会引发 IndentationError

if True:
print "true"

如果你在不属于它的地方添加缩进,同样会引发 IndentationError

if True:
    a = 6
      b = 5

如果忘记取消缩进,则功能可能会丢失。在此示例中,返回 None 而不是预期的 False

def isEven(a):
    if a%2 ==0:
        return True
        # this next line should be even with the if
        return False
print isEven(7)



Tags:

最近发表
标签列表