Skip to content

Latest commit

 

History

History
136 lines (110 loc) · 11.4 KB

start.md

File metadata and controls

136 lines (110 loc) · 11.4 KB

目标

  • 了解 程序设计问题解决 的基本概念;
  • 理解什么是“抽象”以及抽象在问题解决过程中的作用;
  • 理解“抽象数据类型”的概念以及在实际操作中学会运用;
  • 学习Python程序设计语言。
  • 摘抄自 其他文件

start

  • 计算机科学本质上是利用计算机来解决问题。
  • 大型问题的繁杂,加上其解决方案与之相当的复杂性掩盖了解决问题的过程中涉及到的基本思路。
  • 回顾计算机科学以及算法与数据结构的基本框架,并特别强调我们学习这些内容的原因以及理解这些内容如何帮助我们更好地解决问题。
  • 了解python语言。

next

  • 计算机仅仅是工具而已。
  • 计算机科学是对问题本身、问题的解决、以及问题求解过程中得出的解决方案的研究。面对一个特定的问题,计算机科学家的目标是得出一个算法(algorithm),写出一组解决该问题可能出现的任何情况的步步为营的指令。算法通过有限过程解决问题。算法是解决方案。
  • 有一些问题是没有解决方案的。计算机科学研究的是问题的解决方案以及没有解决方案的问题。
  • 描述问题及其解决方案时,“可计算”(computable)这个词是很常见的。当存在解决某个问题的算法时,我们说该问题是可计算的。计算机科学研究的是问题是否可计算,算法是否存在。我们认为问题的解决方案是独立于机器本身的。
  • 抽象使我们能以一种区分所谓的逻辑对象物质对象的方式来看待问题及其解决方案。
  • 作为一个司机,一个汽车使用者,为了使汽车达到预期目的,你和汽车之间有固定的交互方式。你坐进车里,插入钥匙,发动汽车,换挡,刹车,加速,行驶。用抽象的角度来看,我们可以说,你看到的是汽车逻辑性的一面。你使用的是汽车设计者提供的将你从一个位置转移到另一个位置的功能。这些功能有时也被称为界面(interface)。
  • 另一方面,汽车修理工有非常不同的观点。他不仅知道如何驾驶汽车,而且知道运行我们认为理所当然的功能的所有必要细节。他需要了解引擎如何工作,如何传递挡位变化,如何控制温度等等。这被认为是物质的角度,发生在引擎盖下的细节。
  • 使用计算机的时候也是一样。大多数人用计算机写文档,收发邮件,上网等,但他们对于这些程序具体如何运行的一无所知。他们从逻辑上或是用户的角度看待计算机。计算机科学家、程序员、技术员以及系统管理员又持有一种对于计算机截然不同的看法。
  • 他们必须知道操作系统具体是如何工作的,网络协议是如何配置的以及如何写各种代码来控制这些功能。他们必须能够控制那些用户认为是理所应当的底层的详细内容。
  • 这些抽象化内容的用户,有时也叫做客户,不需要知道程序的详细内容,他们只需要知道界面是如何工作的就可以了。界面就是我们作为用户与在底层的复杂的算法实现过程交流的途径。
  • python的math模块,过程抽象(procedural abstraction),我们知道有人实现了这个问题的解决方式,我们只需要知道怎么用就好了。这有时被叫做过程的“黑箱”观点。我们只简单的描述接口信息(即函数名),需要提供什么(参数)以及返回值是什么。而函数的实现的细节就被隐藏起来了。

程序设计

  • 将算法编码为计算机可执行的表示法或编程语言的过程。
  • 计算机科学不是研究程序设计的,但程序设计是计算机科学家工作的重要部分。编程通常是我们为自己的解决方案创建一个表达的方式。因此,这种语言表达方式以及创建它的过程成为了这门学科的基本组成部分。
  • 算法描述的是依据代表问题实体的数据和达到预期结果的一系列步骤的问题解决方案。程序设计语言必须提供一种计数性的方式来表达这个过程和这些数据。为此,程序设计语言提供了控制结构和数据类型。
  • 控制结构使得算法的步骤能被简洁而明确地表达。算法至少要求是能够顺序处理、选择决策和迭代的结构。一种语言只要能够提供这几种基本语句,就可以被用做算法的表达。
  • 计算机中,所有数据项都用一段二进制数字表示。为了使这些数字能代表数据,我们需要有数据类型。数据类型把这些二进制数据翻译成我们可以理解的、在解决问题中讲得通的内容。这些底层的、预置的数据类型(有时也叫做原始数据类型)是算法发展的基石。
  • 我们经常遇到的困难是实际上问题和他们的解决方案都很复杂。这些简单的,由程序设计语言提供的结构和数据类型尽管是可以表达复杂解决方案的,但却不利于我们思考解决方法的这个过程。我们需要一些办法来控制复杂程度并帮助我们创建解决方案。

学习数据结构和抽象数据类型

  • 为了管理问题的复杂度和问题处理的进程,计算机科学家使用抽象概念使他们的关注点能够集中在总体框架上而不会在细节问题上纠缠。通过建立问题域的模型,我们可以更好更有效地处理问题。这些模型让我们能够针对问题本身,用一种更一致的方式,去描述我们的算法处理的数据。
  • 抽象数据类型(abstract data type)(ADT),不涉及数据、操作如何被执行,只是关于如何查看数据和许可操作的逻辑性描述。这意味着我们关注的只是数据代表的含义而不是最终运行的过程。
  • 通过提出这种抽象概念,我们实现了对数据的封装(encapsulation)。这种理念就是通过对执行的数据的封装,使之从用户视野中消失。这就叫做信息隐藏。

