解析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使用xmlrpc实例讲解
Dec 17 Python
python模块之StringIO使用示例
Apr 08 Python
举例详解Python中yield生成器的用法
Aug 05 Python
Python中基础的socket编程实战攻略
Jun 01 Python
Windows下安装python MySQLdb遇到的问题及解决方法
Mar 16 Python
python编程实现归并排序
Apr 14 Python
Python线程创建和终止实例代码
Jan 20 Python
python实现键盘输入的实操方法
Jul 16 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
python如何将两个txt文件内容合并
Oct 18 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
Nov 06 Python
python3中数组逆序输出方法
Dec 01 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页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
EasyUI中的tree用法介绍
2011/11/01 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
使用python去除图片白色像素的实例
2019/12/12 Python
Python telnet登陆功能实现代码
2020/04/16 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
学校门卫岗位职责
2014/03/16 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
工作简历自我评价
2015/03/11 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
python神经网络Xception模型
2022/05/06 Python