解析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根据给定文件返回文件名和扩展名的方法
Mar 27 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
Python工程师面试题 与Python Web相关
Jan 14 Python
Python读取properties配置文件操作示例
Mar 29 Python
浅谈django orm 优化
Aug 18 Python
python对html过滤处理的方法
Oct 21 Python
pandas ix &amp;iloc &amp;loc的区别
Jan 10 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 Python
pycharm内无法import已安装的模块问题解决
Feb 12 Python
python使用pyecharts库画地图数据可视化的实现
Mar 25 Python
python实现的web监控系统
Apr 27 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中include()与require()的区别说明
2010/03/10 PHP
php array_search() 函数使用
2010/04/13 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
javascript 对象的定义方法
2007/01/10 Javascript
JQuery live函数
2010/12/24 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
Bootstrap Table使用整理(五)之分页组合查询
2017/06/09 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
tensorflow获取变量维度信息
2018/03/10 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
Python后台开发Django的教程详解(启动)
2019/04/08 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
基于python实现从尾到头打印链表
2019/11/02 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
Django 用户登陆访问限制实例 @login_required
2020/05/13 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
关于python中remove的一些坑小结
2021/01/04 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
大型会议接待方案
2014/03/01 职场文书
法制宣传月活动总结
2014/04/29 职场文书
活动总结的格式
2014/05/07 职场文书
2016年师德学习心得体会
2016/01/12 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书