• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Python基础语法与编程准则

Python编程 彭东稳 9年前 (2015-07-22) 29877次浏览 已收录 0个评论

一、Python运行环境

  • 交互式模式

在 Python 的交互式命令行写程序的好处就是直接可以得到结果,坏处是没法保存,下次还想运行的时候还得再敲一遍,代码如下:

  • 文本模式

使用文本编辑器来写代码,写完保存为一个后缀为 .py 的文件,那么这个程序就可以反复运行了,代码如下:

如果有执行权限,可以直接运行。如果没有需要使用python解析器运行。

PS:windows 下绝对不能用 Word 和 Windows 自带的记事本。Word 保存的不是纯文本文件,而记事本会自作聪明地在文件开始的地方加上几个特殊字符(UTF-8 BOM),结果会导致程序运行出现莫名其妙的错误。

二、Python标识符

所谓的标识符就是对变量、常量、函数、类等对象起的名字。首先必须说明的是,Python 语言在任何场景都严格区分大小写!

在 Python 里,标识符有字母、数字、下划线组成。在 Python 中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。

Python 中的标识符以下划线开头的标识符是有特殊意义的。以单下划线开头 “_foo” 代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入;以双下划线开头的 “__foo” 代表类的私有成员;以双下划线开头和结尾的 “__foo__” 代表 Python 里特殊方法专用的标识,如 __init__()代表类的构造函数。

还有一些非强制,但大家默认的代码规范,比如:

A. 变量名用小写、常量名用大写。

B. 函数和方法名用小写加下划线。

C. 类名用大写驼峰。

D. 模块和包的名字用小写。

E. 变量的命名不要用关键字和内置函数的名字。

三、Python注释信息

我们写的程序里,不光有代码,还要有很多注释。注释有说明性质的、帮助性质的,它们在代码执行过程中相当于不存在,透明的,不参与任何工作。但在代码维护、解释、测试等等方面,发挥着不可或缺的重要作用。每一位程序员都要尽量写出高质量的注释。具体的注释专题,有大量的高水平文章和论述,请自行搜索并学习。这里,我们只讨论 Python 中注释的方法。

Python 中单行注释采用#开头,可以从一行的任何地方开始。

Python 中多行注释,其实 Python 没有真正意义上的多行注释(块注释)语法,你只能在每行的开头打上 # 号,然后假装自己是个多行注释。

Python 中的文档注释,在某些特定的位置,用三引号包括起来的部分,也被当做注释。但是,这种注释有专门的作用,用于为__doc__提供文档内容,这些内容可以通过现成的工具,自动收集起来,形成帮助文档。比如,函数和类的说明文档。

然后就可以使用fun.__doc__ 打印帮助文档说明了。

四、Python代码块

学习 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号 {} 来控制类,函数以及其他逻辑判断。Python 最具特色的就是用缩进来写模块。缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行,否则会造成语法错误。

PEP8(Python 官方的代码规范):建议使用四个空格作为缩进!在文本编辑器中,需要设置把 Tab 自动转换为 4 个空格,确保不混用 Tab 和空格。在 Pycharm 中:tab 键被自动转换成 4 个空格的缩进。Linux 环境中,如 vim 编辑器,请一定使用空格,不要使用 tab 键,tab 不等于空格;或者通过配置把 tab 转换为空格!

以下代码由于缩进不统一将会执行错误:

执行以上代码,会出现如下错误提醒:

IndentationError: unexpected indent 错误是 Python 编译器是在告诉你“Hi,老兄,你的文件里格式不对了,可能是 tab 和空格没对齐的问题”,所有 Python 对格式要求非常严格。如果是 IndentationError: unindent does not match any outer indentation level 错误表明,你使用的缩进方式不一致,有的是 tab 键缩进,有的是空格缩进,改为一致即可。

因此,在 Python 的代码块中必须使用相同数目的行首缩进空格数。建议你在每个缩进层次使用单个制表符或两个空格或四个空格 , 切记不能混用。

五、Python语句

Python 一行通常就是一条语句,一条语句通常也不会超过一行。其实,从语法层面,Python 并没有完全禁止在一行中使用多条语句,也可以使用分号实现多条语句在一行,比如:

上面这一行其实包含2条语句,用分号分隔了,但是强烈建议不要这么做,这样会导致代码阅读困难、维护耗时,容易出错,老老实实地用两行来表示。

前面是多条语句在一行,但如果一条语句实在太长,也是可以占用多行的,可以使用反斜杠(\)来实现多行语句:

在 [], {}, 或 () 中的多行语句,可以不需要使用反斜杠(\),直接回车,接着写。例如:

PEP8建议:每一行的字符不超过79个。

六、pass语句

pass 语句是占位语句,它什么都不做,只是为了保证语法的正确性而写。以下场景中,可以使用 pass 语句:

  • 当你不知道后面的代码怎么写的时候
  • 当你不需要写代码细节的时候
  • 当语法必须,又没有实际内容可写的时候
  • 其它的一些你觉得需要的场景

举个例子:

当不知道这个函数该怎么写的时候就可以用 pass,如果函数体内什么都没有又会报错。一般在类继承时用的较多。

七、空白字符与空白行

空白行、空白字符与代码缩进不同,并不是 Python 语法的一部分。空行或者空白字符会被当做空气一样的忽略。连续的空行或空白字符和单独的空白行几字符没有区别。书写时不插入空白行或空白字符,Python 解释器运行也不会出错。但是空白的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。

