标签: generator

什么是ES6生成器以及如何在node.js中使用它们?

我今天在node.js聚会,我遇到的人说node.js有es6生成器.他说,这是对回调式编程的巨大改进,并将改变节点格局.Iirc,他说了一些关于调用堆栈和异常的内容.

我查了一下它们,但还没有找到任何以初学者友好的方式解释它们的资源.什么是生成器的高级概述,与回调的不同(或更好?)有何不同?

PS:如果你能提供一段代码来强调常见场景的差异(发出http请求或db调用),那将非常有用.

javascript generator node.js ecmascript-6

19
推荐指数
3
解决办法
6205
查看次数

Java8生成器的无限序列自然数

我用Java8 定义naturalStream自然数的无限序列()iterator.

IntStream natural = IntStream.iterate(0, i -> i + 1);

natural
 .limit(10)
 .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

现在,我想用Java8定义它generator.

静态流生成(供应商)

什么是最简单的方法?谢谢.

java iterator generator java-8

19
推荐指数
3
解决办法
1万
查看次数

共享的python生成器

我正在尝试使用Python生成器重现反应式扩展“共享”的可观察概念。

假设我有一个API,可以让我像这样使用无限流:

def my_generator():
    for elem in the_infinite_stream():
        yield elem
Run Code Online (Sandbox Code Playgroud)

我可以多次使用此生成器,如下所示:

stream1 = my_generator()
stream2 = my_generator()
Run Code Online (Sandbox Code Playgroud)

并且the_infinite_stream()将被调用两次(每个生成器一次)。

现在说这the_infinite_stream()是一项昂贵的手术。有没有办法在多个客户端之间“共享”生成器?似乎tee可以做到,但是我必须提前知道我想要多少个独立的生成器。

这个想法是,在其他使用反应性扩展(RxJava,RxSwift)“共享”流的语言(Java,Swift)中,我可以方便地在客户端上复制该流。我想知道如何在Python中做到这一点。

注意:我正在使用asyncio

python generator python-asyncio

19
推荐指数
1
解决办法
637
查看次数

使用前瞻与发电机

我在Python中实现了一个基于生成器的扫描程序,它将字符串标记为表单的元组(标记类型,标记值):

for token in scan("a(b)"):
    print token
Run Code Online (Sandbox Code Playgroud)

会打印

("literal", "a")
("l_paren", "(")
...
Run Code Online (Sandbox Code Playgroud)

下一个任务意味着解析令牌流,为此,我需要能够从当前的一个项目前面查看一个项目,而不必将指针向前移动.事实上,迭代器和生成器不能一次提供完整的项目序列,但是每个项目根据需要使得前瞻与列表相比有点棘手,因为除非__next__()被调用,否则下一个项目是未知的.

什么可以直接实现基于生成器的前瞻看起来像?目前我正在使用一种解决方法,这意味着从生成器中生成一个列表:

token_list = [token for token in scan(string)]
Run Code Online (Sandbox Code Playgroud)

然后很容易通过以下方式实现前瞻:

try:
    next_token = token_list[index + 1]
except: IndexError:
    next_token = None
Run Code Online (Sandbox Code Playgroud)

当然这只是工作正常.但是考虑到这一点,我的第二个问题就出现了:首先是否真的需要制造scan()发电机?

python generator lookahead

18
推荐指数
3
解决办法
3321
查看次数

如何重命名模型

我在开发早期犯了一个错误,并用复数名词(Users而不是User)命名我的一个模型.有没有一种简单的方法来重命名它和相应的控制器(类似于生成script/generate方式)?

rename ruby-on-rails generator

18
推荐指数
1
解决办法
1万
查看次数

Python生成器,将另一个可迭代组合成N组

我正在寻找一个可迭代i和大小的函数,n并产生长度n为连续值的元组i:

x = [1,2,3,4,5,6,7,8,9,0]
[z for z in TheFunc(x,3)]
Run Code Online (Sandbox Code Playgroud)

[(1,2,3),(4,5,6),(7,8,9),(0)]
Run Code Online (Sandbox Code Playgroud)

标准库中是否存在这样的功能?

如果它作为标准库的一部分存在,我似乎无法找到它并且我已经没有用于搜索的术语.我可以自己写,但我宁愿不写.

python generator std

18
推荐指数
2
解决办法
7457
查看次数

