小编Hyp*_*eus的帖子

记录模式

我正在学习二郎,我偶然发现了一些我无法理解的行为.拿这段代码.(我知道我正在编程的是现有的库,但正如我所说,我这样做是出于教育目的):

-module (codec).
-compile (export_all).
-record (node, {symbol, weight, order, left, right, parent} ).
-record (tree, {root, nodes} ).

highestOrderForWeight (Weight, Tree) ->
    lists:max ( [Node#node.order || Node <- Tree#tree.nodes, Node#node.weight == Weight] ).

swapMaybe (Node, Tree) ->
    case highestOrderForWeight (Node#node.weight, Tree) of
        Node#node.order -> pass; 
        Node#node.parent -> pass;
        Tree#tree.root -> pass;
        Partner -> io:format ("Swapping ~p with ~p.~n", [Node#node.order, Partner] )
    end.
Run Code Online (Sandbox Code Playgroud)

编译器对我的代码一无所知:

./so.erl:11: illegal pattern
./so.erl:12: illegal pattern
./so.erl:13: illegal pattern
error
Run Code Online (Sandbox Code Playgroud)

在模式中消化记录显然有些麻烦,因为当我将我的代码更改为这种笨拙的解决方案时,它编译得很好:

swapMaybe2 (Node, Tree) ->
    [Order, …
Run Code Online (Sandbox Code Playgroud)

erlang design-patterns record

4
推荐指数
1
解决办法
4437
查看次数

Tokenize引用字符串

我试图标记字符串.只要没有引用字符一切都很好:

string:tokens ("abc def ghi", " ").
["abc","def","ghi"]
Run Code Online (Sandbox Code Playgroud)

但字符串:tokens/2确实对引用字符串有很大帮助.它的行为符合预期:

string:tokens ("abc \"def xyz\" ghi", " ").
["abc","\"def","xyz\"","ghi"]
Run Code Online (Sandbox Code Playgroud)

我需要的是一个函数,它将字符串标记化,分隔符和引号字符.就像是:

tokens ("abc \"def xyz\" ghi", " ", "\"").
["abc","def xyz","ghi"]
Run Code Online (Sandbox Code Playgroud)

在我开始重新发明轮子之前,我的问题是:

标准库中是否有这样的功能或类似功能?

编辑:

好吧,我编写了自己的实现,但我仍然对原始问题的答案非常感兴趣.到目前为止,这里是我的代码:

tokens (String) -> tokens (String, [], [] ).

tokens ( [], Tokens, Buffer) ->
    lists:map (fun (Token) -> string:strip (Token, both, $") end, Tokens ++ [Buffer] );

tokens ( [Character | String], Tokens, Buffer) ->
    case {Character, Buffer} of
        {$ , [] } -> tokens (String, Tokens, …
Run Code Online (Sandbox Code Playgroud)

erlang tokenize

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

使用默认值初始化记录

使用默认值初始化记录的常见做法是什么,除非明确指定这些记录?

为了说明我的问题,请使用以下python代码:

class Encoder:
    def __init__ (self, minLength = 1, maxLength = 258, maxDistance = 32768):
        self.__minLength = minLength
        self.__maxLength = maxLength
        self.__maxDistance = maxDistance
        self.__window = []
        self.__buffer = []
Run Code Online (Sandbox Code Playgroud)

现在我试图在erlang中做同样的事情,即创建一个具有可覆盖默认值的记录.到目前为止我的解决方案如下:

-record (encoder, {minLength, maxLength, maxDistance, window = [], buffer = [] } ).

init (Options) ->
    case lists:keyfind (minLength, 1, Options) of
        false -> MinLength = 3;
        {minLength, MinLength} -> pass
    end,
    case lists:keyfind (maxLength, 1, Options) of
        false -> MaxLength = 258;
        {maxLength, MaxLength} -> pass
    end, …
Run Code Online (Sandbox Code Playgroud)

erlang default record

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

写入并发日志文件

我在 apache2 上有一个 WSGI 应用程序,它以最简单的方式写入日志文件:

def log (msg):
    with open (LOGFILE, 'a') as f: f.write (msg)
Run Code Online (Sandbox Code Playgroud)

在我的沙箱环境中它运行良好,但我有点担心并发性。如果apache2运行各种线程,我是否需要担心并发问题?我的日志文件可能会被扰乱吗?log (msg)如果另一个线程已经在记录日志,调用可能会失败吗?如果是这种情况,我该如何预防呢?

编辑: 为了测试,我从两个 shell 同时运行两个脚本:

#! /usr/bin/python3.2

def log ():
    with open ('log', 'a') as f:
        f.write ('message from thread A\n')

while (True): log ()
Run Code Online (Sandbox Code Playgroud)

#! /usr/bin/python3.2

def log ():
    with open ('log', 'a') as f:
        f.write ('message from thread B\n')

while (True): log ()
Run Code Online (Sandbox Code Playgroud)

日志文件看起来不错,没有发生错误。我很幸运,或者从两个不同的线程写入同一个文件是否安全。文件系统是ext4。

python logging wsgi apache2

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

Python3:计算复数指数和对数

math.exp() 不适合复杂的数字:

>>> math.exp (math.pi*1j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float
Run Code Online (Sandbox Code Playgroud)

这不会对我造成太大伤害,因为它**按预期工作:

>>> math.e ** (math.pi*1j)
(-1+1.2246467991473532e-16j)
Run Code Online (Sandbox Code Playgroud)

现在的问题是对数.math.log不适用于负数:

>>> math.log(-1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error
Run Code Online (Sandbox Code Playgroud)

(预期结果:(0+3.141592653589793j))

如何计算结果复杂的python中的对数? (最好不要自己实施)

python complex-numbers python-3.x

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

C结构的对齐

我在文件中有一些二进制数据,并将文件加载到内存中char* data.现在我知道,例如在偏移123处开始a struct something.

执行以下操作是否安全

(struct something*) (data + 123) // ??&data [123]??
Run Code Online (Sandbox Code Playgroud)

然后访问结构的成员.或者我应该做些什么

struct something record;
memcpy (&record, data + 123, sizeof (struct something) );
Run Code Online (Sandbox Code Playgroud)

甚至是完全不同的东西?

我的问题主要是因为我对"记忆对齐","词边界"等有一些模糊的回忆......

c pointers memory-alignment word-boundaries

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

如何调用方法作为参数?

这是我的一段代码:(我要做的是:在我的主类中定义一个方法"renamingrule",实例化我的另一个类"renamescript"的实例并调用它的重命名方法作为参数传递我在主类中定义的"renamingrule"方法.在RenamScript类中一切都很好,没有错误,但我不知道如何从我的主类/方法调用脚本类的重命名方法.谢谢)

public class RenameScript2 {

    ...

    public void rename(Method methodToCall) throws IOException, IllegalAccessException, InvocationTargetException {


    try
    {
        ...

            String command = "cmd /c rename "+_path+"\\"+"\""+next_file+"\" "
                    +"\""+methodToCall.invoke(next_file, next_index)+"\"";
            p = Runtime.getRuntime().exec(command);

    }catch(IOException e1) {} catch(IllegalAccessException IA1) {}  catch(InvocationTargetException IT1) {} ;


    }//end of rename


} //end of class
//=======================================

public class RenameScriptMain2 {

    public static String RenamingRule(String input, int file_row)
    {
        String output = "renamed file "+(file_row+1)+".mp3";
        return output;
    }

    public static void main(String[] args) throws IOException
    {
        RenameScript2 renamer …
Run Code Online (Sandbox Code Playgroud)

java methods

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

Levenshtein距离成本

我是haskell的新手,我遇到了一个非常严重的性能问题,它必须是我的代码,而不是haskell平台.

我有一个Levenshtein距离(自己的代码)的python实现,我通过(或试图这样做)这个到haskell.结果如下:

bool2int :: Bool -> Int
bool2int True = 1
bool2int False = 0

levenshtein :: Eq a => [a] -> [a] -> Int -> Int -> Int
levenshtein u v 0 0 = 0
levenshtein u v i 0 = i
levenshtein u v 0 j = j
levenshtein u v i j = minimum [1 + levenshtein u v i (j - 1),
    1 + levenshtein u v (i - 1) j,
    bool2int (u !! (i - …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-platform

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

函数定义与Lambda表达式

鉴于这两个片段:

def sex (code):
    return {'m': 'masculino', 'f': 'femenino', '': 'ignorado'} [code]
Run Code Online (Sandbox Code Playgroud)

sex = lambda code: {'m': 'masculino', 'f': 'femenino', '': 'ignorado'} [code]
Run Code Online (Sandbox Code Playgroud)

实际差异是什么?他们有不同的行为吗?

最重要的是:一个人比另一个更受欢迎吗?

我问这个,因为我在这个论坛中的一个答案(python3 - 学习搜索,这个非常简单的例子不能正常工作),它提供了两种可能性,被另一个用户("修订版")截断,删除了lambda术语.修改的原因是最后一个选项(lambda表达式)比函数定义更糟糕.这让我想知道:

为什么lambda表达式比函数定义更糟?这些特别简单.

python

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

Python闭包和变量查找

以下代码按预期工作:

def f():
    def g():
        print(a)
    a = 42
    return g
f()()
Run Code Online (Sandbox Code Playgroud)

ga从它的关闭装载,一切都很好.

现在这个片段失败了UnboundLocalError.

def f():
    def g():
        print(a)
        a = 43
    a = 42
    return g
f()()
Run Code Online (Sandbox Code Playgroud)

看看dis,第一个代码调用LOAD_CLOSURE,第二个没有调用.考虑到这一点,很明显为什么会出现错误.但问题是:

python如何知道何时从闭包或本地范围中绘制变量?(考虑到print(a)先于a = 43.)

这个决定是在编译时做出的吗?(好吧,看起来像它,考虑到print(a)先前a = 43)

这篇文章不是关键字nonlocalglobal关键字.

python closures

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

Erlang导致页面错误

当我用我的用户运行这里描述的脚本时,一切都很顺利:

lorenzo@enzo:~/erlang/pei$ time erl -noshell -smp enabled -S 4 -s fib4 main 10000000

real    0m54.952s
user    1m16.090s
sys 0m0.070s
Run Code Online (Sandbox Code Playgroud)

当我以root身份运行时,它崩溃了:

lorenzo@enzo:~/erlang/pei$ sudo time erl -noshell -smp enabled -S 4 -s fib4 main 10000000
[sudo] password for lorenzo: 
74.68user 0.04system 0:53.56elapsed 139%CPU (0avgtext+0avgdata 66064maxresident)k
0inputs+0outputs (0major+8306minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)

该错误是可重现的.

我的问题是:

  • 有人可以试着解释一下那里发生了什么吗?

  • 这是erlang运行时或我的操作系统的问题吗?

  • 有人能重现这个错误吗?

我正在使用内核在ubuntu natty上运行erlang 5.7.4

Linux enzo 2.6.38-10-generic #46-Ubuntu SMP Tue Jun 28 15:07:17 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

在Phenom X4上.

erlang page-fault

0
推荐指数
1
解决办法
439
查看次数

为什么这个代码仅在我使用'x,y = y,x + y格式而不是'x = y时才有用; y = x + y'?

我正在研究Project euler,尽管如此.我正在编写一个快速代码来打印出Fibonacci序列.我实际上有一个不同的项目eueler方程的代码,但这实际上是我使用的算法:

x = 1
y = 0
while x < 4000000:
    print x
    x = y
    y = x + y
Run Code Online (Sandbox Code Playgroud)

这让我有一段时间了,这本来应该有效.然后我研究了一下,发现几乎相同的代码,但有点不同的格式.它奏效了!唯一的区别是它将x和y赋值放在一行中,用逗号分隔.所以我试了一下:

x , y = 1 , 0
while x < 4000000:
    print x
    x,y = y, x + y
Run Code Online (Sandbox Code Playgroud)

显然,正如我所说,它有效.这真的让我很烦,因为我无法弄清楚除了聪明并且在第二个中使用更少的线之外,两者之间的区别.我不明白为什么输出不同.为什么输出不同?

python variables

0
推荐指数
1
解决办法
86
查看次数

在python中添加和减少24小时的时间?

我需要从字符串中减去5个小时 "03:40"

我尝试过以下方法:

import datetime

timevar = "03:40"
newtime = datetime.datetime.date.strftime("%H:%M", timevar)
newtime = newtime - datetime.timedelta(hours=5)
print newtime
Run Code Online (Sandbox Code Playgroud)

我已经阅读了datetime文档,但我仍然无法看到我做错了什么.

任何帮助非常感谢.
- Hyflex

python datetime strftime strptime python-2.7

0
推荐指数
1
解决办法
1259
查看次数