从这个链接它说生成器不像迭代器那样初始化。
如何将生成器的元素添加到集合中?有没有比只是一种for item in generator东西和使用更好的方法setname.add(item)?
生成器是cursor.execute("SELECT ...")从连接到 sqlite3 数据库的命令返回到游标的。
在我的报道中,我对以下案例感到头疼(python 3.4)
def simple_gen_function(str_in, sep=""):
if sep == "":
yield str_in[0]
for c in str_in[1:]:
yield c
else:
return str_in
# yield from str_in
str_in = "je teste "
t = "".join(simple_gen_function(str_in))
p = "".join(simple_gen_function(str_in, "\n"))
print("%r %r" % (t, p))
# 'je teste' ''
Run Code Online (Sandbox Code Playgroud)
在生成器中使用 return ,在使用时没有“达到”回报yield from str_in我有预期的结果。
这个问题看起来很简单,但我相信在生成器中使用 return 是可以实现的。
在阅读了文档、问题并制作了我自己的测试代码后,我相信我已经理解了 ayield expression是如何工作的。
尽管如此,我对以下示例代码的行为感到惊讶:
def gen(n=0):
while True:
n = (yield n) or n+1
g=gen()
print( next(g) )
print( next(g) )
print( g.send(5) )
print( next(g) )
print( next(g) )
Run Code Online (Sandbox Code Playgroud)
我原以为它会返回 0, 1, 2, 5, 6,而它会产生:0, 1, 5, 6, 7。
即:我原以为会yield expression产生这些效果:
yield expression,并将其返回给调用者send()并将它们用作生成器函数代码接收的 yield 表达式的值next(g)或g.send()调用...和/或 Python 会注意避免 (1) 和 (2) 中的两个信息流之间的任何干扰,即保证它们是独立的,例如在元组分配中 a, b = f(a,b), g(a,b)
(我什至想知道在 (1) 和 (2) 之间进行暂停是否更好,但也许它会非常复杂,因为这意味着仅执行部分语句,其余部分保留用于下一份简历)
无论如何,操作的顺序是(2),然后(1),然后(3),因此(2)中的赋值发生在之前,并且可以影响(1)中的赋值。即g.send() …
我正在尝试使用 redux-saga 生成器实现一个队列处理程序来管理通知。
基本上,我需要在通知进入队列时按顺序显示通知。
为此,我queue在 redux 存储中有一个数组,一个QUQUE_NOTIFICATION添加到队列和SHOW_NOTIFICATION删除队列通知的操作。
我目前的传奇实现就是这么简单:
export function* watchQueue() {
while (true) {
const state = yield select()
const queue = state.queue
if (queue.length > 0) {
yield put({ action: 'SHOW_NOTIFICATION', queue[0])
}
yield call(delay, 5000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当前实现的问题在于,当队列为空时QUQUE_NOTIFICATION,调度生成器可能会等待延迟完成。
但是,我想在它进入队列后立即显示第一个通知。有任何想法吗?
当我使用生成器时,我一直在努力让 koa 响应请求。我写了一个 test.js 应用程序来演示这一点。
var koa = require('koa');
var app = new koa();
var Router = require('koa-router');
var router = new Router();
router.get('/', function *(next){
this.body = "hello world";
console.log("success")
});
app.use(router.routes())
app.use(router.allowedMethods());
app.listen(3000);
console.log("listening on 3000");
Run Code Online (Sandbox Code Playgroud)
我用 node v4.6.1 运行服务器
没有发生错误,但是当我发送 get 请求时,我得到Not Found并且没有控制台日志。
这段代码虽然有效:
var koa = require('koa');
var app = new koa();
var Router = require('koa-router');
var router = new Router();
router.get('/', function (ctx){
ctx.body = "hello world";
console.log("success")
});
app.use(router.routes())
app.use(router.allowedMethods());
app.listen(3000);
console.log("listening …Run Code Online (Sandbox Code Playgroud) 我正在尝试自定义 rails 默认脚手架生成器。对于视图,我可以通过简单地在 下添加文件来做到这一点:lib/templates/erb/scaffold/
在这里,我添加了 index.html.erb 并进行了自定义,但我想更改此命令生成的模型:
rails g scaffold model
Run Code Online (Sandbox Code Playgroud)
我曾尝试将文件添加到 lib/templates/rails/model/model_generator.rb
使用这样的代码:
module Rails
module Generators
class ModelGenerator < NamedBase #metagenerator
argument :attributes, :type => :array, :default => [], :banner => "field[:type][:index] field[:type][:index]"
hook_for :orm, :required => true
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是在这方面我什么都不需要帮助,我需要覆盖什么文件以及我需要放置在哪里。
假设我有一个函数,我想选择是否返回结果。这很容易编码:
def foo(N, is_return=False):
l = []
for i in range(N):
print(i)
if is_return:
l.append(i)
if is_return:
return l
Run Code Online (Sandbox Code Playgroud)
但是现在可以说我希望该函数成为一个生成器。我会写这样的东西:
def foo_gen(N, is_return=False):
for i in range(N):
print(i)
if is_return:
yield i
Run Code Online (Sandbox Code Playgroud)
所以大概 when is_returnis Falsethenfoo_gen只是一个没有返回值的函数, when is_returnisTrue foo_gen是一个生成器,我希望有两个不同的调用:
In [1]: list(foo_gen(3, is_return=True))
0
1
2
Out[2]: [0, 1, 2]
Run Code Online (Sandbox Code Playgroud)
因为当它是一个生成器并且您必须遍历产生的值时,并且:
>>> In [2]: foo_gen(3)
0
1
2
Run Code Online (Sandbox Code Playgroud)
因为当它不是生成器并且它只是具有副作用并且您不必遍历它时。但是,后一种行为不起作用,而只是返回生成器。你不能从中得到任何东西:
In [3]: list(foo_gen(3, is_return=False))
0
1
2
Out[3]: []
Run Code Online (Sandbox Code Playgroud)
但这并不是很好,并且对于那些不希望必须遍历任何内容以产生副作用的 API 用户来说是令人困惑的。
反正有没有In …
我认为“for in”语句接受迭代器而不是迭代器,但不知何故,以下代码工作正常。我很迷惑。实际上,我正在查看以下位置的生成器示例:https : //www.python.org/dev/peps/pep-0289/
>>> for i in range(10):
print(i)
0
1
2
3
4
5
6
7
8
9
>>> for i in iter(range(10)):
print(i)
0
1
2
3
4
5
6
7
8
9
>>>
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释在 for 循环中使用 iter(range(10)) 时发生了什么?
我想训练一个卷积网络来解决图像数据上的多类、多标签问题。由于数据的性质和原因,我就不告诉你,这将是最好的,如果我可以使用自定义[R生成函数进料fit_generator命令,而其内置的image_data_generator和flow_images_from_directory命令(这点我是能够成功开始工作,而不是针对这个特定问题)。
在这里(https://www.rdocumentation.org/packages/keras/versions/2.2.0/topics/fit_generator)它说我可以做到这一点,而无需提供任何示例。所以我尝试了以下方法。这是我正在尝试做的一个极其精简的示例(此代码完全自包含):
library(keras)
library(reticulate) #for py_iterator function
play.network = keras_model_sequential() %>%
layer_dense(units = 10, activation = "relu", input_shape = c(10)) %>%
layer_dense(units = 1, activation = "relu")
play.network %>% compile(
optimizer = "rmsprop",
loss = "mse"
)
mikes.custom.generator.function = function() #generates a 2-list of a random 1 x 10 array, and a scalar
{
new.func = function()
{
arr = array(dim = c(1,10))
arr[,] = sample(1:10, 10, replace = TRUE)/10
return(list(arr,runif(1)))
} …Run Code Online (Sandbox Code Playgroud) 阅读 Python 中的一些新风格观点,并开始从生成器StopIteration到return生成器的转变。我的主要问题是这在自定义生成器中应该如何工作。我有一个类,我__next__直接覆盖了方法,因为我必须添加一些逻辑来跟踪生成。
下面非常接近我正在做的事情,包含所有关键元素。请注意,我实际上并不是在创建一个复制列表的生成器,只是将其作为一个最小的示例。
class Test():
items = <list>
def __init__(self):
self.index = 0
def __next__(self):
if self.index >= len(self.items):
raise StopIteration
value = self.items[self.index]
self.index += 1
return value
def reset(self):
self.index = 0
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,我会遍历一个列表,直到它耗尽,然后下游调用将决定是重置生成器还是在耗尽后继续。但是,StopIteration由于它已被弃用,我如何在不使用的情况下启用这样的功能?使用returnhere 来提高 a的标准建议StopIteration似乎并不适用,我真的宁愿不更改下游代码来检查生成器产量Nones
那我应该在这里做什么?是StopIteration例外还是可以接受的__next__?
generator ×10
python ×6
exception ×1
for-loop ×1
image ×1
iterator ×1
javascript ×1
keras ×1
koa ×1
koa-router ×1
python-3.x ×1
r ×1
redux ×1
redux-saga ×1
scaffold ×1
set ×1
yield ×1