python的火爆程度不言自明,对于很多想尝试编程的小伙伴也是一个不错的入门选择,本系列内容是对python的基础语法、编程的基本思想以及在工作中能提高生产力的模块做基础的介绍,希望对你能有所帮助。
文章中涉及到的工具安装包、代码、以及作者的开源项目,都会在对应的内容里面分享给大家。
(二)计算机基本知识科普
这节想对计算机的一些基本知识做一点点简单的普及,如果你是大佬,烦请跳过,如果你能看下去,也欢迎指出文章中的错误;如果你是小白,了解这些知识也许会对编程或者计算机的入门有帮助。
计算机语言
我们所编写的代码是具有一定的可读性的,是能够为人类所阅读的,称之为高级语言;但计算机只能够识别0和1的二进制编码,所以,在我们所编写的高级语言到机器能识别的二进制语言中间存在着转换的机制,称为编译。
对于不同类型的高级语言,有不同的编译方式。例如:C, C++, Java等语言,是通过编译器生成中间文件再到能被计算机识别的可执行文件,这类语言称为编译型语言;诸如Python,PHP,JavaScrpit等,逐行的编译和执行,二者同步进行,称为解释型语言。
编译型语言的执行效率是高于解释型语言的,这是编译型语言最大的优势,甚至不同的编译型语言之间也存在着明显的差别,用C/C++编写的程序运行速度要比用Java编写的相同程序快30%-70%;其次,编译型程序比解释型程序消耗的内存更少;再次,对于编译型语言,一次编译可多次运行,甚至可以跨平台运行,具有更好的移植性。
但反过来,对于编码来说,编译型语言的难度是大于解释型语言的,毕竟解释型语言是顺序执行的,符合自然语言的特点;同时,解释型语言可以保证高度的安全性,这也使解释型语言成为适合互联网和Web应用的理想语言的重要因素之一。
程序
我们所说的程序,按照普遍的理解,应该由三部分组成,即数据,数据结构和算法。程序是为了完成某种特定的功能或任务而被创造的,将数据以一定的数据结构进行组织并且通过算法得到相应的输出结果,那么这个特定的程序也就完成了。
第一部分是数据。数据可以是什么呢?可以是一个常量,如数字、一个单词、一个中文汉字甚至是一段话;相对的,变量也可以是数字、单词、汉字、句子,但与常量的区别在于可变,什么是可变呢?我们可以这样理解,不论是数字、单词、汉字、句子,在程序中都得有一个盒子装载它们,每一个盒子都有自己的名称,对于常量来说,一旦装载了一个内容,那么这个内容就不能改变了;对于变量来说,这个名称的盒子所装的内容可以改变。我们在编程的时候,是通过盒子的名字来使用盒子,进而操作盒子里面的内容,对于常量盒子,每次使用时的内容是不变的;对于变量盒子,盒子里的内容可以改变,每次使用这个盒子时的内容也可能随着程序的进展发生变化。所以,这里也就明确了量与数据的关系。
既然计算机只能识别二进制的0和1,那么数据到二进制之间自然就存在着某些转换规则,这就是编码。常见的编码方式有ASCII、UTF-8、GBK等。不同的编码形式能表示的字符范围是不同的,如ASCII就只能表示英文字符和常见符号,而UTF-8就可以表示英文、符号以及中文,我们在后续的编码中,通常也会使用UTF-8编码,也就意味着,程序在识别我们程序中的中文时,是基于UTF-8编码规则的;所以,一旦出现了乱码(即计算机识别或输出的中文不是我看得懂的中文),很可能就是编码不统一而导致的,A的钥匙不能打开B的锁,如是已。
第二部分是数据结构。数据结构是逻辑上组织数据的方式,即人为规定了一种规则,赋予了这些数据一种特定的结构,但并不等同于在计算机内存中也具有这样的规则,在绝大多数情况下,数据结构仅仅存在于逻辑中,在实际的存储中,数据都是散落在计算机内存各处的。结合之前的比喻,数据结构可以理解为组织这些盒子的方式。在程序中,有许多的数据,也就对应了有许多的盒子,不论是常量还是变量,当我们创建或者声明这些常/变量时,他们在逻辑上是没有关联的,只有把它们组织到一个特定的结构中时,它们才拥有了逻辑上的关系,这种关系可能是前后关系(对应链表数据结构)、父子关系(对应树状数据结构)、出入关系(对应图状数据结构)。常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示:
1、数组(或称线性表)
数组是可以在内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。
array_1 = [0, 1, 2, 3]
print(array_1[0]) # 此处输出数组的第一元素,即数字0
1)优点:
(1)按照索引查询元素速度快;
(2)按照索引遍历数组方便;
2)缺点:
(1)数组的大小固定后就无法扩容了;
(2)数组只能存储一种类型的数据;
(3)添加,删除的操作慢,因为要移动其他的元素。
3)适用场景:
频繁查询,对存储空间要求不大,很少增加和删除的情况。
2、栈
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。栈的特点是:后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
栈最形象的比喻就是手枪弹夹,补充子弹就是入栈,打出子弹就是出栈。所以很多代码里面把入栈方法命名为pull,出栈方法命名为pop,由此对应。
栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。
3、队列
队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队,示例图如下:
4、链表
链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
1)优点:
(1)链表是很常用的一种数据结构,不需要初始化长度,可以任意加减元素;
(2)添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快。
2)缺点:
(1)因为含有大量的指针域,占用空间较大;
(2)查找元素需要遍历链表来查找,非常耗时。
3)适用场景:
数据量较小,需要频繁增加,删除操作的场景。
5、树
树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;
没有父节点的节点称为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不相交的子树;
6、散列表(Hash表)
是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。
7、堆
堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:堆中某个节点的值总是不大于或不小于其父节点的值。
堆总是一棵完全二叉树
堆的概念对于初学者来说比较复杂,这里就不展开了,在现阶段也不需要深入的了解。
8、图
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
按照顶点指向的方向可分为无向图和有向图:
图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构,这里同样不做展开,待后续有一定基础后可再深入的了解。
第三部分是算法。算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
常见的算法包括排序算法、查找算法、图论算法、动态规划等;当然,还有更深入的,如推荐算法、机器学习算法等。从本质上来说,算法是一类数学问题的解法,与计算机结合后,通过代码来实现特定的数学模型进而解决特定的问题。在我们日常写代码时,可以使用主流的、成熟的算法,无需自我创造,通常情况下也很难创造出比现有算法更高效的方法,除非你的数学功底很不错,否则还是老老实实的借鉴别人的方法吧。
【python入门系列文章回顾】杨地瓜:【Python基础(一)】环境搭建与工具的安装zhuanlan.zhihu.com
【信息系统项目管理师考试分享】杨地瓜:【项目管理(十一)】软考-信息系统项目管理师-论文总结(II)zhuanlan.zhihu.com杨地瓜:【项目管理(十)】软考-信息系统项目管理师-论文总结(I)zhuanlan.zhihu.com杨地瓜:【项目管理(九)】软考-信息系统项目管理师-案例分析总结(IV)zhuanlan.zhihu.com杨地瓜:【项目管理(八)】软考-信息系统项目管理师-案例分析总结(III)zhuanlan.zhihu.com杨地瓜:【项目管理(七)】软考-信息系统项目管理师-案例分析总结(II)zhuanlan.zhihu.com杨地瓜:【项目管理(六)】软考-信息系统项目管理师-案例分析总结(I)zhuanlan.zhihu.com杨地瓜:【项目管理(五)】软考-信息系统项目管理师-重点考察内容解析zhuanlan.zhihu.com杨地瓜:【项目管理(四)】软考-信息系统项目管理师-知识梳理篇zhuanlan.zhihu.com