小编zel*_*ell的帖子

python中的默认舍入模式,以及如何将其指定为另一个?

Python中的默认舍入模式(舍入到最近等)是什么?我们如何指定它?

python floating-point rounding

7
推荐指数
2
解决办法
2612
查看次数

重写Crenshaw的"让我们构建一个编译器"的设计模式?

我正在重写Jack Crenshaw的"让我们构建一个编译器"从Turbo Pascal 4.0到JAVA.这是激励因为经典书籍还没有OO版本

是否有更现代的OO版"让我们构建一个编译器"?

这本书包含15章.编译器以递增方式呈现:第一章提供整个编译器的样板代码,然后每章为前一章的Pascal过程添加一些行.

我已经翻译了前两章,每章作为一个包,每个Pascal过程作为JAVA中的静态保护方法,一章的过程被收集在一个类中,扩展了从其先前章节翻译的类.

package td1;
public class Cradle {
    protected final static char TAB='\t';
    protected static char look;

    protected static void getChar() throws IOException {
        look=(char) System.in.read();
        }       
 ...
}

package td2;

public class Cradle extends td1.Cradle{

    protected static void factor() throws IOException {
    ...
    }

...
}
Run Code Online (Sandbox Code Playgroud)

但是,当我来到td3时,我必须更新td2.Cradle的因子(),但我不想在td2.Cradle中更改因子(),因为这会使得td2中的factor()做的比它应该在td2中呈现.我想到了"扩展"td2.Cradle(),但是,扩展静态类似乎是不可能的.

我的相关问题在这里

也许我应该将每个静态方法更改为非静态方法?

我当然需要一些设计模式,任何人都可以提供帮助吗?我希望我很清楚.总之,这个项目逐步为每个过程提供越来越多的指令,我希望使用一些JAVA机制(如继承)来记录中间步骤.

Pascal代码是LBC的经典书籍.我觉得尝试使用继承,因为

  1. 每章调用/添加更多行到前面章节中定义的过程
  2. 我希望让我的JAVA源代码对每个想要一步一步遵循LBC的人都有用.因此,使用单个类来放入作者编译器的最终源代码是不合适的.必须按章节分割代码,然后像Crenshaw那样逐渐增加代码.

我的实际解决方案是将tp1.Cradle的方法保持为静态.tp2.Cradle,tp3.Cradle,...中的方法,直到tp15.Cradle将是非静态的,它们都静态导入 tp1.Cradle.*.此外,对于大于2的每个整数,tp [i] .Cradle 扩展 tp [i-1] .Cradle.

不要犹豫,告诉我更好的解决方案.

java project-management design-patterns

6
推荐指数
1
解决办法
530
查看次数

键入Ocaml的一个奇怪的例子

很奇怪,这个ocaml片段是由顶层键入的.查看结构,如果g的类型为int-> int,如顶层所示h x = g x,则结构的一部分将无法进行类型统一.那么任何人都可以澄清一下吗?

module Mymodule : sig
  val h:int ->int
  val g: string-> string
end = struct
  let g x = x
  let h x = g x
end
Run Code Online (Sandbox Code Playgroud)

这是topelevel的回应:

  module Mymodule : sig val h : int -> int val g : string -> string end
Run Code Online (Sandbox Code Playgroud)

ocaml typing

6
推荐指数
2
解决办法
264
查看次数

将char [] []转换为char**

我有一个 char[][]

  char c[2][2]={
    {'a','b'},
    {'c','d'}
  };
Run Code Online (Sandbox Code Playgroud)

我该怎么把它转换成char**

这里的目标是使用转换char**为主函数的输入,该函数仅接受char**作为其输入.两种C/C++解决方案都是可以接受的.

c c++ arrays pointers

6
推荐指数
1
解决办法
2327
查看次数

如何加速 numpy.all 和 numpy.nonzero()?

我需要检查一个点是否位于边界长方体内。长方体的数量非常大(~4M)。我想出的代码是:

import numpy as np

# set the numbers of points and cuboids
n_points = 64
n_cuboid = 4000000

# generate the test data
points = np.random.rand(1, 3, n_points)*512
cuboid_min = np.random.rand(n_cuboid, 3, 1)*512
cuboid_max = cuboid_min + np.random.rand(n_cuboid, 3, 1)*8

# main body: check if the points are inside the cuboids
inside_cuboid = np.all((points > cuboid_min) & (points < cuboid_max), axis=1)
indices = np.nonzero(inside_cuboid)
Run Code Online (Sandbox Code Playgroud)

在我的电脑上运行需要 8 秒,运行需要 np.all3 秒np.nonzero。有什么想法可以加快代码速度吗?

python numpy

6
推荐指数
1
解决办法
122
查看次数

对于这种嵌套的let-in的ocaml缩进样式

