解析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中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python基础教程项目二之画幅好画
Apr 02 Python
Python将DataFrame的某一列作为index的方法
Apr 08 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
Oct 28 Python
Python实现带参数的用户验证功能装饰器示例
Dec 14 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
如何使用Pytorch搭建模型
Oct 26 Python
Python远程linux执行命令实现
Nov 11 Python
使用pandas实现筛选出指定列值所对应的行
Dec 13 Python
浅析python字符串前加r、f、u、l 的区别
Jan 24 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 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往XML中添加节点的方法
2015/03/12 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
Ajax局部更新导致JS事件重复触发问题的解决方法
2014/10/14 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
JS实现图片切换效果
2018/11/17 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
简单谈谈python中的多进程
2016/11/06 Python
python 使用get_argument获取url query参数
2017/04/28 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
python实现字典嵌套列表取值
2019/12/16 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
python中get和post有什么区别
2020/06/19 Python
Python如何定义有默认参数的函数
2020/08/10 Python
分享PyCharm最新激活码(真永久激活方法)不用每月找安装参数或最新激活码了
2020/12/27 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
市场营销专业推荐信
2013/11/03 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
大学生活自我评价
2014/04/09 职场文书
服务承诺书格式
2014/05/21 职场文书
公务员诚信承诺书
2014/05/26 职场文书
2016国庆促销广告语
2016/01/28 职场文书
检讨书格式
2019/04/25 职场文书