我试图在定义生成器时理解控制流。
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次时显示错误?在理解控制流方面的任何帮助将不胜感激
答案 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