解析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中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
Python第三方库的安装方法总结
Jun 06 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
使用python获取电脑的磁盘信息方法
Nov 01 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
Python比较配置文件的方法实例详解
Jun 06 Python
python调用c++返回带成员指针的类指针实例
Dec 12 Python
Python 将 QQ 好友头像生成祝福语的实现代码
May 03 Python
Keras之fit_generator与train_on_batch用法
Jun 17 Python
Python 使用双重循环打印图形菱形操作
Aug 09 Python
Python一些基本的图像操作和处理总结
Jun 23 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 ADODB使用方法集锦
2008/03/25 PHP
精通php的十大要点(上)
2009/02/04 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
js如何实现设计模式中的模板方法
2013/07/23 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
python对视频画框标记后保存的方法
2018/12/07 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
详解python解压压缩包的五种方法
2019/07/05 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
python基于socket函数实现端口扫描
2020/05/28 Python
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
大学教师年终总结的自我评价
2013/10/29 职场文书
公司门卫管理制度
2014/02/01 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
一份创业计划书范文
2014/02/08 职场文书
车辆转让协议书
2014/09/24 职场文书
党员三严三实心得体会
2014/10/13 职场文书
老公保证书
2015/01/17 职场文书
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技