解析Python的缩进规则的使用

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 分享vim python缩进等一些配置

    VIM python下的一些关于缩进的设置: 第一步: 打开终端,在终端上输入vim ~/.vimrc,回车. 第二步: 添加下面的文段: set filetype=python au BufNewFile,BufRead *.py,*.pyw setf python set helplang=cn "中文帮助文档(前提是下了中文包) syntax enable syntax on " 自动语法高亮 set number"显示行号 colorscheme desert&quo

  • Python中if elif else及缩进的使用简述

    代码如下所示: scole = input("input your scole:") if scole>90: print("A") elif scole>80: print("B") elif scole>70: print("C") elif scole>60: print("D") elif scole>50: print("E") else : pr

  • 不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)

    因为工作(懒惰),几年了,断断续续学习又半途而废了一个又一个技能.试着开始用博客记录学习过程中的问题和解决方式,以便激励自己和顺便万一帮助了别人呢. 最近面向对象写了个Python类,到访问限制(私有属性)时竟然报错,好多天百思不得其姐,没啥破绽啊!代码如下,可就是报错!(后面有报错截图) class Person(object): def run(self): print("run") def eat(self,food): print("eat " + food

  • Python代码块批量添加Tab缩进的方法

    选择一个合适的编辑器,比如notepad++.VS.eclipse.sublime text等,选中要集体缩进的代码块, 按Tab:集体缩进(向右) 按Shift+Tab:集体回缩(向左) 在Notepad++等编辑器中也有将Tab键转换为指定数目空格的功能. 以上这篇Python代码块批量添加Tab缩进的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python程序快速缩进多行代码方法总结

    该语言中缩进是其精髓,通过缩进可以表示函数.循环等程序结构的范围.有时写完程序后,发现所有程序需要放入函数def中,这时就需要对一整块程序同时进行缩进,还有其他一些情况,也会需要多行整体缩进.下面介绍官方的IDLE编辑器下,如何实现多行整体缩进. 这里介绍的是针对3.0及以上版本,软件自带编辑器,整块缩进的方法.首先通过开始菜单 ,找到IDLE,点击启动软件. 相关推荐:<Python视频教程> 启动软件后,通过file菜单下,打开或新建选项,打开一个已建好的或者新创建一个程序文件,这里新建一

  • 解析Python的缩进规则的使用

    Python中的缩进(Indentation)决定了代码的作用域范围.这一点和传统的c/c++有很大的不同(传统的c/c++使用花括号{}符,python使用缩进空格). 每行代码中开头的空格数(whitespace)用于计算该行代码的缩进级别(Indentation level),注意一个Tab等于8个空格(Space),缩进级别为0表示无缩进空格. Python中的每一条语句都有一个缩进级别,并且缩进级别会使用栈的数据结构进行存储.在开始读取文件之前,0(表示缩进级别为0,无缩进)会被首先压

  • 关于python的缩进规则的知识点详解

    一般的语言都是通过{}或end来作为代码块的标记,而Python则是通过缩进来识别代码块的. 对于Python的这种"缩进"风格,喜欢它的人说这是一种乐趣:不喜欢它的人说这是一门需要卡尺的语言,因为需要使用"游标卡尺"去测量每行代码的缩进. 不管怎么样,Python的开发者有意让违反了缩进规则的程序不能通过编译,以此让程序员养成良好的编程习惯.并且Python语言利用缩进表示语句块的开始和退出,而非使用{}或者其他字符. 今天就简单和大家介绍一下Python缩进的方

  • 深入解析Python小白学习【操作列表】

    1.遍历列表 需要对列表中的每个元素都执行相同的操作时,可使用for 循环: magicians = ['alice','david','carolina'] for magician in magicians: print(magician) >>>alice >>>david >>>carolina 循环中,Python将首先读取其中的第一行代码: for magician in magicians: 这行代码让Python获取列表magician

  • 解析Python扩展模块的加速方案

    ctypes(一) - 初识 很多初学Python的新手,总是嘴边挂着一句话:"Python是一门胶水语言". 可是究竟什么是胶水语言呢?相信很多人都不知道,或者误以为胶水就是可以直接和其他所有语言配合的语言. 虽然如今Python已经发展得很强大了,"胶水语言"这个特性已经很少被提及了.但是胶水仍然是它现在应用得最广泛的特性之一.只不过从曾经Python为辅变成了如今的Python为主而已. 那么到底什么是"胶水特性"呢? 其实Python自打

  • 解析python高级异常和运算符重载

    目录 一.高级异常 二.环境管理器 2.1.对象的属性管理函数 三.运算符重载 3.1.算术运算符的重载 四.反向算术运算符的重载 五.复合赋值算术运算符的重载 六.比较运算符的重载 七.位运算符重载 八.反向位运算符重载 九.复合赋值位运算符重载 十.一元运算符的重载 十一.in / not in 运算符的重载 十二.索引和切片运算符的重载 十三.slice 构造函数 一.高级异常 回顾异常相关的语句: try-except:用来捕获异常的通知 try-finally:用来做一定要做的事 re

  • python的命名规则知识点总结

    python命名规则 命名风格 python几种不同命名风格 驼峰式命名法(WjW) 混合式命名法(wjWj) 大写(WJWJWJ)或大写加下划线(WJWJWJ) 前缀(wjing)或后缀(ingwj)下划线,有时双下划线 变量 python变量分为: (1)常量 (2)公有和私有变量 1.常量 常量全局变量,使用大写加下划线.指定的变量表示一个常数值. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file))) 2.命名

  • Python代码缩进和测试模块示例详解

    前言 Python代码缩进和测试模块是大家学习python必不可少的一部分,本文主要介绍了关于Python代码缩进和测试模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.Python代码缩进 Python 函数没有明显的 begin 和 end ,没有标明函数的开始和结束的花括号.唯一的分隔符是一个冒号 ( : ),接着代码本身是缩进的. 例如:缩进 buil dCon necti onStr ing 函数 def buildConnectionString(

  • 通过实例解析Python调用json模块

    这篇文章主要介绍了通过实例解析Python调用json模块,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍 今天介绍一种数据格式,json.Json是JavaScript Object Notation的缩写,区别于txt.csv,json编码格式更加灵活,在工作也会经常遇到.在Python中要读写json是十分方便的,只需要调用json模块. 使用 直接导入模块 import json 两个读写数据的函数: json.dumps() 和

  • 通过实例解析python描述符原理作用

    这篇文章主要介绍了通过实例解析python描述符原理作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本质上看,描述符是一个类,只不过它定义了另一个类中属性的访问方式.换句话说,一个类可以将属性管理全权委托给描述符类. 描述符类基于以下三种特殊方法,换句话说,这三种方法组成了描述符协议: __set__(self, obj, type = None): 在设置属性时,将调用这一方法. __get__(self, obj, value): 在读

  • 解析python 中/ 和 % 和 //(地板除)

    python / 和 % 和 //(地板除)用于对数据进行除法运算. python中 // 和 / 和 % 简介 python中与除法相关的三个运算符是// 和 / 和 %,下面逐一介绍. "/",这是传统的除法,3/2=1.5 "//",在python中,这个叫"地板除",3//2=1 "%",这个是取模操作,也就是区余数,4%2=0,5%2=1 Python中分为3种除法:1./,2.%,3.//. 1./ 基于 pyth

随机推荐