零基础学编程031:Python与其它语言最不同的一条语法规则

有C或JAVA其它编程语言基础的人可能对Python中的这条语法规则最不适应:Python中的缩进是有语法含义的,它用来表示一个代码块(code block)。这里说的代码块是指函数定义条件语句循环语句等等。缩进就是指每行代码最前面的几个空格或TAB制表符,通常是与上一行的冒号一起使用的,例如:

# 为了清楚地表示缩进,我把空格都用.表示
def price(stock) :
....url = 'http://hq.sinajs.cn/list=' + stock
....with req.urlopen(url) as f :
........hq = f.read().decode('GBK')
........v = hq.split(',')
........return v[1]

假设用C#语言来写,大概是这样:

// 这段代码只是一个示例,无法通过编译
double price(string stock) {
    string url = 'http://hq.sinajs.cn/list=' + stock;
    using(WebRequest f = new WebRequest(url)) {
        string hq = f.read().decode('GBK');
        string []v = hq.split(',');
        return v[1];
    }
}

大部分编程语言都是通过花括号"{"、"}"这类符号来标记块的开始和结束,花括号内部的代码并不需要缩进,缩进只是为了让程序员更容易读,更容易看懂代码的逻辑结构。在C#里,刚才的代码也可以这样写:

// 这段代码只是一个示例,没有缩进的代码难以阅读
double price(string stock) {
string url = 'http://hq.sinajs.cn/list=' + stock;
using(WebRequest f = new WebRequest(url)) {
string hq = f.read().decode('GBK'); 
string []v = hq.split(','); return v[1];
}  }

Indent缩进、Deindent反缩进

而Python把这些花括号也给省了,缩进是一条强制性的语法规则,如果缩进不正确,则代码会报错!

来看看《18零基础学编程018:条件语句》中的那段代码,如果写成这样:

from turtle import * 
for i in range(365) : 
    forward(1.01 ** i)
    left(9)
    if(i%7==0) : 
    stamp()

则会提示:

There is an error (expected an indented block) at line 6, column 9.

indent就是向右缩进的意思,而deindent(或dedent)是向左缩进的意思,向左缩进是我编的名字,我也不知道deindent的正规中文翻译是什么。

在IDLE集成环境中,还有专门的快捷键ctrl + ] 用于缩进,而ctrl + [ 则是相反的操作。

不要使用制表符TAB?

按TAB键也可以产生缩进的效果,这一点在Word排版时也会用到,但在Python中要小心了,不同的文本编辑器对TAB的解释可能不一致,有些默认是8个字符,有些是4个字符,有些则是对齐到8的倍数列上,如果你的代码中混用TAB和空格,则会出现一些奇怪的错误。

现在的许多编辑器中都增加了一项设置,可以自动将TAB保存为多个空格,比如IDLE、Notepad++(注意不是Windows中自带的记事本,多个两个加号,功能强大多了),当你按TAB键时,自动产生的是4个空格。

在这种编辑器中写代码就方便多了,你按一次TAB可以,按四次空格也行,效果一样。像Notepad++中还提供了细细的对齐线等功能,还可以突出显示空格和制表符,让你看得更清楚。

Python编码规范

Python语言本身对于缩进的空格数没有规定,但为了让程序员们互相之间容易沟通,Python社区对代码的规范性提出了许多建议,如果你遵守这些建议,则与全世界的程序员们基本上保持了一致的习惯。网址:https://www.python.org/dev/peps/pep-0008/

关于缩进这一部分,规范中规定:

  • 缩进用4个空格
  • 一条比较长的语句也可以用缩进分成多行,详细的规定请阅读英文原文
  • Python 3中已经禁止TAB和空格混用

悬挂else问题

在其它编程语言中,有可能会遇到这类的悬挂else问题,即末尾的else语句与2个if语句中哪一个配对?有经验的程序员会要求所有的语句都要有花括号。

在Python中的这样一段代码:

if (条件1) :
    if (条件2) :
        fun1();
else :
    fun2();

在C#或JAVA中会写成这样:

if (条件1) {
    if (条件2) {
        fun1();
    }
}
else {
    fun2();
}

Python的缩进规则让代码显得更简洁,根本不会出现悬挂else的问题,你的缩进表明了你的else与哪个if相匹配。

当然Python中的缩进也有一个缺点,如果你从网页上复制python代码,有些网页上的代码排版本来就很乱,如果原始的python代码缩进乱了,则无法重新格式化。

小结:

  • 选用支持将TAB自动转换为4个空格的编辑器或集成开发环境
  • 保持TAB为4个空格的默认编辑器设置
  • 从其它地方粘贴的代码如果出现错误,可以用对齐线辅助检查
  • 遵守Python的编码规范,方便与全世界的其他程序员沟通

--- END ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2017-03-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark生态圈

[Spark SQL] 源码解析之Parser

Parser就是将SQL字符串切分成一个个Token,再根据一定语义规则解析为一棵语法树。我们写的sql语句只是一个字符串而已,首先需要将其通过词法解析和语法解...

812
来自专栏带你撸出一手好代码

JavaScript对象的呼叫转移

声明:此文以通俗易懂的模式讲解JavaScript语言中call、apply运行原理。 非业内人士或未成年人请点左上角按扭及时离开以避免走火入魔。 事实上类似于...

3046
来自专栏java一日一条

优化SQL查询:如何写出高性能SQL语句

执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查...

483
来自专栏郭霖

Android最佳性能实践(三)——高性能编码优化

在前两篇文章当中,我们主要学习了Android内存方面的相关知识,包括如何合理地使用内存,以及当发生内存泄露时如何定位出问题的原因。那么关于内存的知识就讨论到这...

18710
来自专栏程序员八阿哥

王老板Python面试(6):25道Python工程师面试必备知识点!

Python是一种解释型语言。这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译。其他解释型语言还包括PHP和Ruby。

481
来自专栏老司机的技术博客

高质量jQuery代码的十二条经验

1、正确引用jQuery 尽量在body结束前才引入jQuery,而不是在head中。 借助第三方提供的CDN来引入jQuery,同时注意当使用第三方CDN出现...

2784
来自专栏PPV课数据科学社区

MySQL 处理海量数据时的一些优化查询速度方法

在参与实际项目中,当 MySQL 表的数据量达到百万级时,普通的 SQL 查询效率呈直线下降,而且如果 where 中的查询条件较多时,其查询速度无法容忍。想想...

3655
来自专栏高爽的专栏

增量接口的设计及实现

引言 在应用开发过程中,我们总会碰到这样的场景:某系统需要同步我们系统的数据去做一些业务逻辑,当数据量较小的时候,可以全量的提供,但当数据量很大时,全量提供就显...

2280
来自专栏小小挖掘机

这或许是我见过的最简单的正则表达式教程(二)

五一劳动节来啦,小小挖掘机们小编们首先祝大家劳动节快乐! 作为中国放假大学的一员,除了趁着长达8天的五一春假好好休整之外,当然还要忙中偷闲补习一下python的...

2384
来自专栏精讲JAVA

百万数据查询优化技巧三十则

对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 应尽量避免在 where 子句中对字段进行 null ...

1779

扫描关注云+社区