有没有办法测试一个闭包是否也是一个发电机?

我正在使用一个PHP类,它需要接受多种类型的迭代器并将它们包含在统一的包装器中.我需要支持的一种迭代器(并且可以!)是一个包含yield关键字的匿名函数 - 本质上是一个匿名生成器.

有没有办法在PHP中测试匿名函数是否是生成器?以下是我尝试过的方法列表(旨在显示输出,而不是我如何使用它们):

$anon = function() { yield 1; yield 2; };   // build anonymous generator
gettype($anon);                             // "object"
$anon instanceof \Traversable;              // 0
$anon instanceof \Iterable;                 // 0
$anon instanceof \IteratorAggregate;        // 0
$anon instanceof \Generator;                // 0
$anon instanceof \Closure;                  // 1 -- but doesn't tell me whether or not the closure is actually generator

$anon = $anon();                            // invoke, then run the same checks
gettype($anon);                             // "object"
$anon instanceof \Traversable;              // 1 (!!!)
$anon instanceof \Iterable; …
Run Code Online (Sandbox Code Playgroud)

php closures yield generator

18
推荐指数
1
解决办法
1327
查看次数

ES6生成器:来自iterator.throw的错误堆栈跟踪(错误)

ES-6 iterator.throw(err)方法通常被描述为注入异常,就好像它发生在yield生成器中的语句中一样.问题是此异常的堆栈跟踪不包含对yield语句的文件/行的任何引用,甚至不包含它所在的函数.相反,堆栈跟踪似乎只在构造异常对象时生成,哪个不在里面generator.

问题是:如何在堆栈跟踪中获取有问题的yield语句的位置?

function* one_of_many_generators() {
    // ...
    yield ajax(url);    // <-- what I need in the stack trace
    // ...
}

function outer() {
    var iterator = one_of_many_generators();
    iterator.next();    // runs to the first yield

    // inject exception at the yield statement
    iterator.throw(Error("error"));   // <-- top of stack trace shows here
}
Run Code Online (Sandbox Code Playgroud)

虽然这个问题不是特定的Promises,但它们可能更容易描述问题.就我而言,我正在使用具有生成器和承诺的任务系统.假设函数ajax()返回Promise,如果拒绝,则使用此机制将错误转换为yield语句中的throw.

调试器中的堆栈跟踪非常无用,因为我找不到获取yield statement此注入发生位置的函数,文件或行号的方法.调用iterator.throw(err)被视为重新抛出,并且不会获得新的堆栈信息,因此它只显示ajax()函数内部可以从许多地方调用的位置,并且通过outer()像上面的示例中那样抛出新错误,相同的抛出线显示对于所有错误.两者都没有给出generator关于调试错误所执行的函数的提示. …

javascript ajax yield generator ecmascript-6

18
推荐指数
1
解决办法
737
查看次数

Keras - fit_generator()中如何使用批次和时期?

我有一个8000帧的视频,我想在每个200帧的批次上训练一个Keras模型.我有一个帧生成器,逐帧循环通过视频,并将(3 x 480 x 640)帧累积成一个X形状的numpy矩阵(200, 3, 480, 640)- (批量大小,rgb,帧高,帧宽) - 并且产生XY每第200帧:

import cv2
...
def _frameGenerator(videoPath, dataPath, batchSize):
    """
    Yield X and Y data when the batch is filled.
    """
    camera = cv2.VideoCapture(videoPath)
    width = camera.get(3)
    height = camera.get(4)
    frameCount = int(camera.get(7))  # Number of frames in the video file.

    truthData = _prepData(dataPath, frameCount)

    X = np.zeros((batchSize, 3, height, width))
    Y = np.zeros((batchSize, 1))

    batch = 0
    for frameIdx, truth in enumerate(truthData): …
Run Code Online (Sandbox Code Playgroud)

python generator keras tensorflow

18
推荐指数
2
解决办法
1万
查看次数

生成器表达式使用生成器生成后分配的列表

我找到了这个例子,我无法理解为什么它无法预测?我认为它必须输出[1, 8, 15][2, 8, 22].

array = [1, 8, 15]
g = (x for x in array if array.count(x) > 0)
array = [2, 8, 22]
print(list(g))


>>>[8]
Run Code Online (Sandbox Code Playgroud)

python expression generator

18
推荐指数
2
解决办法
829
查看次数