- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我阅读另一个关于 finding all cycles in graph implementation 的讨论时,我遇到了这个问题。 。谁能解释一下这个例子中这对关键字的用法吗?谢谢。
01 def dfs(graph, start, end):
02 fringe = [(start, [])]
03 while fringe:
04 state, path = fringe.pop()
05 if path and state == end:
06 yield path
07 continue
08 for next_state in graph[state]:
09 if next_state in path:
10 continue
11 fringe.append((next_state, path+[next_state]))
>>> graph = { 1: [2, 3, 5], 2: [1], 3: [1], 4: [2], 5: [2] }
>>> cycles = [[node]+path for node in graph for path in dfs(graph, node, node)]
>>> len(cycles)
7
>>> cycles
[[1, 5, 2, 1], [1, 3, 1], [1, 2, 1], [2, 1, 5, 2], [2, 1, 2], [3, 1, 3], [5, 2, 1, 5]]
最佳答案
这两个关键字并不密切相关。
continue
关键字只能出现在循环体(for
或 while
语句)中,并导致控制流返回循环的顶部,而不是继续循环体的其余部分。它通常是在 if
或 else
block 中缩进循环体的整个其余部分的替代方法。这:
while foo():
if something():
continue
bar()
baz()
与此完全等效:
while foo():
if not something():
bar()
baz() # but note that these lines are more indented in this version!
另一个与continue
密切相关的关键字是break
,它会导致控制流立即退出循环,而不是回到顶部。 continue
和 break
都只能影响最近的循环,因此,如果您有嵌套的控制结构,则很难一次将它们全部打破(或
从内部循环内部继续外部循环)。
yield
关键字相当不同。尽管它经常出现在循环中,但并非必须如此。相反,它只允许在函数体内。它将函数更改为“生成器函数”。当调用生成器函数时,它的代码不会立即运行,而是创建一个“生成器对象”并将其返回给调用者。生成器对象是一种迭代器,可以通过 for 循环进行迭代(或通过手动调用 next() 来进行迭代)。仅当生成器对象被迭代时,函数的代码才会运行。每次到达 yield
语句时,函数的执行都会暂停,并且生成的值(如果未指定值,则为 None
)将作为迭代的值给出。 (请注意,当有人随意将某个东西称为“生成器”时,它们可能意味着生成器函数或生成器对象。从上下文中通常可以清楚地了解它们的含义。)
下面是一些使用生成器打印 1
、2
和 3
的示例代码:
def generator_function():
yield 1 # because it contains `yield` statements, this is a generator function
yield 2
yield 3
generator_object = generator_function() # you can create a variable for the generator object
for value in generator_object: # but often you'd create it on the same line as the loop
print(value)
另一个与yield
有点相似的关键字是return
,它也只在函数中有意义。它立即结束函数的执行以返回指定的值(如果未指定值,则返回“None”)。
您展示的dfs
函数依次使用yield
和continue
。它的作用是首先产生一个值(停止生成器函数的执行,直到请求下一个值),然后一旦恢复执行,它就会返回到循环的开头。
如果您愿意,您可以重写该函数以避免其中任何一个(尽管生成的函数的工作方式会略有不同,因为它不再是惰性生成器):
def dfs(graph, start, end):
results = [] # maintain a list of results to avoid yielding
fringe = [(start, [])]
while fringe:
state, path = fringe.pop()
if path and state == end:
results.add(path) # don't yield any more, just add the path to the results list
else: # add an else block instead of using continue
for next_state in graph[state]:
if next_state not in path: # reverse the condition instead of continue
fringe.append((next_state, path+[next_state]))
return results # return the results at the end of the function
我注意到该函数的生成器版本在大多数情况下可能更好。使用继续
而不是更多缩进更多的是一种风格选择,并且对代码的逻辑或性能没有太大影响(只是对其外观有影响)。
关于python - 这对关键字 "continue"和 "yield"在 Python 中起什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45138856/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!