我正在阅读关于Ocaml嵌套版本的Ocaml Style指南.

http://www.seas.upenn.edu/~cis341/programming_style.html#16

有人建议

缩进嵌套的let表达式:嵌套的let表达式的代码块不应缩进.坏:

   let x = exp1 in
      let y = exp2 in
        x + y
Run Code Online (Sandbox Code Playgroud)

好:

   let x = exp1 in    
   let y = exp2 in
       x + y
Run Code Online (Sandbox Code Playgroud)

但是,你怎么看待如何缩进我的下一个程序.

let f = 
  let g = 3 in
    g + 2 
Run Code Online (Sandbox Code Playgroud)

上面的内容由emacs缩进.但显然,这些emacs的缩进违反了我之前引用的风格指南.要遵循这种风格,不应该更像这个吗?

let f = 
  let g = 3 in
  g + 2 
Run Code Online (Sandbox Code Playgroud)

谢谢你的想法.

@Gilles:在我目前的默认图阿雷格模式中,我得到了这样的缩进,这与你的不同

let f = 
  let g = 3 in
  let h = 4 in
    g + 2 
Run Code Online (Sandbox Code Playgroud)

你能解释我应该采取哪种配置来使你的图阿雷格模式缩进吗?

emacs ocaml coding-style nested

5
推荐指数
1
解决办法
1214
查看次数

Java:创建一个以字母为索引的数组

是否有可能在Java中创建一个由字母字符('a'到'z')而不是整数索引的数组?

使用这样的数组"a",我想以这种方式使用,例如

print (a['a']);
Run Code Online (Sandbox Code Playgroud)

java arrays indexing

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

使用git clone时错误的数字配置值

每当我使用时git clone,我都会收到此信息.我该怎么办?

fatal: bad numeric config value '5242880000' for 'http.postbuffer': out of range
Run Code Online (Sandbox Code Playgroud)

git macos

5
推荐指数
1
解决办法
1885
查看次数

多处理时不调用回调

我花了一整天时间来调试以下代码。这是关于多处理的。请看一下。

import numpy as np
import multiprocessing as mp


def printHello(x):
    print "ENTERING: printHello"
    time.sleep(2)
    print "QUITTING: printHello"
    return 'hello '+x

def log_result(result):
    print "ENTERING: log_result"
    time.sleep(2)
    print "QUITTING: log_result"

def main_multi():
    pool = mp.Pool()
    for i  in range(3):
        pool.apply_async(printHello, args=(i, ), callback=log_result)
    pool.close()
    pool.join()

if __name__=='__main__':
    print "ENTERING __main__"
    main_multi()
    print "QUITTING __main__"
Run Code Online (Sandbox Code Playgroud)

我以为我会在输出行中得到“退出:printHello”,“进入:log_result”和“退出:printHello”。对我来说,奇怪的是,主程序停止时,printHello尚未完成(没有打印出“ hello”);“ pool.join”语句似乎以某种方式被忽略。也许上面的“回调”或“ apply_async”无法按我预期的方式工作。任何的想法?

我的控制台的输出是:

ENTERING __main__
ENTERING: printHello
ENTERING: printHello
ENTERING: printHello
QUITTING __main__ 
Run Code Online (Sandbox Code Playgroud)

[编辑]有趣的是,如果我删除“ time.sleep(2)”部分,则会得到

ENTERING __main__
ENTERING: printHello
QUITTING: printHello
ENTERING: printHello
QUITTING: …
Run Code Online (Sandbox Code Playgroud)

python asynchronous multiprocessing

5
推荐指数
1
解决办法
583
查看次数

如何获得Python long double literal?

如何获得Python long double literal?我试过了

numpy.longdouble(1e309)
Run Code Online (Sandbox Code Playgroud)

numpy.longdouble("1e309")
Run Code Online (Sandbox Code Playgroud)

但他们俩都回来了inf.这样做的正确方法是什么?

[ 编辑 ]下面的答案说,在某些平台上,长双倍被视为双重.在我的系统上并非如此.为了表明这一点,我尝试过:

np.longdouble(2.0)**1029
Run Code Online (Sandbox Code Playgroud)

在我的系统上(Mac OS 10.11).它回来了

5.7526180315594109047e+309
Run Code Online (Sandbox Code Playgroud)

[ EDIT2 ]正如所建议的那样,我只是尝试过

 np.finfo(np.longdouble)
Run Code Online (Sandbox Code Playgroud)

这使

 finfo(resolution=1e-18, 
       min=-1.18973149536e+4932, 
       max=1.18973149536e+4932, 
       dtype=float128)
Run Code Online (Sandbox Code Playgroud)

在我的操作系统上 有关信息,我的numpy版本是1.10.1.

python numpy long-double

5
推荐指数
1
解决办法
3469
查看次数