解析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共享引用(多个变量引用)示例代码
Dec 04 Python
python使用三角迭代计算圆周率PI的方法
Mar 20 Python
Python中的time模块与datetime模块用法总结
Jun 30 Python
使用python3构建文件传输的方法
Feb 13 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
wxpython实现按钮切换界面的方法
Nov 19 Python
python构建指数平滑预测模型示例
Nov 21 Python
基于python修改srt字幕的时间轴
Feb 03 Python
基于python实现获取网页图片过程解析
May 11 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 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下使用curl模拟用户登陆的代码
2010/09/10 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
Less 安装及基本用法
2018/05/05 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
es6数组includes()用法实例分析
2020/04/18 Javascript
Python sorted函数详解(高级篇)
2018/09/18 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python SOCKET编程基础入门
2021/02/27 Python
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
文明美德伴我成长演讲稿
2014/05/12 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
PHP中多字节字符串操作实例详解
2021/08/23 PHP
mysql数据库隔离级别详解
2022/06/16 MySQL
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers