[关闭]
@pluto-the-lost 2020-10-16T00:10:55.000000Z 字数 8126 阅读 46

PyFrom0 - 0.简介和前置课程

从零开始的Python


这篇文章包括关于Python的基本信息,以及为了不同深度地理解Python所需要的前置知识,其中有一些会比Python本身难得多。具体学习哪些内容可以视自己的需求取舍。

1. Python 简介

1.1 什么是Python

Python是一种计算机语言,创始人是荷兰的 Guido van Rossum。但是计算机语言的创始人不是很重要,Python成为最流行的编程语言(之一)的主要原因是它的简洁易读性、相对比较快的速度和非常丰富的代码库,这些主要是开源社区贡献的。

Python官网
Anaconda
Github

1.2 Python是一门解释性语言

计算机语言可以有几种分类方法,最粗的一种分法是以人能看得懂/机器能看得懂作为标准,人能看得懂的叫高级语言,机器才能看懂的叫低级语言。我们学的所有语言,包括C, C++, Java, Perl, Matlab, R, Python,几乎都是高级语言,但是机器是看不懂这些东西的。

cpu执行指令是通过很多电容器的充电/放电实现的(计算机组成原理),本质上是一堆0和1的运算。这意味着无论人们在键盘上敲出什么语言,最后都要变成0/1字符串提交给cpu。这个0/1字符串叫做“机器语言”,在它之上人们还稍微进行了一点点封装,把最基本的加法/赋值/声明变量等操作符号化了,叫做“汇编语言”。汇编语言是和机器语言一一对应的,所以二者可以认为是同一种语言的不同写法。
1.1 低级语言和高级语言

把高级语言转换成低级语言的过程叫做“翻译”,翻译分为两种:编译解释。一般来说一门语言只能用其中一种翻译方法,所以用编译来翻译的就叫编译性语言,用解释来翻译的就叫解释性语言。
编译和解释语言

编译和解释的区别,就类似全文翻译和同声传译的区别。编译器是先拿到整个程序的所有代码,把它整体地转换成二进制文件,再把二进制文件提交给cpu运行。而解释器是不需要看到所有代码,看到一句就翻译一句,看到一段就翻译一段,翻译出来的机器语言直接提交给cpu运行,也不会保存二进制文件。
编译和解释的区别

这个区别导致它们各自有一些优点:

编译的优点:

解释的优点:

编译性语言和解释性语言的运行效率相差非常大,在一些多层循环的任务里(比如矩阵计算),效率差一万倍都不夸张。不过现实中的任务大部分对效率的要求其实也不高,所以现在的互联网开发和科学计算是以解释性为主流,碰到大运算量任务时嵌入一个C++的子程序,算好了直接把结果返回出来。解释性语言学习和开发难度低,毕竟人力很多时候还是比算力值钱的。

1.3 下载Python解释器和开发环境

Python解释器是把Python代码翻译成机器语言的软件,下载Python解释器可以通过Python官网,可以下载到最新的Python版本,也可以下载之前的版本(有些旧版本代码和新解释器是不兼容的,尤其Python2.x和Python3.x是基本完全不兼容的)。Windows系统下,Python.exe下载回来安装成功后,打开命令提示符输入“python”就能看到当前python版本了。【但是不建议这样下载Python,往后看完这小节再决定】

开发环境(IDE, Integrated Development Environment)是编写、调试和运行Python代码的软件。其实代码都是文本,用记事本或者文本文档就能编辑,但是好的IDE可以实现代码高亮、自动缩进、多平台自动同步、代码自动补全/自动纠错、实时运行代码并观察变量情况等一大堆很有用的功能。常用的IDE有这些:

应该说工业上用得最多的IDE是Visual Studio Code,这个平台支持几乎所有的编程语言,也像chrome一样有很多插件。不过对Python初学者来说更方便的是接下来介绍的Anaconda。

Anaconda是一个包含【Python解释器 + 最常用的依赖包(package) + 最全面的package库 + 最方便的package管理系统 + 可能是最好用的Python IDE】的大杂烩。Anaconda本身也是水蟒的意思,它的出生就是为了给Python提供更好的开发环境(但是它也支持R,就很魔幻)。这个东西比较大,但是几乎包含了所有学习Python需要用到的东西,推荐下载。下载链接

1.4 怎么学Python

学习任何一门计算机语言,基本逻辑都是【了解基本语法->了解基本数据类型->熟悉常用依赖库->(理解底层数据结构、编译原理->)结合语言、数据结构和算法知识实现功能->在无尽的debug中逐渐精通】。

学习Python和学习其他计算机语言没有什么本质的差别,不过还是有一点小区别,主要有以下几个:

这些小差别使得Python这门语言非常容易上手,尤其易读性能让没接触过编程的新手也能基本看懂大部分别人写的代码,对自学是很友好的。但是当然也会带来很多缺点,比如运行速度慢,比如不理解底层数据结构的话看一些bug就会怀疑人生,比如有时候程序莫名其妙能运行但是结果是错的。这些问题都可以通过深入理解这门语言来解决。

2. 前置课程

这一章介绍一些和Python相关,但是不属于Python教学大纲的基础知识。这里每一节都至少是一门课,也不需要学太深,稍微看看了解一下就行,不仅对学Python,对所有计算机语言都很有帮助

2.1 计算机组成原理

计算机包括外接设备和内部设备,外接就不说了,鼠标键盘音响显示器那些东西,主要负责输入和输出信号。这章主要介绍一下主机里的东西和它们的运行逻辑。

2.1.1 计算机的基本组成

一台计算机由运算器、储存器、控制器组成,加上输入输出设备构成冯诺依曼体系,也是如今所有计算机的基本体系。
计算机组成原理

2.1.2 运算器

运算器是用来执行计算任务的,运算任务主要有两类:有先后依赖关系的顺序计算任务和没有依赖关系的并行计算任务

2.1.3 储存器

储存器是用来储存数据和运算结果的,由于硬件的读取速度和储存容量之间存在矛盾,计算机中采用了分层储存的结构,即靠近运算端的采用读取快、容量小的模式,靠近储存端的采用读取慢、容量大的模式,现在的计算机一般分三层。注意储存器也是通过电容的充电/放电,或是磁极的南/北来储存数据的,所以所有数据在储存器里也都是以排成一列的0/1字符串的格式存在

2.1.4 不重要的东西

好了,现在你已经学会了计算机的组成框架,赶快回家自己造一个吧!
计算机结构实拍

2.2 数据结构

数据在储存器里都是线性(排成一列)存储的,那我们想表示非线性的东西(比如图像、矩阵、网络)怎么办呢?即使是线性的东西,我们如果想将其无限延伸怎么办呢。如果我们想迅速定位到一个复杂数据里的某个位置,怎么做最快?如果我们想在一组数据里搜索某个特定的值,怎么做最快?

数据结构解决的就是这一类问题,即如何储存各类数据,能用更少的储存空间达到更快、更准确、更方便地调用数据的目的。

【要理解任何程序的运行原理,数据结构是重点中的重点】

2.2.0 基本数据类型

数据类型是指一类结构相同的数据,由于同一数据类型在内存里的储存方式相同,设计语言的人可以对它们设计统一的操作。在多数语言中,数据类型大概有这么几类:

底层的数据类型一般就这些,其它数据类型基本都是这些类型的结合/变换/应用

2.2.1 数组和多维数组

有了数字类型可以表示一个数值,但是很多时候我们想表示很多数值,比如一个班的同学的身高,可能有几十个数值,难道要生成几十个变量来一一表示吗?为了克服这个麻烦,可以使用数组

数组的优点是:

数组的缺点是:

2.2.2 链表和动态数组

数组可以解决一些数据联合起来存储的问题,但是需要数据的个数已知,或至少知道一个上限。很多时候数据的个数很难提前知道,比如餐厅想记录今天每笔订单的金额,如果每天都按可能的最高订单数来记录,就很浪费空间,而且有数据溢出的风险。

那么有没有一种使用时可以不断延长的数字列表呢,当~然有啦!它叫做链表

当然一个链上也不一定只有一个指针,比如可以有两个指针,一个指向下一个链,一个指向上一个链,这样就变成了双向链表。或者也可以有其它的玩法
此处输入图片的描述

链表的优点是:

链表的缺点是:

2.2.3 哈希表

数组和链表的查找复杂度都是 ,这意味着当数据量很大,要从中找到某个值是非常费劲的。哈希表利用哈希函数,把一个数据的储存位置和它的值联系起来,这样当我们想查找一个值,就可以直接去某个地址查找,实现 的查找复杂度

哈希函数

哈希表

申请的空间如果不是256个整数,而是256个指针,哈希表就可以用来储存复杂的数据结构,用来计算哈希值的"key"和要储存的"value"也可以剥离开。比如要储存班里每位同学的身高、体重、年龄、成绩,可以用同学的名字作为key,计算出哈希值后,把指向相应数据的指针储存在哈希值的对应位置。

python里的字典(dict)就是典型的哈希表

【留个思考题】如果出现了两个具有相同哈希值的数据,哈希表该如何处理

哈希表的优点有:

哈希表的缺点有:

【待续,后面的暂时不在python里出现】

2.2.4 二叉树和搜索树

2.2.4 图和网络

2.3 算法和复杂度估计

数据结构和算法其实是编程的核心能力,会不会用某种语言都是小事(另外一个核心能力是找包调包的能力)。这就真的只能看到一个写一个了

2.4 编译原理

这门课没啥用,就是能理解代码是怎么运行起来的

2.5 正则表达式

介绍字符串的时候再补上

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注