解析Python的缩进规则的使用


Posted in Python onJanuary 16, 2019

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现在Linux系统下更改当前进程运行用户
Feb 04 Python
极简的Python入门指引
Apr 01 Python
Python3写入文件常用方法实例分析
May 22 Python
详解Python中的序列化与反序列化的使用
Jun 30 Python
教你用Type Hint提高Python程序开发效率
Aug 08 Python
django实现用户登陆功能详解
Dec 11 Python
pandas对指定列进行填充的方法
Apr 11 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
python sklearn常用分类算法模型的调用
Oct 16 Python
python实现引用其他路径包里面的模块
Mar 09 Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 Python
使用Python项目生成所有依赖包的清单方式
Jul 13 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 #Python
浅谈python3.x pool.map()方法的实质
Jan 16 #Python
在Pycharm terminal中字体大小设置的方法
Jan 16 #Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 #Python
在pycharm中设置显示行数的方法
Jan 16 #Python
PyCharm设置每行最大长度限制的方法
Jan 16 #Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 #Python
You might like
PHP+DBM的同学录程序(5)
2006/10/09 PHP
使用php来实现网络服务
2009/09/15 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
javascript从作用域链谈闭包
2020/07/29 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
AngularJS入门教程之路由与多视图详解
2016/08/19 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
Python中的文件和目录操作实现代码
2011/03/13 Python
Python中的类与对象之描述符详解
2015/03/27 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
简历的自荐信
2013/12/19 职场文书
节能减排倡议书
2014/04/15 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
关于保护环境的标语
2014/06/09 职场文书
六年级小学生评语
2014/12/26 职场文书
病房管理制度范本
2015/08/06 职场文书
用Python实现屏幕截图详解
2022/01/22 Python