程序如何控制生成器中的流程?

时间:2019-06-26 02:17:25

标签: python python-2.7

我试图在定义生成器时理解控制流。

var urls = ["http://web.site/file1.iso", "https://web.site/file2.pdf", "https://web.site/file3.docx", ...];

当我致电public void HideDivByClassName(WebBrowser browser, string classname) { if (browser.Document != null) { var byTagName = browser.Document.GetElementsByTagName("div"); foreach (HtmlElement element in byTagName) { if (element.GetAttribute("className") == classname) { element.Style = "display:none"; } } } } 时,会打印def countdown(num) print('Starting') while num > 0: yield num num -= 1 val = countdown(5) ,后跟数字5 但在随后的呼叫中,仅会打印该号码。为什么我看不到next(val)?为什么当我多次致电Starting超过5次时显示错误?在理解控制流方面的任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

第一次调用next()时,执行从函数体的开头开始,一直持续到下一个yield语句,该语句返回该语句右边的值。

随后对next()的调用从yield语句继续到函数结尾,然后循环并从while循环的开始继续,直到调用另一个yield

如果未调用yield(在您的情况下,这意味着您不进入while函数,因为num <= 0)将引发StopIteration异常。

答案 1 :(得分:1)

Starting移动到while块内:

def countdown(num):
    while num > 0:
        print('Starting')
        num -= 1
        yield num

val = countdown(5)
for i in range(5):
    print(next(val))

输出:

Starting
4
Starting
3
Starting
2
Starting
1
Starting
0

答案 2 :(得分:1)

好吧,目前您仅打印Starting一次,并且由于未进行yield处理,因此它附带了第一个yield。为什么到达0后为什么不抛出错误?应该这样,因为yield的悔改将停止,并且next仅在还有更多的yield时才起作用。要对其进行一些调整,以使它不会仅用Starting来打印5,而不会打印其他数字,并且不会产生任何错误,请执行以下操作:

def countdown(num):
    while num > 0:
        print('Starting')
        yield num
        num -= 1
    while True:
        yield 'The number reached zero, it stopped'
val = countdown(5)

进行以下测试:

for i in range(10):
    print(next(val))

礼物:

Starting
5
Starting
4
Starting
3
Starting
2
Starting
1
The number reached zero, it stopped
The number reached zero, it stopped
The number reached zero, it stopped
The number reached zero, it stopped
The number reached zero, it stopped