解析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实现simhash算法实例
Apr 25 Python
详解在Python的Django框架中创建模板库的方法
Jul 20 Python
Python发送form-data请求及拼接form-data内容的方法
Mar 05 Python
回调函数的意义以及python实现实例
Jun 20 Python
django如何自己创建一个中间件
Jul 24 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
python 类之间的参数传递方式
Dec 20 Python
python实现文法左递归的消除方法
May 22 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
python复合条件下的字典排序
Dec 18 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
Python中对象的比较操作==和is区别详析
Feb 12 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 中英文语言转换类代码
2011/08/11 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
node.js中watch机制详解
2014/11/17 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
如何用python整理附件
2018/05/13 Python
python实现顺序表的简单代码
2018/09/28 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
Python grpc超时机制代码示例
2020/09/14 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
财务出纳岗位职责
2014/02/03 职场文书
爱护公共设施的标语
2014/06/24 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
公司内部升职自荐信
2015/03/27 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
Tomcat用户管理的优化配置详解
2022/03/31 Servers