Skip to content

Commit 3141c3e

Browse files
committed
完成三章讲义和代码
1 parent 2ee7917 commit 3141c3e

File tree

7 files changed

+238
-11
lines changed

7 files changed

+238
-11
lines changed

.gitignore

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,24 @@
1+
# media
12
*.mp4
23
*.mov
34
*.avi
5+
6+
7+
# python
8+
__pycache__/
9+
*.py[cod]
10+
*$py.class
11+
.python-version
12+
13+
14+
# vim
15+
.vimrc
16+
.lvimrc
17+
.*.sw[a-z]
18+
*.un~
19+
Session.vim
20+
21+
# cache
22+
.cache
23+
.tmp
24+
.idea

0_课程简介之笨方法学算法/README.md renamed to 0_课程简介之笨方法学算法/why_and_how_to_learn.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
# 小问题
2525

26-
- 1. 你还知道哪些经典的算法和数据结构?
27-
- 2. 学习算法你觉得需要哪些预备知识?
28-
- 3. 我们的业务代码开发中会涉及到算法吗?
26+
- 你还知道哪些经典的算法和数据结构?
27+
- 学习算法你觉得需要哪些预备知识?
28+
- 我们的业务代码开发中会涉及到算法吗?
29+
- 你了解 redis 吗,你知道它有哪几个常用的数据结构吗?你知道它的底层实现方式吗?
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Python 一切皆对象
2+
3+
举个例子,在 python 中我们经常使用的 list
4+
5+
```py
6+
l = list() # 实例化一个 list 对象 l
7+
l.append(1) # 调用 l 的 append 方法
8+
l.append(2)
9+
l.remove(1)
10+
print(len(l)) # 调用对象的 `__len__` 方法
11+
```
12+
13+
在后面实现新的数据类型时,我们将使用 python 的 class 实现,它包含属性和方法。
14+
属性一般是使用某种特定的数据类型,而方法一般是对属性的操作。
15+
这里你只需了解这么多就行了, 我们不会使用继承等特性。
16+
17+
18+
# 什么是抽象数据类型 ADT
19+
20+
实际上 python 内置的 list 就可以看成一种抽象数据类型。
21+
22+
ADT: Abstract Data Type,抽象数据类型,我们在组合已有的数据结构来实现一种新的数据类型, ADT 定义了类型的数据和操作。
23+
24+
我们以抽象一个背包(Bag) 数据类型来说明,背包是一种容器类型,我们可以给它添加东西,也可以移除东西,并且我们想知道背包里
25+
有多少东西。于是我们可以定义一个新的数据类型叫做 Bag.
26+
27+
```py
28+
class Bag:
29+
""" 背包类型 """
30+
pass
31+
```
32+
33+
34+
# 实现一个 Bag ADT
35+
视频中我们将使用 python 的 class 来实现一个新的容器类型叫做 Bag。
36+
37+
38+
# 实现 ADT 我们应该注意什么?
39+
- 如何选用恰当的数据结构作为存储?
40+
- 选取的数据结构能否满足 ADT 的功能需求
41+
- 实现效率如何?
42+
43+
44+
# 小问题:
45+
- 你了解 python 的魔术方法吗? 比如 `__len__` ,调用 len(l) 的时候发生了什么?
46+
- 你了解单测吗?我们以后将使用 pytest 运行单元测试,保证我们实现的数据结构和算法是正确的。你可以网上搜索下它的简单用法
47+
48+
# 延伸阅读:
49+
50+
[数据结构与算法--ADT](http://www.atjiang.com/data-structures-using-python-ADT/)
51+
52+
[http://www.nhu.edu.tw/~chun/CS-ch12-Abstract%20Data%20Types.pdf](http://www.nhu.edu.tw/~chun/CS-ch12-Abstract%20Data%20Types.pdf)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# coding: utf8
2+
3+
4+
class Bag(object):
5+
6+
def __init__(self, maxsize=10):
7+
self.maxsize = maxsize
8+
self._items = list()
9+
10+
def add(self, item):
11+
if len(self) > self.maxsize:
12+
raise Exception('Full')
13+
self._items.append(item)
14+
15+
def remove(self, item):
16+
self._items.remove(item)
17+
18+
def __len__(self):
19+
return len(self._items)
20+
21+
def __iter__(self):
22+
for item in self._items:
23+
yield item
24+
25+
26+
def test_bag():
27+
bag = Bag()
28+
29+
bag.add(1)
30+
bag.add(2)
31+
bag.add(3)
32+
33+
assert len(bag) == 3
34+
35+
bag.remove(3)
36+
assert len(bag) == 2
37+
38+
for i in bag:
39+
print(i)
40+
41+
42+
if __name__ == '__main__':
43+
test_bag()

2_数组和列表/array_and_list.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# 线性结构
2+
本节我们从最简单和常用的线性结构开始,并结合 Python 语言本身内置的数据结构和其底层实现方式来讲解。
3+
虽然本质上数据结构的思想是语言无关的,但是了解 Python 的实现方式有助于你避免一些坑。
4+
5+
我们会在代码中注释出操作的时间复杂度。
6+
7+
8+
# 数组 array
9+
10+
数组是最常用到的一种线性结构,其实 python 内置了一个 array 模块,但是大部人甚至从来没用过它。
11+
Python 的 array 是内存连续、存储的都是同一数据类型的结构,而且只能存数值和字符。
12+
13+
我建议你课下看下 array 的文档:https://docs.python.org/2/library/array.html
14+
15+
你可能很少会使用到它(我推荐你用 numpy.array),我将在视频里简单介绍下它的使用和工作方式,最常用的还是接下来要说的 list,
16+
本章最后我们会用 list 来实现一个固定长度、并且支持所有 Python 数据类型的数组 Array.
17+
18+
19+
# 列表 list
20+
如果你学过 C++,list 其实和 C++ STL(标准模板库)中的 vector 很类似,它可能是你的 Python 学习中使用最频繁的数据结构之一。
21+
这里我们不再去自己实现 list,因为这是个 Python 提供的非常基础的数据类型,我会在视频中讲解它的工作方式和内存分配策略,
22+
避免使用过程中碰到一些坑。当然如果你有毅力或者兴趣的了解底层是如何实现的,可以看看 cpython 解释器的具体实现。
23+
24+
25+
操作 | 平均时间复杂度 |
26+
--------------------------------------|----------------|
27+
list.append | O(1) |
28+
list.insert | O(n) |
29+
list.pop(index), default last element | O(1) |
30+
list.remove | O(n) |
31+
32+
33+
# 用 list 实现 Array ADT
34+
讲完了 list 让我们来实现一个定长的数组 Array ADT,在其他一些语言中,内置的数组结构就是定长的。
35+
这里我们会使用 list 作为 Array 的一个成员(代理)。具体请参考视频讲解和代码示例,后边我们会使用到这个 Array 类。
36+
37+
38+
# 小问题
39+
- 你知道线性结构的查找,删除,访问一个元素的平均时间复杂度吗?(后边我们会介绍这个概念,现在你可以简单地理解为一个操作需要的平均步骤)
40+
- list 内存重新分配的时候为什么要有冗余?不会浪费空间吗?
41+
- 当你频繁的pop list 的第一个元素的时候,会发生什么?如果需要频繁在两头增添元素,你知道更高效的数据结构吗?后边我们会讲到
42+
43+
44+
# 延伸阅读
45+
46+
[Python list implementation](https://www.laurentluce.com/posts/python-list-implementation/)
47+
48+
[https://github.com/python/cpython/blob/master/Objects/listobject.c](https://github.com/python/cpython/blob/master/Objects/listobject.c)

2_数组和列表/array_and_list.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# -*- coding: utf-8 -*-
2+
3+
# https://docs.python.org/2/library/array.html
4+
from array import array # python 提供的比较原始的 array 类
5+
6+
7+
arr = array('u', 'asdf')
8+
9+
print(arr[0], arr[1], arr[2], arr[3])
10+
11+
12+
# 实现定长的 Array ADT,省略了边界检查等
13+
14+
class Array(object):
15+
16+
def __init__(self, size=32):
17+
self._size = size
18+
self._items = [None] * size
19+
20+
def __getitem__(self, index):
21+
return self._items[index]
22+
23+
def __setitem__(self, index, value):
24+
self._items[index] = value
25+
26+
def __len__(self):
27+
return self._size
28+
29+
def clear(self, value=None):
30+
for i in range(self._items):
31+
self._items[i] = value
32+
33+
def __iter__(self):
34+
for item in self._items:
35+
yield item
36+
37+
38+
def test_array():
39+
size = 10
40+
a = Array(size)
41+
a[0] = 1
42+
assert a[0] == 1
43+
assert len(a) == 10
44+
45+
# py.test array_and_list.py

README.md

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@
66
本教程是付费教程,因为笔者录制的过程中除了购买软件、手写板等硬件之外,业余需要花费很多时间和精力来录制视频、查资料、编写课件和代码,希望大家体谅。
77

88
## 作者简介
9-
目前就职于知乎,从实习期间接触 Python 起一直从事 Python 后端开发,有一定 Python 的使用经验。
10-
知乎专栏: 《Python 学习之路》《玩转vim》
11-
电子书:《Python web 入坑指南》
9+
目前就职于[知乎](https://www.zhihu.com/people/pegasus-wang/activities),从实习期间接触 Python 起一直从事 Python 网站后端开发,有一定 Python 的使用和实践经验。
10+
11+
知乎专栏:
12+
- [《Python 学习之路》](https://zhuanlan.zhihu.com/c_85234576)
13+
- [《玩转vim(视频)》](https://zhuanlan.zhihu.com/vim-video)
14+
15+
电子书:[《Python web 入坑指南》](http://python-web-guide.readthedocs.io/zh/latest/<Paste>)
1216

1317
## 课程内容
1418
包括我们在业务开发和面试中常用的算法和数据结构,希望可以帮助新人快速上手,很多老手写业务代码写多了很多基础知识忘记了,
@@ -26,10 +30,11 @@
2630

2731
- 课程简介之笨方法学算法
2832
- 抽象数据类型 ADT,面向对象编程
29-
- 数组和链表
33+
- 数组和列表
34+
- 链表
35+
- 高级链表。双链表,循环双端链表
3036
- 队列和栈,双端队列
3137
- 算法分析,时间复杂度 大O 表示法
32-
- 高级链表。双链表,循环双端链表
3338
- 哈希表,散列冲突
3439
- 字典和集合
3540
- 递归
@@ -47,12 +52,17 @@
4752
在知乎上维护了一个专栏[《Python 学习之路》](https://zhuanlan.zhihu.com/c_85234576)
4853

4954
Python 抽象程度比较高, 我们能用更少的代码来实现功能,同时不用像 C/C++ 那样担心内存管理、指针操作等底层问题,
50-
把主要心思放在算法逻辑本身而不是语言细节上,Python 也号称伪代码语言。所有代码示例使用 Python3.
55+
把主要心思放在算法逻辑本身而不是语言细节上,Python 也号称伪代码语言。所有代码示例使用 Python2/3 兼容代码.
5156

5257
## 受众
53-
想要学习 Python 算法和数据结构的初、中级同学。需要掌握 Python
58+
想要学习 Python 算法和数据结构的初、中级同学,包括自学的同学和本科低年级学生等。需要掌握 Python
5459
的基本语法和面向对象编程的一些概念,我们这里只使用最基本的 Python 语法,不会再去介绍用到的 Python 语法糖。
5560

61+
# 预备知识
62+
- 掌握 Python 基本语法,有过使用 Python 的经验。
63+
- 基本的面向对象编程知识,会定义和使用 Python 中的类 (class)
64+
- 知道 Python 中的魔术方法,比如 `__len__` `__contains__`
65+
5666
## 教材
5767
这里我参考过三本书:
5868

@@ -78,12 +88,15 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
7888

7989
[抱歉,我是开发,你居然让我写单测[视频]](https://zhuanlan.zhihu.com/p/35352024)
8090

91+
- 视频演示更加直观
92+
- 演示代码实现思路
8193

8294
## 资料
8395

8496
- 视频。包含所有讲解视频
8597
- 代码示例。所有代码我会放到 github 上
86-
- markdown 讲义。
98+
- markdown 讲义,包含视频内容的提要等内容
99+
- 延伸阅读。我会附上一些阅读资料方便想深入学习的同学
87100

88101
## 如何学习
89102
笔者讲课录制视频的过程也是自己再整理和学习的过程,录制视频之前需要参考很多资料
@@ -95,6 +108,10 @@ Python 抽象程度比较高, 我们能用更少的代码来实现功能,同
95108
- 时间、空间复杂度
96109
- 使用场景,什么时候用
97110
- 自己尝试实现,如果抛开视频自己写起来有困难可以多看几次视频,一定要自己手动实现。很多面试可能会让手写
111+
- 每章讲义后边都会有我设计的几个小问题,最好能够回答上来
112+
113+
## 课程目标
114+
掌握基本的算法和数据结构原理,能独立使用 Python 语言实现,能在日常开发中灵活选用数据结构。
98115

99116
## 开发工具
100117
推荐使用以下工具进行开发,如果使用编辑器你需要安装对应的 Python 插件:

0 commit comments

Comments
 (0)