解析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实现的一个自动售饮料程序代码分享
Aug 25 Python
python中文编码问题小结
Sep 28 Python
python复制与引用用法分析
Apr 08 Python
Python中集合的内建函数和内建方法学习教程
Aug 19 Python
python pandas 对series和dataframe的重置索引reindex方法
Jun 07 Python
Python检查ping终端的方法
Jan 26 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
Python基于百度AI实现OCR文字识别
Apr 02 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
python如何实现图片压缩
Sep 11 Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 Python
一文搞懂如何实现Go 超时控制
Mar 30 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内存管理之谁动了我的内存
2013/06/20 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
JavaScript程序中实现继承特性的方式总结
2016/06/24 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
前端开发基础javaScript的六大作用
2020/08/06 Javascript
Django中url的反向查询的方法
2018/03/14 Python
sklearn+python:线性回归案例
2020/02/24 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
Staples美国官方网站:办公用品一站式采购
2016/07/28 全球购物
J2EE相关知识面试题
2013/08/26 面试题
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
高三英语教学计划
2015/01/23 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
无罪辩护词范文
2015/05/21 职场文书
庆七一活动简报
2015/07/20 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS