解析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爬虫利用cookie实现模拟登陆实例详解
Jan 12 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
pyhton列表转换为数组的实例
Apr 04 Python
如何在Python中实现goto语句的方法
May 18 Python
Python常用数据类型之间的转换总结
Sep 06 Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
python 负数取模运算实例
Jun 03 Python
Python爬取梨视频的示例
Jan 29 Python
python 爬取豆瓣网页的示例
Apr 13 Python
python脚本框架webpy模板控制结构
Nov 20 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网页后退不再出现过期
2007/03/08 PHP
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
简单的PHP多图上传小程序代码
2011/07/17 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
Python写的英文字符大小写转换代码示例
2015/03/06 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
python中for用来遍历range函数的方法
2018/06/08 Python
wxpython布局的实现方法
2019/11/01 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
Java里面有没有全局变量?为什么?
2015/02/06 面试题
提高EJB性能都有哪些技巧
2012/03/25 面试题
师说教学反思
2014/02/07 职场文书
临床护理求职信
2014/04/26 职场文书
2015年纪委工作总结
2015/05/13 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL