解析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/ironpython:从入门到精通
Oct 02 Python
深入理解Python中字典的键的使用
Aug 19 Python
理解Python中的绝对路径和相对路径
Aug 30 Python
Python实现通讯录功能
Feb 22 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
python实现网站微信登录的示例代码
Sep 18 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
Django框架请求生命周期实现原理
Nov 13 Python
python中slice参数过长的处理方法及实例
Dec 15 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遍历目录文件的常用方法小结
2017/02/03 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
js中function()使用方法
2013/12/24 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
Numpy之random函数使用学习
2019/01/29 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
Python列表元素常见操作简单示例
2019/10/25 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
python为什么会环境变量设置不成功
2020/06/23 Python
Python常用数据分析模块原理解析
2020/07/20 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
外语专业毕业生自我评价分享
2013/10/05 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
产品发布会策划方案
2014/05/12 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs