我知道这在没有生成器的情况下是非常容易归档的,但是我想更好地理解生成器。因此,请不要建议使用其他东西。
我有一个类可以为屏幕截图生成文件名(selenium):
class ScreenshotName
{
private $counter = 0;
public function screenshotNameIterator()
{
while(true) {
yield sprintf("screenshot-%s-%s.png", date("Y-m-d\\TH:i:s"), ++$this->counter);
}
}
}
现在我的问题是:除了Foreach循环之外,我可以在任何其他上下文中使用这样的生成器吗?例如。
(new ScreenshotName())->screenshotNameIterator()->next()
对我来说,这总是返回null,如果我调试,它永远不会进入生成器方法。PHP文档也没有真正提到这一点。
所以我的问题是:有没有一种记录在案的方法在不同的上下文中使用生成器而不是for循环?
这是一个完整的代码片段,与黑暗鸭子的答案相匹配。也就是说,它演示了如何使用迭代器接口迭代所有值。(黑暗鸭子的代码不完整。)基于robert_e_lee在Iterator doc上的评论:
$gen = evenNumbers();
// If in a method that re-uses an iterator, may want the next line.
//OPTIONAL $gen->rewind();
while ($gen->valid()) {
// This is the value:
$value = $it->current();
// You might or might not care about the key:
//OPTIONAL $key = $it->key();
// ... use $value and/or $key ...
$it->next();
}
上述情况大致相当于:
foreach (evenNumbers() as $value) {
// ... use $value ...
}
或者
foreach (evenNumbers() as $key => $value) {
// ... use $value and/or $key ...
}
有一种记录在案的方法可以做到这一点。事实上,生成器确实实现了迭代器接口,正如您在本页上看到的那样。
实际上,foreach
关键字只在迭代器上起作用。因此,如果可以在生成器上使用foreach
,则必须能够调用next
下面是使用next
而不是foreach
的示例代码:
<?php
function evenNumbers() {
for ($i = 0;; $i++) {
yield 2*$i;
}
}
$gen = evenNumbers();
$gen->next();
echo $gen->current();
?>
我知道这在没有生成器的情况下是非常容易归档的,但是我想更好地理解生成器。因此,请不要建议使用其他东西。 我有一个类可以为屏幕截图生成文件名(selenium): 现在我的问题是:除了Foreach循环之外,我可以在任何其他上下文中使用这样的生成器吗?例如。 对我来说,这总是返回null,如果我调试,它永远不会进入生成器方法。PHP文档也没有真正提到这一点。 所以我的问题是:有没有一种记录在案的方法
问题内容: 所以我有一个生成器函数,看起来像这样。 在加载此函数并多次调用“ next”之后,我希望它会产生值 但是相反,它总是一直产生0。这是为什么? 问题答案: 初始化新的生成器对象: 然后从新创建的生成器对象获取第一个值(在您的情况下为 0 )。 您应该致电一次: 注意 :已从Python 3(PEP 3114)中删除- 改为使用该函数:
这个脚本应该以随机生成的延迟滚动浏览网站上的每个容器。对于循环中的每次迭代,我要将ms的“暂停”替换为一个在和秒之间随机生成的数字。 随机数生成器: 就像这样工作很好。在每次迭代之后,会有2秒的暂停。但是,当我移除注释以添加行以随机化每次迭代之间的时间时,值(它应该滚动到哪个容器)一开始很好,但后来也变成随机的。 控制台输出: 我该怎么解决这个?
我不是只想用第一个数字来完成这个操作,而是使用while循环和if条件,使我在键盘上输入的任何内容都变成一个整数。 你觉得问题出在哪里?请帮帮我.
问题内容: 我需要一个2D循环,其中第一个循环使用迭代器,第二个循环使用生成器,但是此简单函数无法正常工作,有人可以帮助检查吗? 不知道为什么?在此先感谢您的帮助。 问题答案: 既然您要澄清一下,我再说一遍。但实际上Ignacio的答案很好地总结了这一点:您只能在一个生成器上进行一次迭代。您示例中的代码尝试对其进行3次迭代,对于中的每个值一次。 要了解我的意思,请考虑以下简单示例: 当被调用时,它
我正在Flask中构建一个web应用程序,它涉及到一些SQLAlchemy。我有一个函数“get_team()”让我发疯。 我一直得到的错误:"属性错误:'Unicode'对象没有属性'_sa_instance_state'"。以下是模型的样子: 任何方向都将不胜感激!