- 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/
编码新手,无法弄清楚为什么 continue 在我的 for 循环中不起作用。在打印语句之后,我想从顶部重新开始循环。如果有人能让我知道我做错了什么,那就太好了。我不允许共享 cse231_rando
我正在尝试运行连续异步查询。在我的 Windows 盒子上,我通过双击 ignite.bat 文件启动了 Apache Ignite,并尝试运行以下代码 - Data Publisher 客户端包点燃
目前我正在尝试了解 openCV 中连续矩阵和非连续矩阵之间的一些区别。有人向我建议连续矩阵提供更好的性能,因为程序不必在每一列的末尾跳回到下一行的开头。 简而言之,连续和非连续矩阵之间的可比较性能差
我有一个运行多个行的 cron,删除“坏”的行(根据我的标准)。我只是想知道优化脚本的最佳方法是什么。我可以执行以下操作之一: 让同一个 cron 在发现“坏”行后立即删除它们。 让相同的 cron
我已经在我的 Tfs2010 实例上运行了一个 CI 构建,但我还想运行一个门控检入构建。然而,我希望这两个构建运行的方式之间存在细微的差异。具体来说,我希望 Gated checkin 在失败时不产
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 1年前关闭。 Improve this
Here和 here据说Continuation Monad解决了回调 hell 。 RX 和 FRP 也解决了回调 hell 。 如果所有这三个工具都解决了回调 hell ,那么就会出现以下问题:
我的 Java 缩进风格可能有点特殊,我经常这样写: object.myMethod( myFirstArgument, mySecondArgument, myThirdArgument,
关闭。这个问题需要details or clarity .它目前不接受答案。 想要改进这个问题吗? 通过 editing this post 添加详细信息并澄清问题. 关闭 2 年前。 Improve
我正在使用苹果的 SpriteKit 和 Swift 制作一个简单的游戏,并且遇到了问题。我试图让桨节点(paddle)围绕圆内的固定节点(anchorNode)连续旋转;但是,我无法弄清楚如何使桨节
我正在尝试为控制系统编写一个自适应 Controller ,即使用 Q-learning 的电源管理系统。我最近为车杆系统实现了一个玩具强化学习问题,并根据 Andrew NG 的笔记制定了直升机控制
我想知道一种原生支持定界延续的编程语言。我确实知道 Scala 曾经有 shift 和 reset,但这些都被删除了;而且我也知道 Seaside 似乎有类似的东西,但 Seaside 是一个图书馆,
在本教程中,您将通过示例了解 continue 语句。 continue 语句用于跳过循环的当前迭代,程序的控制流转到下一个迭代。 continue 语句的语法是: continue
背景 目前,我在本地构建解决方案时运行预构建命令。但是,在我的 VSTS 持续集成服务器上构建时不需要此命令。 问题 有没有办法在本地机器上构建时只运行预构建事件命令? 我知道您可以添加如下条件语句。
我有时会有 1 或 2 个测试在 CI 中失败,并且重新运行构建会导致它们通过。 如何自动重新运行这些不稳定的测试,以便我的构建第一次通过?有没有类似 mocha 的东西的this.retries ?
希望有人可以帮助我解决这个问题。让 TeamCity 启动并运行并在各种项目上进行构建。我希望能够自动将成功的 TeamCity 运行构建复制/部署到测试服务器。 我正在考虑使用 PowerShell
我希望使用持续集成,但我对 Ant、Jenkins、CruiseControl、Phing、PHPUnderControl 等并不了解…… 什么是真正的持续集成? 我正在使用 Zend Framewo
我已将 travis 设置为使用 tox(Python 2.7 和 3.5)进行测试并部署到 pypi。 Travis 尝试为每次测试运行部署包,而 pypi 正确地拒绝了第二次尝试。 我希望 tra
我正在尝试使用 pem key 将一些文件 scp 到不同的计算机,所以我不需要我的密码。但是,每次我尝试连接到一个新盒子时,它都会问我“说真的,你想连接吗?你想保存 key 吗?......”这太烦
使用dvc无疑有很多优势,它可以像集中式vcs一样使用,但是具有本地提交功能并且能够很容易地将项目 fork 给一些较小的团队,从而使得更难于支持持续集成吗?它有助于开发,使每个人都可以访问由CI服务
我是一名优秀的程序员,十分优秀!