解析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
投稿

猜你喜欢

  • python中尾递归用法实例详解

    2023-10-09 06:46:15
  • Python删除指定目录下过期文件的2个脚本分享

    2022-09-11 19:01:10
  • 如何利用SQL Server数据库快照形成报表

    2009-01-15 11:55:00
  • IE下绝对定位的元素不能响应鼠标的bug修正

    2008-09-10 13:03:00
  • 事件检测

    2009-04-11 18:03:00
  • js页面文字选中后分享到新浪微博实现

    2011-03-17 12:55:00
  • 编写PHP脚本使WordPress的主题支持Widget侧边栏

    2023-11-23 20:27:13
  • ASP存储过程应用全接触

    2007-08-18 14:28:00
  • asp多关键词查询方案

    2008-05-09 12:24:00
  • 用正则表达式表示不包含2950的字符串

    2010-03-02 22:10:00
  • Python依赖包迁移到断网环境操作

    2021-06-27 06:58:29
  • php开启mysqli扩展之后如何连接数据库

    2023-11-14 17:36:08
  • 使用python将图片改为灰度图或黑白图

    2023-04-17 12:28:52
  • 自定义数据库自动编号初始值和步进值

    2009-05-19 10:00:00
  • 利用PyQt5中QLabel组件实现亚克力磨砂效果

    2023-12-13 18:33:04
  • margin双倍边距问题:ie和firefox显示

    2008-09-07 15:05:00
  • 浅谈Python之Django(三)

    2021-07-07 00:38:25
  • Python DataFrame.groupby()聚合函数,分组级运算

    2022-02-08 07:23:09
  • ASP数据库连接方式大全

    2023-07-12 05:52:59
  • django实现支付宝支付实例讲解

    2023-08-27 04:45:44
  • asp之家 网络编程 m.aspxhome.com