2018-08-12 《Python 算法》以及《用Python解决数据结构和算法》
什么是算法?
在计算机的世界中,算法本质上是我们对某一个问题或则某一类问题的解决方案。也就是说,如果我们想用计算机来解决问题的话,必须将问题的解决思路准确而完整地描述出来,同时计算机 也要能理解这个描述。这就要我们将整个描述转化成一系列清晰的指令,这些指令要能接收满足一定规范的输入,并在有限的时间内产生相应的输出。我们通常将这些指令成为程序,而算法是程序的灵魂!
(一句话,算法是程序的灵魂)
但是程序光有灵魂也是不够的,比如你知道怎么做的思路,但是没有给你工具,没有做怎么能达到目的,在这里,如果用C和C++来进行编程的话,我们对于算法设计的专注力很容易被数据结构这种更为基础的细节所干扰,在过去的相当一段时间里,我们在进行算法设计的时候通常用的是一种更接近于人类语言的“伪代码”。显然用伪代码可以让我们很好的专注于算法的表达,但遗憾的是,他们无法在计算机中执行,所以我们需要一种既能在抽象层面接近于伪代码,又能在计算机上像C那样通用的语言,显然Python就是这样的一种语言!
什么是数据类型?
在计算机中国,所有的饿数据项都用一段二进制表示,为了使这些数字能代表数据,我们就需要有数据类型(data types)。数据类型把这些二进制数据翻译成我们可以理解的、在解决问题中讲得通的内容,这些底层的、预置的数据类型是算法的基石。
早期,我们把对程序的抽象视为一种通过隐藏特定函数的细节让用户可以在更高层次看问题的方法,数据抽象(data abstraction)的思想与之相似。抽象数据类型(abstract data type),不涉及数据,操作如何执行,只是关于如何查看数据和许可操作的逻辑性描述。这意味着我们关注的只是数据代表的含义而不是最终运行的过程。通过提出这种抽象概念,我们实现了对数据的封装(encapsulation)。这种理念就是通过对执行的数据的封装,使之从用户的视野中消失,这就叫作信息隐藏(information hiding)
![](/qrcode.jpg)
如上图展示了抽象数据的概念及运行机制。用户通过界面实现交互,使用被抽象数据指定的操作。抽象数据类型是与用户交互的外壳。执行的内容被隐藏在更深的一层。
抽象数据类型的执行,被称为数据结构数据结构(data structure),它需要我们用一些程序设计和原始数据类型来提供一个关于数据的实际展示。
Python
预置核心数据类型:
我们说过,Python支持面向对象的编程范式。这意味着Python把数据当做问题解决过程的重点。在Python里,和很多其他面向对象的编程语言一样,我们定义’类(class)‘去描述数据的外观和功能。’类‘类似于抽象数据类型,’类‘的用户只能看到数据项的状态和行为。数据想在面向对象的范式里被称为’对象‘。
Python中拥有两个主要的内嵌的有关数值的类,用以记录整数和浮点数,这两个Python中的类被称为int和float。(其中包括各种运算符等)
赋值语句 theSum = 0 创建了一个名为 theSum 的变量,并且使该变量持有对数据对象0的引用,如下图。一般来说,赋值语句的右半部分会经过求值运算,并把对最终结果的引用派给左边的标识符。在我们的例子中,变量及以theSum指向的数据的类型本来是整型,如果数据类型变了,如图二,重新赋值一个Bool型的值True,那么变量类型也改变了。这说明,在Python中,如果赋值的数据类型变了,那么变量的类型也变了
预置集合数据类型:
除了数值和布尔这两个类,Python还拥有一系列的强大的内嵌的数据容器,列表,字符串和元组都是有序容器,结构上大致相似,但是分别拥有一些在应用中需要好好理解的属性,字典和集合使无序的容器。
一个列表是包含零个或多个对Python中数据的引用的有序容器。列表用方括号括起,里面的每一个数据由逗号隔开[1,2,4],列表是异质的,这意味着列表中的数据不必要同一类,并且列表可以像下面展示的那样派给一个变量。
注意:当Python中给一个列表赋值后,这个列表会被返回。那么为了记录下这个列表以备后用,我们应该将它的引用值给一个变量。
因为列表是有序的,所以他支持一系列可以被用在任何Python中的序号运算符。
li = [1,3,4] a = li*3 print(a) li[2] = 89 print(li) print(a) #运算结果[1,3,4,1,3,4,1,3,4] [1,3,89] [1,3,4,1,3,4,1,3,4] #也就是说a被上次引用后,其值不会随着li改变而改变!
列表提供了一系列的用来构建数据结构的方法
字符串:是可以储存零个或多个字母,数字或其他符号的有序容器。我们称字母,数字和其他的符号为字符,字符串的值
用引号与标识符区分。字符串的相关方法略!
字符串和列表的最大区别就是列表可以被修改,而字符串不能,这杯称作可变性,元组和字符串都是不可变类型!
字符串格式化输出: 我们之前了解过print函数是一种输出数据的方式,它可以获取0或则多个参量并将其输出,默认用空格作为分隔符。实际上,我们可以通过设定sep参数来修改分隔符。此外可以使用end参数来改变每行结尾部分,默认是’\n‘
控制结构:
算法中有两个重要的控制结构:迭代和选择 ,迭代包括;while 和f or,而选择包括:if ……else……
列表解析:
在列表中,存在一种替换方法使用迭代和选择结构创建列表,这被称为列表解析。列表解析可以让你创建基于某些处理或选择条件的列表。
例如我们想生成一个小于10的整数的完全平方的列表,我们可以使用for语句
使用列表解析,我们可以一步完成:
在for结构里,变量x取从1到10的整数值。计算x*x的值后,将结果添加到新列表中,同理,新列表中也可以使用选择语句,以便只有某些项目进行运算并添加到新的列表中