解析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线程中对join方法的运用的教程
Apr 09 Python
Python argv用法详解
Jan 08 Python
Python跨文件全局变量的实现方法示例
Dec 10 Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
TensorFlow实现Batch Normalization
Mar 08 Python
解决Django的request.POST获取不到内容的问题
May 28 Python
python进行两个表格对比的方法
Jun 27 Python
使用tensorflow实现线性回归
Sep 08 Python
Python ini文件常用操作方法解析
Apr 26 Python
Python使用itcaht库实现微信自动收发消息功能
Jul 13 Python
Python基础教程,Python入门教程(超详细)
Jun 24 Python
python区块链持久化和命令行接口实现简版
May 25 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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
PHP中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
JavaScript经典效果集锦
2010/07/06 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
JS中创建函数的三种方式及区别
2016/03/13 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
python对数组进行反转的方法
2015/05/20 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
资产经营总监岗位职责范文
2013/12/01 职场文书
客户接待方案
2014/02/26 职场文书
服装发布会策划方案
2014/05/22 职场文书
开学典礼致辞
2015/07/29 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python