我发现定义函数要求用户定义然后将另一个函数传递给我是一个非常自然的设计模式.例如,
def gradient_descent(x0, grad_f):
x = x0
for _ in range(100):
x -= 0.1 * grad_f(x)
return x
Run Code Online (Sandbox Code Playgroud)
实现通用梯度下降例程; 用户所要做的就是为f定义渐变函数.这基本上是scipy.optimize使用的接口,我编写的程序倾向于以类似的方式使用各种函数闭包和动态定义的函数.
但是,我发现自己在利用多处理的并行性方面遇到了一些严重的困难,因为函数无法被腌制.我知道有很多方法可以解决这个问题,但这让我怀疑这样的编程是否是一种"pythonic"的做事方式.
这是Python中的自然设计模式吗?是否有更好的方法来设计可能需要重构以使用多个流程的程序?
python design-patterns functional-programming multiprocessing
我在网格点z从 2D 函数f中采样了数据x, y,如z = f(x, y).
很容易f用scipy.interp2dvia进行插值f = interp2d(x, y, z)。
但是,评估会f(x, y)返回整个 2D 网格,就好像我已经完成了一样
xx, yy = np.meshgrid(x, y)
f(xx, yy)
Run Code Online (Sandbox Code Playgroud)
我想要的行为是简单地返回 values [f(x[i], y[i]) for i in range(len(x))],我相信这是 numpy 中几乎任何其他方法的行为。
我想要这种行为的原因是我正在寻找f由对沿着“时间”表面描绘的路径(t, u(t))。
np.diag(f(t, u(t)))与 不同也令人惊讶np.array([f(ti, u(ti)) for ti in t]),所以我不清楚如何f(t, u(t))从通过interp2d.
编辑:关于diag,我只是认为我们应该有np.diag(f(t, u(t))) == np.array([f(ti, u(ti)) …
我有一个自定义的变量timer-granularity用于增加/减少定时器的周期每个用户调用像时间(timer-faster)或(timer-slower).但是,如果用户设置timer-granularity为负数,则调用(timer-slower)实际上会使计时器更快!
我想约束这个变量的值,以便尝试将其设置为低于某个阈值的任何值,这是一个错误,例如
(setq timer-granularity 0.3) ;; okay
(setq timer-granularity -1) ;; error!
Run Code Online (Sandbox Code Playgroud)
这种行为是否可以实现?
假设我有一个类型的地图
std::map<int, Node> G;
Run Code Online (Sandbox Code Playgroud)
节点如下
struct Node{
Node(){};
int data;
};
Run Code Online (Sandbox Code Playgroud)
我想使用operator []返回对节点的引用(如果它在地图中),或者创建一个新节点并返回引用(如果不是).这是我对文档说的内容的理解:
如果k匹配容器中元素的键,则该函数返回对其映射值的引用.
如果k与容器中任何元素的键不匹配,则该函数将使用该键插入一个新元素,并返回对其映射值的引用.请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素),这也会将容器大小增加1.
但是,以下代码引发错误(g ++ 5,std = gnu ++ 11):
错误:无法在赋值u_ptr = G [3]中将'std :: map :: mapped_type {aka Node}'转换为'Node*';
Node* u_ptr;
u_ptr = G[3];
Run Code Online (Sandbox Code Playgroud)
在我看过的所有例子中,都G[k]出现在lhs上.G[k]rhs上是不允许的?如果没有,为什么?