为何学习算法?

  • 计算机科学家们从经验中学习。接触不同的解决问题的方法并观察不同的算法设计,帮助我们应对接下来的挑战。通过研究大量不同的算法,我们可以发展出模式识别机制,当以后相似的问题出现时,便能更好地解决它。
  • 算法比较,更有效,更快或占用内存更少。基于算法本身的特性比较解决方案,而不是基于程序或电脑执行算法的特点去比较。
  • 识别和选择算法常会带来取舍问题。除了解决问题的能力,还要掌握方案评估的技能。最后,一个问题通常有很多解决方法。找到一个方案后思考它是否是一个好方案将是我们周而复始的任我。

PYTHON

从数据开始

  • Python把数据当作问题解决过程的重点。定义“类(class)”去描述数据的外观(状态)和功能(行为)。“类”类似于抽象数据类型,“类”的用户只能看到数据项的状态和行为。数据项在面向对象的范式里被称为对象。对象是类的一个实例。
  • 预置核心数据类型,int和float。bool类。
  • 标识符就是程序语言中被用来表示名称的符号。变量会持有一个对数据的引用,而并不是数据本身。
  • 预置集合数据类型
    • 列表,字符串和元组都是有序容器,并且在结构上大致相似。字典和集合都是无序容器。
  • 列表
    • 索引 [],连接+,重复*,in,长度len,切片 [:]
    • 重复 运算的结果是对序列中数据的引用的重复。
    • 基本操作
      • append(item) 末尾追加一个新项
      • insert(index,item) 某个位置插入一项
      • pop() 移除并返回列表最后一项
      • pop(i) 移除并返回列表的第 i 项
      • sort() 列表排序
      • reverse() 反转列表
      • del alist[index] 删除在该位置上的元素
      • index(item) 返回列表中第一个等于item的索引
      • count(item) 返回列表中有多少项的值等于 item
      • remove(item) 删除列表中第一个值等于item的项
  • range(start,end,step) 整数序列。
  • 字符串 可以储存零个或多个字母,数字,或其他符号的有序容器。我们称字母,数字和其他符号为字符。字符串的值用引号与标识符区分。字符串有自己的一系列方法。
  • 元组
  • 集合,无序,不重复。包含,交集,并集。。。
  • 字典 键值对形式。
    • keys()返回所有key,列表形式
    • values() 返回所有值value,列表形式
    • items() 所有键值列表,元组形式。
    • get(key,alt) 返回对应值,否则返回alt.
  • 输入 input("提示信息:")
  • 格式化输出
    • print("Hello","World",sep="***")
    • print("Hello","World",end="***")
    • 格式化操作符 %
    • print("%s is %d years old." % (name,age))
    • d,i整型;u无符号整型;f浮点数;e浮点型,E;c单字符;s字符串;%输入一个%。
    • %-20d 变量占据20个字符宽度,左对齐
    • %+20d 右对齐
    • %020d 20个字符宽度,前置"0"
    • %20.2f 20个字符宽度,保留两个小数
    • %(name)d 从字典取key为name的值。

控制结构

  • while循环语句。迭代结构。
  • for 只要容器是序列容器,则可以for遍历所有元素。
  • 选择语句。if elif else.

列表解析

  • 使用迭代和选择结构创建列表。
  • 创建小于10的整数的完全平方的列表。
  • sqlist = [x*x for x in range(1,11)]
  • 任何支持迭代运算的序列都可以在列表解析中被用来构造一个新的列表。

异常处理

  • try except

定义函数

  • def funcname():...

定义类,面向对象编程

  • 面向对象编程语言一个最重要的特征是允许编程者(解决问题的人)来创造一个可以用来解决问题的数据模型的新的类。
  • 运用抽象的数据类型,来提供一个关于某种数据项目是什么样子(它的阐述)和它能做什么(它的方法)逻辑描述。通过建立类来实现一种抽象数据类型,一个编程者可以从中获得抽象过程的好处同时也提供必须的细节来将这些抽象实际运用到一个程序中。无论何时我们想实施一种抽象数据类型,我们将依靠新的类来做它。
  • class className():...
  • 继承。最后一节我们将要介绍面对对象编程的另一个重要方面。继承是一个类联系另一个类的能力,就好像人与人之间能够相互联系,孩子们从父母继承特征。Python 子类能够继承父类的数据和行为特征,类似于孩子们继承父母的特征。这些类通常称为子类和父类。
  • 通过这种分层方式来组织类,面对对象的编程语言允许在编写代码之前进行扩展,以满足新情景的需要。此外,用这种分层的方式来组织数据,我们可以更好地了解存在的关系以及更有效地构建抽象表示。

小结

  • 计算机科学是研究问题解决的学科;
  • 计算机科学以抽象为工具来表现过程与数据;
  • 抽象数据类型允许编程者通过隐藏数据的细节来管理问题域的复杂度;
  • Python 是一门强大的,而同时又易于使用的面向对象的程序设计语言;
  • 列表,元组和字符串都是 Python 内置的有序集合;
  • 字典和集合是数据的无序集合;
  • 类允许编程者执行抽象数据类型;
  • 编程者既可以重载既有方法,也可以编写新的方法;
  • 类可以被组织为阶层架构;
  • 一个类的构造器在继续自己的数据和行为前,总要调用它父类的构造器。