零基础学编程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 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

10个应该早点知道的Python技巧

我的这一生都在编程,但是我没有成为一名程序员。最初,我的大部分工作都是用Visual Basic来完成的,还包括一些其它语言工具,比如R语言,C语言、JavaS...

2139
来自专栏web前端教室

[先行者周末课程] 日历组件的开发思路讲解&&日历组件在实际工作中的使用方式

各位同学们大家好,今天又到了周日,视频课程的时候。上次咱们讲的是日历组件。 简短的回顾一下上周的内容,免得同学们一时断篇,想不起来身在何方。日历这种东西,初学者...

18410
来自专栏包子铺里聊IT

[mitbbs面经][Google] k largest elements

mitbbs google 最新算法题讲解,sliding window 中查找top K元素。 发题人id:zerocoolcode 发题时间: 3/25/2...

2934
来自专栏C语言及其他语言

[每日一题]杨辉三角(1231)

题目描述 还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 ...

3177
来自专栏C语言及其他语言

[每日一题]台球碰撞

今天这题可大有来头了,湖南省第六届大学生计算机程序设计竞赛题目,比较经典也比较有名 题目描述 在平面直角坐标系下,台球桌是一个左下角在(0,0),右上...

3406
来自专栏算法与数据结构

利用代码计算原码,反码和补码

913
来自专栏AI科技大本营的专栏

送书 | Python编程:从入门到实践

本文摘自《Python编程:从入门到实践》一书,本书是Amazon编程入门类榜首图书,是一本全面的Python编程从入门到实践教程,带领读者快速掌握编程基础知识...

47010
来自专栏软件测试经验与教训

Python学习笔记(15)-文件替换

3399
来自专栏灯塔大数据

技术 | Python从零开始系列连载(五)

导读 为了解答大家初学Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载 上一期学习了Python的基本运算和表达式,相信大家...

32811
来自专栏算法与数据结构

利用代码计算原码,反码和补码

最近复习到数字逻辑的时候,看到的这一章节,想去上网找个计算器转换下,结果没有...

692

扫码关注云+社区