我今天在node.js聚会,我遇到的人说node.js有es6生成器.他说,这是对回调式编程的巨大改进,并将改变节点格局.Iirc,他说了一些关于调用堆栈和异常的内容.
我查了一下它们,但还没有找到任何以初学者友好的方式解释它们的资源.什么是生成器的高级概述,与回调的不同(或更好?)有何不同?
PS:如果你能提供一段代码来强调常见场景的差异(发出http请求或db调用),那将非常有用.
我用Java8 定义natural了Stream自然数的无限序列()iterator.
IntStream natural = IntStream.iterate(0, i -> i + 1);
natural
.limit(10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
现在,我想用Java8定义它generator.
静态流生成(供应商)
什么是最简单的方法?谢谢.
我正在尝试使用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中实现了一个基于生成器的扫描程序,它将字符串标记为表单的元组(标记类型,标记值):
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()发电机?
我在开发早期犯了一个错误,并用复数名词(Users而不是User)命名我的一个模型.有没有一种简单的方法来重命名它和相应的控制器(类似于生成script/generate方式)?
我正在寻找一个可迭代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)
标准库中是否存在这样的功能?
如果它作为标准库的一部分存在,我似乎无法找到它并且我已经没有用于搜索的术语.我可以自己写,但我宁愿不写.
我正在使用一个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) 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关于调试错误所执行的函数的提示. …
我有一个8000帧的视频,我想在每个200帧的批次上训练一个Keras模型.我有一个帧生成器,逐帧循环通过视频,并将(3 x 480 x 640)帧累积成一个X形状的numpy矩阵(200, 3, 480, 640)- (批量大小,rgb,帧高,帧宽) - 并且产生X和Y每第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) 我找到了这个例子,我无法理解为什么它无法预测?我认为它必须输出[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) generator ×10
python ×5
ecmascript-6 ×2
javascript ×2
yield ×2
ajax ×1
closures ×1
expression ×1
iterator ×1
java ×1
java-8 ×1
keras ×1
lookahead ×1
node.js ×1
php ×1
rename ×1
std ×1
tensorflow ×1