Published at 2020-10-21 14:32
Author:zhixy
View:725
作为一种计算机语言,Python的基本语法,包括标识符、保留字、注释、行与缩进等。而所谓Python程序就是由这些基本语法规范的一行行指令。在Python中,由标识符表示的变量构成了其最基本对象。而构成变量的可以是:数字,字符,逻辑值,以及由这些基本数据类型衍生而来的不同数据结构(包括:字符串、列表、元组、字典、集合)。数字用于数学运算,表达定量关系;字符用于表达复杂的语意,或者定性关系;而逻辑值用于逻辑运算,表达严格的推理关系。数据结构的主要功能是便于数据的存储和操作,在不同的应用场景下,选择合适的数据结构可以让编程变得事半功倍。Python针对不同的数据结构,提供了大量内建函数(可理解为一种操作工具)用于对数据结构的操作,从功能上分类,包括对数据的增、删、改和查。所以,抛开Python的基本语法,第一个需要理解的重点是:数据结构是在数据类型的基础上,衍生出的一种相对复杂的数据组织结构;不同的数据结构在形式和数据上都有不同的要求,而且还有不同的内建函数工具与之相适应。
计算机程序就是一个使用某种编程语言编写的,由计算机执行的指令集合。基本语法和数据结构规定了每一条指令确切含义和计算机将要具体执行的动作;而控制结构则规定了指令与指令之间的关系。Python的控制结构包括:顺序结构,循环结构和分支结构。顺序结构是一种最简单但也是最重要的结构,顾名思义它让计算机按照顺序,逐条执行指令,其实现方式就是将指令逐行写入程序文件。循环结构(for和while语句)能够在顺序结构的基础上,重复地执行部分指令。循环结构是计算机程序强大之处的重要体现,因为只有循环结构能用较少的指令来执行大量重复任务。分支结构(if、elif和else语句)则根据条件是否为真,使程序能够在不同的指令间实现跳转。此外,在循环结构中使用的break和continue语句,也可以理解为一种隐含式的分支结构。逻辑上,真正使程序得已实现的是控制结构。配合数据结构的运用,加之经过设计的控制结构(即算法设计),已经能够实现利用计算机来解决多数应用问题,所以理解控制结构是学习Python程序设计的关键。
编程语言中的函数和数学中的函数,在逻辑上表达了同样的思想,即将输入(自变量)加工处理后输出(因变量)。在计算机程序中,函数是对具有明确功能的部分指令的包装。所谓明确功能,例如将两输入变量求和(即求和计算)等,是具有一定抽象意义的,也就是说该功能不因输入值的不同而变化。利用函数实现某项功能,可以在该功能多次出现时,有效的节省代码量。此外,通过函数来包装代码,也将大大提升代码维护效率(修改相应函数,可在所有使用该函数的位置实现功能更新)。因此,函数对于程序而言,是在控制结构的基础上,进一步打破了指令的空间组织形式。因为,函数相对封闭的,所以函数内外定义的变量具有不同的作用域。函数是第一个也是最简单的一个能够在程序内部实现变量作用域分隔概念。Python语言的函数定义重点需要考虑的是输入参数的设置,涉及必需参数、关键字参数、默认参数和不定长参数。函数的定义由def语句(必需)开始,由return语句(非必需)结束。中间的函数体代码就是程序员发挥设计灵感的空间。
一个可执行的Python程序,又可称为模块,是一个包含所有自定义函数和变量的文件,以.py为后缀名。程序可独立执行,也可以被其它程序导入(通过import语句实现)。专门被导入的程序,用模块来理解更贴切,其中最常用的就是Python标准库中为解决各类具体问题而开发的模块,如os、sys、re等。此外,还包括其它第三方开发的,需要独立安装的应用模块,如biopython、pymongo、networkx等。区分某程序是被执行的,还是被导入的,可通过__name__属性的取值来实现,即被执行的时等于\'__main__',否则就是被导入的。模块使Python实现了程序指令的跨文件调用,使程序开发的工程化成为可能。存在逻辑关系的不同模块文件,通过文件夹组织起来,就构成了包。同时,作为一个包,需要有__init__.py(存在包的目录下)来完成包导入时的初始化。包是一种管理 Python 模块命名空间的形式,当通过import导入时(特别是用当from package import *时),实际上是完成了被导入包/模块所对应命名空间与当前命名空间的融合。从控制结构对指令小范围管理,到函数对指令的封装和调用,再到模块/包对指令的跨文件/文件夹调用,Python实现了所有层级的指令管理逻辑。
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤逐步实现,使用的时候依次调用;面向对象是把构成问题的事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。例如为了实现DNA序列的多序列比对,面向过程考虑的是,为实现该目标,整个操作过程可以分成几个中间环节或可独立出来的子操作(通过函数实现),然后如何按照逻辑将这些环节组织起来。而面向对象考虑的则首先是,该目标中都有哪些可以抽象出来的对象,如单个DNA序列就可成为一个的对象;该对象有哪些属性(如序列组成、编码规则等)、有哪些常用的操作(如反转、互补、翻译等);其次在序列对象的基础上再考虑序列集合是否可以再成为对象,而该对象的一种操作就是实现序列的比对。在Python中,对象通过类class来实现,在类中可以定义属性和方法。一个子类(derived class)继承父类(base class)的属性和方法,也可重写父类的方法。类在具体应用时,需要被实例化而成为一个对象。总之,面向对象是把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。