解析Python的缩进规则的使用

作者:HDWK 时间:2022-11-27 10:14:16 

Python中的缩进(Indentation)决定了代码的作用域范围。这一点和传统的c/c++有很大的不同(传统的c/c++使用花括号{}符,python使用缩进空格)。

每行代码中开头的空格数(whitespace)用于计算该行代码的缩进级别(Indentation level),注意一个Tab等于8个空格(Space),缩进级别为0表示无缩进空格。

Python中的每一条语句都有一个缩进级别,并且缩进级别会使用栈的数据结构进行存储。在开始读取文件之前,0(表示缩进级别为0,无缩进)会被首先压入栈中。然后从文件开头到末尾,依次读取每行逻辑代码,每行逻辑代码的缩进级别都会和栈顶值进行比较,如果相等,那么什么都不会发生;如果比栈顶值大的话,那么该行逻辑代码的缩进级别就会被压入栈中,同时会生成一个缩进标记(INDENT LEVEL);如果比栈顶值小的话,那么栈中所有比该行逻辑代码缩进级别大的值都会从栈中移除,并且还会生成一个扩展标记(DEDENT LEVEL)。

下面是一个正确的缩进案例:


def perm(l):#0
   # Compute the list of all permutations of l
 if len(l) <= 1:# 1
        return [l]# 2
 r = []# 3
 for i in range(len(l)):# 4
      s = l[:i] + l[i+1:]# 5
      p = perm(s)# 6
      for x in p:# 7
      r.append(l[i:i+1] + x)# 8
 return r# 9

上面的#0行,缩进0个字符,由于文件读取之前0已经被压入栈中了,所以栈中的数据不会发生改变。#1缩进4个字符,4被压入栈中。#2缩进18个字符,18被压入栈中。#3缩进4个字符,18被弹出栈,栈顶值又为4了。#4和#3缩进一样,所以不更新栈数据。#5缩进13个字符,所以13被压入栈中。#5、#6和#7的缩进一样,不更新栈数据。#8缩进14个字符,14被压入栈中。#9的缩进4个字符,所以栈中的13和14都会弹出,栈顶值又恢复为4。

下面是一个错误的案例


  def perm(l):            #1 error: first line indented
 for i in range(len(l)):       #2 error: not indented
   s = l[:i] + l[i+1:]
     p = perm(l[:i] + l[i+1:])  #3 error: unexpected indent
     for x in p:
         r.append(l[i:i+1] + x)#4
       return r        #5 error: inconsistent dedent

#1、#2和#3处的错误解释的很清楚了。#5的缩进级别在栈中找不到所以出错,#5处的缩进级别是14,比它的上面一行缩进级别18,所以在#5处应该进行出栈处理,但是在栈中找不到14这个级别,所以出错。

又比如:


if True:
 print("hello girl")
else:
 print("hello boy")
print("end")

最后一行代码的缩进级别是1,而且比上一行代码的缩进级别小,所以应该出栈处理,但是在出站的时候找不到栈中以前有1的级别,所以报错。

要修改的话,只需要将最后一行的空格去掉就可以。

参考文章:https://docs.python.org/2.0/ref/indentation.html

来源:http://www.cnblogs.com/HDK2016/p/10274956.html

标签:Python,缩进规则
0
投稿

猜你喜欢

  • css把超出的部分显示为省略号的方法兼容火狐

    2010-10-07 09:02:44
  • CSS模块化设计—从空格谈起

    2007-12-15 09:41:00
  • 微信小程序开发注意指南和优化实践(小结)

    2024-04-17 10:38:05
  • 解析一个通过添加本地分区索引提高SQL性能的案例

    2023-07-22 13:29:32
  • javascript学习总结之js使用技巧

    2024-04-18 10:59:16
  • Python中and和or如何使用

    2022-04-27 18:01:49
  • pycharm设置虚拟环境与更换镜像教程

    2023-06-10 06:58:05
  • Python3之读取连接过的网络并定位的方法

    2022-02-20 00:36:43
  • ASP 游标参数详解(ASP记录集)第1/2页

    2011-04-08 11:04:00
  • php遍历目录方法小结

    2023-11-17 12:49:40
  • Python中集合创建与使用详解

    2022-04-30 05:29:42
  • 查看 MySQL 已经运行多长时间的方法

    2024-01-14 09:57:05
  • Google开源的Python格式化工具YAPF的安装和使用教程

    2023-02-02 12:32:16
  • 从两个方面讲解SQL Server口令的脆弱性

    2009-01-08 13:40:00
  • python下函数参数的传递(参数带星号的说明)

    2022-12-20 02:58:59
  • python绘制动态曲线教程

    2023-01-20 08:24:33
  • python好玩的项目—色情图片识别代码分享

    2022-01-26 03:19:19
  • 微信小程序位置授权处理方法

    2024-06-10 08:21:05
  • SQL SERVER的字段类型介绍

    2008-05-23 13:27:00
  • 图片完美缩放

    2024-04-22 13:07:22
  • asp之家 网络编程 m.aspxhome.com