1.捕获中断(待补充...)
一开始我用的是try except KeyboardInterrupt,但在ctrl+C后未停止运行,其实这个时候应该是我套了两层循环,内循环还未停止的原因。但后期我也没有再去尝试这个问题。问了一下导师,他说了这么一句话:Ctrl + C一般是用捕获信号的形式而不是捕获异常,使用signal包试试。那我们来看下这个从未接触过的signal包是怎么用的吧:(目前我还没懂原理,只get到了怎么用)
def sigint_handler(signum, frame):
global is_sigint_up
is_sigint_up = True
print 'catched interrupt signal!'
signal.signal(signal.SIGINT, sigint_handler)
signal.signal(signal.SIGHUP, sigint_handler)
signal.signal(signal.SIGTERM, sigint_handler)
is_sigint_up = False
while True:
try:
# 你想做的事情
import time
print "start ............."
time.sleep(2)
if is_sigint_up:
# 中断时需要处理的代码
print "Exit"
is_sigint_up = False
continue
except Excepting,e:
break
2.广度优先和深度优先
从一个网页的URL进去,抓取这个网页上包含的所有的二级三级四级...URL链接,一开始是没啥思路的,总感觉需要手动指定爬几级。然后写着写着突然意识到这是一个深度优先or广度优先的问题,那么,我们来搜一下它们的定义是什么吧。直接上别人博客里的图:
已知有上面的二叉树
广度优先:我们在遍历这个二叉树的时候,每一步有多个不同的选择,比如先从根结点出发,有往B节点走的路径,也有往C节点走的路径。假设选取了往B节点走的路径,那么下一步还有F和G两个方向可以走。广度优先的遍历方式为:D-B-C-F-G-A-E-H,广度优先的伪代码如下:
def bfs(Root_Node):
if Root_Node is None:
return
queue = []
Node = Root_Node
queue.append(Node)
while queue:
Node = queue.pop(0)
if Node.lChild:
queue.append(Node.lChild)
if Node.rChild:
queue.append(Node.rChild)
深度优先:在遍历二叉树的时候,选中一个路径,一口气走到黑~走到最下层了怎么办呢,我们退回上一层,看看同级的是不是还有没被遍历过的。深度优先的遍历方式为:D-B-F-G-E-C-A-H,深度优先的伪代码如下:
def dps(Root_Node):
if Root_Node is None:
return
if Root_Node.lChild:
return dps(Root_Node.lChild)
if Root_Node.rChild:
return dps(Root_Node.rChild)
- ✅本周代码已push到github