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

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

【AngularJS】—— 12 独立作用域

前面通过视频学习了解了指令的概念,这里学习一下指令中的作用域的相关内容。 通过独立作用域的不同绑定,可以实现更具适应性的自定义标签。借由不同的绑定规则绑定属...

1938
来自专栏Keegan小钢

Android技术积累:开发规范

上个月发布了Android项目重构的三篇系列文章,其中,界面篇中提到了在项目中保持规范性的重要性,也有简单举了几个例子。这篇文章则将其延伸,提供更完整的开发规范...

1082
来自专栏飞雪无情的博客

Go语言实战笔记(二十五)| Go Struct Tag

在上一篇介绍Go反射的时候,提到了如何通过反射获取Struct的Tag,这一篇文章主要就是介绍这个的使用和原理,在介绍之前我们先看一下JSON字符串和Struc...

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

2833 奇怪的梦境 未AC

2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Aide...

2715
来自专栏desperate633

我的javascript学习之路_01之js基础1JavaScript的简介JavaScript的使用JavaScript输出javascript语句JavaScript注释JavaScript变量J

近期开始接触学习extjs框架。该框架是基于JavaScript的。为了更好地理解学习extjs,必然需要先对JavaScript有一个较好的理解。

672
来自专栏柠檬先生

VUE 入门基础(3)

三,模板语法   Vue将模板编译成虚拟DOM渲染函数,结合响应系统,在应用状态改变时,vue能够智能地计算出重新渲染组件的最小代价并DOM操作上。   插值,...

2256
来自专栏北京马哥教育

Python爬虫库-BeautifulSoup的使用

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标...

830
来自专栏calmound

cocos2d-x 3.0 Node与Node层级结构

节点解释: 节点是场景图的基本元素。场景图的基本元素必须是节点对象或者是节点对象的子类。 其中主要可以看到Layer、MenuItem、Scene、Sprite...

2795
来自专栏冰霜之地

深入解析 Go 中 Slice 底层实现

切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合。切片的设计想法是由动态数组概念而来,为了开发者可以更加方便的使一个数据结构可以自动增加和...

1353
来自专栏我和PYTHON有个约会

爬虫0040:数据筛选爬虫处理之结构化数据操作

爬虫程序,主要是运行在网络中进行数据采集的一种计算机程序,正常的一个爬虫采集数据的过程大致如下:

1531

扫码关注云+社区