yield大法好

雖然不知道是誰最早發(fā)明yield來表達協(xié)程的秒裕,不過最近終于解鎖這一技能了俯萎,讓我感受到了上帝般的快感。
比方說我們要后序遍歷二叉樹,好啦我知道ACMer閉著眼睛都能默寫出來非遞歸版本架谎,讓我們看看遞歸版本先:

class Node(object):
    def __init__(self, val, left, right):
        self.val = val
        self.left = left
        self.right = right

def visit_post(node):
    if node.left:
        yield from visit_post(node.left)
    if node.right:
        yield from visit_post(node.right)
    yield node.val

if __name__ == '__main__':
    node = Node(-1, None, None)
    for val in range(100):
        node = Node(val, None, node)
    print(list(visit_post(node)))

就是這么簡單,yield from這么棒為什么你還在用Python2.x辟躏?
但是我們知道寫成遞歸動不動就爆棧了谷扣,非遞歸才是正義。不過不要怕捎琐,理解yield協(xié)程之后我們再也不必手動維護什么棧了会涎,裝逼變得異常簡單。

def visit_post(node):
    if node.left:
        yield node.left
    if node.right:
        yield node.right
    yield node.val

def visit(node, visit_method):
    stack = [visit_method(node)]
    while stack:
        last = stack[-1]
        try:
            yielded = next(last)
        except StopIteration:
            stack.pop()
        else:
            if isinstance(yielded, Node):
                stack.append(visit_method(yielded))
            elif isinstance(yielded, int):
                yield yielded

if __name__ == '__main__':
    node = Node(-1, None, None)
    for val in range(100):
        node = Node(val, None, node)
    visit_generator = visit(node, visit_method=visit_post) 
    print(list(visit_generator))

excellent瑞凑!關鍵是很好理解對不對末秃,我以前一直認為我不把LeetCode刷7遍是不可能完成遞歸轉非遞歸的白板編程的,現(xiàn)在根本不是問題嘛籽御。
話說簡書的代碼高亮能不能專業(yè)點练慕,__builtins__高亮很難?這根本就是態(tài)度問題技掏。


或者我們有遞歸搜索二叉樹最大值什么的:

def visit_maxvalue(node):
    if node.left and node.right:
        return max(node.val, visit_maxvalue(node.left), visit_maxvalue(node.right))
    elif node.left:
        return max(node.val, visit_maxvalue(node.left))
    elif node.right:
        return max(node.val, visit_maxvalue(node.right))
    else:
        return node.val

非遞歸版本也是非常平易近人:

def visit_max_maxvalue(node):
    if node.left and node.right:
        yield max(node.val, (yield node.left), (yield node.right))
    elif node.left:
        yield max(node.val, (yield node.left))
    elif node.right:
        yield max(node.val, (yield node.right))
    else:
        yield node.val

def visit(node, visit_method):
    stack = [visit_method(node)]
    current = None
    while stack:
        last = stack[-1]
        try:
            yielded = last.send(current)
        except StopIteration:
            stack.pop()
        else:
            if isinstance(yielded, Node):
                stack.append(visit_method(yielded))
                current = None
            elif isinstance(yielded, int):
                current = yielded
    return current

逼格飽滿有木有铃将!
BTW,著名的Tornado就是用yield協(xié)程來實現(xiàn)異步零截,大愛麸塞!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涧衙,隨后出現(xiàn)的幾起案子哪工,更是在濱河造成了極大的恐慌,老刑警劉巖弧哎,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雁比,死亡現(xiàn)場離奇詭異,居然都是意外死亡撤嫩,警方通過查閱死者的電腦和手機偎捎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來序攘,“玉大人茴她,你說我怎么就攤上這事〕痰欤” “怎么了丈牢?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞄沙。 經常有香客問我己沛,道長慌核,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任申尼,我火速辦了婚禮垮卓,結果婚禮上,老公的妹妹穿的比我還像新娘师幕。我一直安慰自己粟按,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布们衙。 她就那樣靜靜地躺著钾怔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒙挑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天愚臀,我揣著相機與錄音忆蚀,去河邊找鬼。 笑死姑裂,一個胖子當著我的面吹牛馋袜,可吹牛的內容都是我干的。 我是一名探鬼主播舶斧,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欣鳖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了茴厉?” 一聲冷哼從身側響起泽台,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矾缓,沒想到半個月后怀酷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡嗜闻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年蜕依,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琉雳。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡样眠,死狀恐怖,靈堂內的尸體忽然破棺而出翠肘,到底是詐尸還是另有隱情檐束,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布锯茄,位于F島的核電站厢塘,受9級特大地震影響茶没,放射性物質發(fā)生泄漏。R本人自食惡果不足惜晚碾,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一乡洼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谨履,春花似錦革为、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至懂诗,卻和暖如春蜂嗽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殃恒。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工植旧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人离唐。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓病附,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亥鬓。 傳聞我的和親對象是個殘疾皇子完沪,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容