1.捕獲中斷(待補(bǔ)充...)
一開(kāi)始我用的是try except KeyboardInterrupt,但在ctrl+C后未停止運(yùn)行,其實(shí)這個(gè)時(shí)候應(yīng)該是我套了兩層循環(huán),內(nèi)循環(huán)還未停止的原因。但后期我也沒(méi)有再去嘗試這個(gè)問(wèn)題。問(wèn)了一下導(dǎo)師,他說(shuō)了這么一句話:Ctrl + C一般是用捕獲信號(hào)的形式而不是捕獲異常,使用signal包試試。那我們來(lái)看下這個(gè)從未接觸過(guò)的signal包是怎么用的吧:(目前我還沒(méi)懂原理,只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:
# 中斷時(shí)需要處理的代碼
print "Exit"
is_sigint_up = False
continue
except Excepting,e:
break
2.廣度優(yōu)先和深度優(yōu)先
從一個(gè)網(wǎng)頁(yè)的URL進(jìn)去,抓取這個(gè)網(wǎng)頁(yè)上包含的所有的二級(jí)三級(jí)四級(jí)...URL鏈接,一開(kāi)始是沒(méi)啥思路的,總感覺(jué)需要手動(dòng)指定爬幾級(jí)。然后寫(xiě)著寫(xiě)著突然意識(shí)到這是一個(gè)深度優(yōu)先or廣度優(yōu)先的問(wèn)題,那么,我們來(lái)搜一下它們的定義是什么吧。直接上別人博客里的圖:

已知有上面的二叉樹(shù)
廣度優(yōu)先:我們?cè)诒闅v這個(gè)二叉樹(shù)的時(shí)候,每一步有多個(gè)不同的選擇,比如先從根結(jié)點(diǎn)出發(fā),有往B節(jié)點(diǎn)走的路徑,也有往C節(jié)點(diǎn)走的路徑。假設(shè)選取了往B節(jié)點(diǎn)走的路徑,那么下一步還有F和G兩個(gè)方向可以走。廣度優(yōu)先的遍歷方式為:D-B-C-F-G-A-E-H,廣度優(yōu)先的偽代碼如下:
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)
深度優(yōu)先:在遍歷二叉樹(shù)的時(shí)候,選中一個(gè)路徑,一口氣走到黑~走到最下層了怎么辦呢,我們退回上一層,看看同級(jí)的是不是還有沒(méi)被遍歷過(guò)的。深度優(yōu)先的遍歷方式為:D-B-F-G-E-C-A-H,深度優(yōu)先的偽代碼如下:
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