PEP8 对于空行留白有专门的建议。

函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。

变量赋值的时候等号左右各给一个空白。逗号后面跟一个空白。

看下面的代码,作为标准的代码规范,在规定的地方留有规定的空白行和空白字符。

八、字符串的表现形式

字符串,表示一段连续的字符,可以是有意义的单词、词组、语句,也可是无意义的字符组合。不在于它内部是由什么组成的,而在于它是否被引号引起来的。

比如, abc可能是个变量,但是"abc"肯定是个字符串!(强调,代码的世界没有中文标点,所有的符号类型都是英文半角!千万不要搞错了!)

在 Python 中可以使用引号( ‘ )、双引号( ” )、三引号( ”’ 或 “”” ) 来表示字符串,引号的开始与结束必须的相同类型的。其中三引号可以由多行组成,编写多行文本的快捷语法,常用于文档字符串,在文件的特定地点,被当做注释。

Python 中单引号和双引号的作用完全相同。但是注意:在其它语言中双引号引起来的才是字符串,单引号引起来的是字符!例如 C,例如 Json!所以很多同学在做 Json 格式转换时,经常发生使用单引号,导致转换失败的问题。

九、转义与非转义字符

编程语言里,有很多特殊字符,它们起着各种各样的作用。有些特殊字符没有办法用普通字符表示,需要进行转义。Python 用反斜杠(\)转义字符。如下表:

转义字符 描述
\(在行尾时) 续行符
\\ 反斜杠符号
\' 单引号
\" 双引号
\a 响铃
\b 退格(Backspace)
\e 转义
\000
\n 换行
\v 纵向制表符
\t 横向制表符
\r 回车
\f 换页
\oyy 八进制数,yy代表的字符,例如:\o12代表换行
\xyy 十六进制数,yy代表的字符,例如:\x0a代表换行
\033 颜色控制

如:

上面说了 Python 中转义是如何使用,当然也就有对应的非转义使用方式了。

如:

十、Python程序基本组成结构

写了一个基本的程序组成结构,也可以称之为一个模块。

第1行,用来指定这个可执行程序默认解释器。

第2行,用来指定程序的编码。

第4行,模块文档,是用来简要介绍模块的功能及全局变量的含义,可选。

第6-7行,导入模块,import 关键字是用来导入已提供的内置模块或已经安装的第三方模块,可选。

第9行,变量定义,这里定义的变量是全局变量,此模块内都可以只读使用,可选。

第11-15行,定义类,可选。

第17-23行,定义方法,可选。

第25行,程序入口,Python 本身并没有规定这么写,这只是一种编码习惯。

if __name__ == '__main__'相当于 Python 模拟的程序入口,由于模块之间相互引用,不同模块可能都有这样的定义,而程序入口只能由一个。到底哪个入口程序被选中,这取决于__name__的值。__name__是内置变量,用于表示当前模块的名字。所以,if __name__ == '__main__'简单理解就是:如果本模块是被直接运行的,则代码块被运行,如果本模块是被导入到其它模块中去,则处于__name__中的代码不被运行。

这么做的原因是有时候你需要你写的模块既可以直接执行,还可以被当做模块导入到其他模块中去使用。通过检查是不是主函数,可以让你的代码只在它作为主程序运行时执行,而当其他人调用你的模块中的函数的时候不必执行。

给一个实例来说明程序入口的作用,创建 a.py 和 b.py 两个程序,代码如下:

我们在 b.py 中引入了 a 模块中的变量 v。现在我们执行 b.py 这个程序:

从结果可以看出,a.py 和 b.py 各自执行了一次。而实际上,由于我们没有直接运行 a.py 程序,所以并不希望执行 a.py 中的 main 方法。

此时,if __name__ == '__main__'便排上用场了,我们将 a.py 稍作修改,加一个程序入口判断,如下:

此时,就可以满足我们的需求了,再次执行 b.py 程序,就不会执行 a.py 中的 main 方法了,同时也并不会影响不能直接执行 a.py。

当 Python 解析器读取一个源文件时,它会执行所有的代码。在执行代码前,会定义一些特殊的变量。例如,如果解析器运行的模块(源文件)作为主程序,它将会把__name__变量设置成'__main__',如果只是引入其他的模块,__name__变量将会设置成模块的名字。

当设置完特殊变量,它就会执行import语句并且加载这些模块,当遇到def代码段的时候,它就会创建一个函数对象并创建函数名称变量指向函数对象。接下来会读取if语句并检查__name__是不是等于'__main__',如果是的话他就会执行这个代码段。

十一、Python编程风格

1)注释:既不能缺少注释、亦要避免过度注释。

2)文档:Python允许通过于__doc__动态获得文档字符串。

3)缩进:统一缩进4个字串。

4)标示符名称:见名知义。

5)每行长度:最多80个字符

6)语句:一行一个避免使用;号。

Python风格指南:http://www.elias.cn/Python/PythonStyleGuide

Python PEP8:https://www.python.org/dev/peps/pep-0008

十二、Python保留字符

下面的列表显示了在Python中的保留字。这些保留字不能用作常数或变数,或任何其他标识符名称。所有Python的关键字只包含小写字母。

and exec not
assert finally or
break for pass
class from print
continue global raise
def if return
del import try
elif in while
else is with
except lambda yield

<学习网站>

Python 3中文翻译:http://python.usyiyi.cn/translate/python_352/index.html

Python Cookbook 3中文版本:https://github.com/yidao620c/python3-cookbook


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!