解析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使用htmllib分析网页内容的方法
May 08 Python
python解析xml文件实例分析
May 27 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 Python
启动Atom并运行python文件的步骤
Nov 09 Python
django-filter和普通查询的例子
Aug 12 Python
Python中关于浮点数的冷知识
Sep 22 Python
Python使用pdb调试代码的技巧
May 03 Python
Python如何使用正则表达式爬取京东商品信息
Jun 01 Python
对python pandas中 inplace 参数的理解
Jun 27 Python
简单的命令查看安装的python版本号
Aug 28 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 goto语句简介和使用实例
2014/03/11 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
javaScript对象和属性的创建方法
2007/01/15 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
Python内置函数——__import__ 的使用方法
2017/11/24 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
Django之模板层的实现代码
2019/09/09 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
浅谈Html5页面打开app的一些思考
2020/03/30 HTML / CSS
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
期末自我鉴定
2014/01/23 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL