解析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 运算符 供重载参考
Jun 11 Python
Python中利用sorted()函数排序的简单教程
Apr 27 Python
python daemon守护进程实现
Aug 27 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
Django ModelForm组件使用方法详解
Jul 23 Python
python异常触发及自定义异常类解析
Aug 06 Python
详解python中的模块及包导入
Aug 30 Python
pytorch实现Tensor变量之间的转换
Feb 17 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 Python
深入理解Pytorch微调torchvision模型
Nov 11 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 url地址栏传中文乱码解决方法集合
2010/06/25 PHP
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
PHP实现多文件上传的方法
2015/07/08 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
js实现日历与定时器
2017/02/22 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
分享一个可以生成各种进制格式IP的小工具实例代码
2017/07/28 Python
Python中一行和多行import模块问题
2018/04/01 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
pycharm新建一个python工程步骤
2019/07/16 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
哈萨克斯坦移动和数字技术在线商店:SatelOnline.kz
2020/09/04 全球购物
员工自我鉴定范文
2013/10/06 职场文书
麦当劳辞职信范文
2014/01/18 职场文书
期末评语大全
2014/05/04 职场文书
青年文明号汇报材料
2014/12/23 职场文书
刘公岛导游词
2015/02/05 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
大国崛起日本观后感
2015/06/02 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书