解析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 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
wxpython中Textctrl回车事件无效的解决方法
Jul 21 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
Python中的元组介绍
Jan 28 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
基于Django实现日志记录报错信息
Dec 17 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
Feb 13 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 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
人大复印资料处理程序_查询篇
2006/10/09 PHP
mysql 性能的检查和优化方法
2009/06/21 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
php实现的短网址算法分享
2014/06/20 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
php中的登陆login实例代码
2016/06/20 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
零基础php编程好学吗
2019/10/11 PHP
看了就知道什么是JSON
2007/12/09 Javascript
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
Vue插件打包与发布的方法示例
2018/08/20 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
Python中的__slots__示例详解
2017/07/06 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
自荐信包含哪些内容
2013/10/30 职场文书
单位提档介绍信
2014/01/17 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python
Python面向对象编程之类的概念
2021/11/01 Python