2015-06-21 54 views
1

過程編程的優點之一是能夠將任意一段代碼提取到一個函數中,該函數可以在許多地方重用,從而減少代碼重複。但是,Python中的yield語句似乎減少了這種能力,因爲當yield語句被提取到另一個函數中時,原始生成器函數變成正常函數,因此不能再用作生成器。Python中生成器函數中的代碼重複

考慮這個例子:

def foo(): 
    do_something() 
    bar = get_some_value() 
    yield bar 
    save(bar) 
    do_something_else() 
    # more code in between 
    bar = get_some_value() 
    yield bar 
    save(bar) 
    # finishing up 

注意,代碼周圍yield語句始終是相同的,但我們不能把它解壓到一個功能。

這是Python的一個已知缺陷,或者是否有解決方案來重用yield語句的代碼?

+4

請提供一些例子證明你的問題。現在,你要問的東西還不清楚。 – MattDMo

+0

我不明白你在說什麼。你是指[Coroutines](https://en.wikipedia.org/wiki/Coroutine)? –

回答

1

在Python 3.3或更高版本:

def helper(): 
    bar = get_some_value() 
    yield bar 
    save(bar) 

def foo(): 
    do_something() 
    yield from helper() 
    do_something_else() 
    # more code in between 
    yield from helper() 
    # finishing up 

在早期蟒蛇(包括Python 2):

def helper(): 
    bar = get_some_value() 
    yield bar 
    save(bar) 

def foo(): 
    do_something() 
    for x in helper(): yield x 
    do_something_else() 
    # more code in between 
    for x in helper(): yield x 
    # finishing up