Python的缩进规则「建议收藏」

Python中的缩进(Indentation)决定了代码的作用域范围。这一点和传统的c/c++有很大的不同(传统的c/c++使用花括号花括号{}符决定作用域的范围;python使用缩进空格来表示作用域的范围,相同缩进行的代码是处于同一范围)。每行代码中开头的空格数(whitespace)用于计算该行代码的缩进级别(Indentationlevel),注意一个Tab会被替换为1~8个Space(具体的空格数量,不同的编译器有不同的数量),缩进级别为0表示无缩进空格。在一个源文件不建议同时使用空格和制表缩

大家好,又见面了,我是你们的朋友全栈君。

Python中的缩进(Indentation)决定了代码的作用域范围。这一点和传统的c/c++有很大的不同(传统的c/c++使用花括号花括号{}符决定作用域的范围;python使用缩进空格来表示作用域的范围,相同缩进行的代码是处于同一范围)。

每行代码中开头的空格数(whitespace)用于计算该行代码的缩进级别(Indentation level),注意一个Tab会被替换为1~8个Space(具体的空格数量,不同的编译器有不同的数量),缩进级别为0表示无缩进空格。

在一个源文件不建议同时使用空格和制表缩进符,当使用别人代码的时候几乎是不可能知道别人使用的是空格还是制表符,这时最好统一缩进,在IDEL编辑器中可以使用 Edit > Untabify Region 将任何制表符转化为空格。

Python中的每一条语句都有一个缩进级别,并且缩进级别会使用栈的数据结构进行存储。在开始读取文件之前,0(表示缩进级别为0,无缩进)会被首先压入栈中。然后从文件开头到末尾,依次读取每行逻辑代码,每行逻辑代码的缩进级别都会和栈顶值进行比较,如果相等,那么什么都不会发生;如果比栈顶值大的话,那么该行逻辑代码的缩进级别就会被压入栈中,同时会生成一个缩进标记(INDENT TOKEN);如果比栈顶值小的话,那么栈中所有比该行逻辑代码缩进级别大的值都会从栈中移除,并且还会生成一个扩展标记(DEDENT TOKEN)。

下面是一个正确的缩进案例:

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。

下面是一个错误的案例

''' Python大型免费公开课,适合初学者入门 加QQ群:579817333 获取学习资料及必备软件。 '''
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的级别,所以报错。修改这个错误,只需要将最后一行的空格去掉就可以。

结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!

Python基础入门教程推荐:更多Python视频教程-关注B站:Python学习者

【Python教程】全网最容易听懂的1000集python系统学习教程(答疑在最后四期,满满干货)

Python爬虫案例教程推荐:更多Python视频教程-关注B站:Python学习者

2021年Python最新最全100个爬虫完整案例教程,数据分析,数据可视化,记得收藏哦

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127548.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MATLAB 相机标定(单目)使用工具箱TOOLBOX_calib[通俗易懂]

    MATLAB 相机标定(单目)使用工具箱TOOLBOX_calib[通俗易懂]环境MATLABR2014a+windows764位1.单目摄像机标定(1)首先把解压的TOOLBOX_calib文件夹的路径设置到MATLAB里,在主页-&gt;环境-&gt;设置路径-&gt;选择工具箱路径,如图:然后保存,关闭(2)此时,将你采集到的图片放到工具箱以外的文件夹中,在MATLAB中打开,如图:注意上面的路径,必须选择图像所在的文件夹,不然下一步会出现错误“Noimage…

    2022年5月22日
    39
  • 金士顿dt100g3无法读盘_金士顿u盘维修点

    金士顿dt100g3无法读盘_金士顿u盘维修点昨天给微星GT80S装ubuntu时制作U盘ISO镜像时使用工具把u盘给整费了,跟了我3年的u盘呐(相较我以前的U盘质量不知好了多少倍):想当初这种入门级的3.0U盘还是刚出,也不便宜。顺便看看这逆天的电脑,我是头一回见这种笔记本,比台式机都重,还那么大,专门玩游戏的,给我我估计是会买,太逆天了:好了进入正题:解救我的U盘:1.拆:#可以先用一个扁平的工具将前面的滑

    2025年10月16日
    3
  • LED亮度调节原理

    LED亮度调节原理近年来Light-emittingdiode(LED)被广泛用于照明行业,相较于其他光源,LED具有诸多优势:光效高、寿命长、色温变化小、动态响应快、体积小等。那么如何才能设计出合理的灯具呢,我来给大家罗列一下LED的主要特性。一.发光原理当电流被注入到半导体的PN结时,原子中低能级的电子吸收能量从基态被激发到较高能级,这个能级我们称之为激发态。而激发态的寿命是短暂的,他十…

    2022年6月9日
    66
  • 10月22日Ajax培训日记

    10月22日Ajax培训日记今天还是由梁言兵老师讲解Ajax,根据昨天学员的反馈,觉得AjaxTable这个项目太大了,学习起来有点费劲,希望梁老师讲一个较小的综合案例。所以,梁老师先讲解XTree这个客户端JavaScript组件,然后结合XTree,buffalo,spring,hibernate这些框架开发一个Ajax的demo。小收获:varobj={a:’xxx’b:function(){}}定义…

    2025年10月30日
    12
  • Ant Design setFieldsValue 无效问题

    Ant Design setFieldsValue 无效问题

    2020年11月9日
    888
  • 做3D游戏建模师有年龄限制吗?

    做3D游戏建模师有年龄限制吗?3D游戏建模师是一门非常火热的行业,现在很多游戏厂商都在高薪招聘3D游戏建模师。因此很多人在想要学习次世代建模技术的同时,又担心企做这个会不会有年龄的限制。其实大可不必担心,因为只要本身具有学习能力,愿意接受新知识,愿意与时俱进的提高自己,那么年龄就不是你的问题。其实年龄大的人从事3D游戏建模行业也是有一定优势的,他们生活阅历丰富,对于如何把握人物建模和场景建模方面的细节会有自己独到的理解。同时又具备一定缺陷,在学习方面会有一定的障碍,因为不管是记忆力还是对新知识的接受能力都会有所下降,所以一定要选择一

    2022年6月3日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号