我正在学习二郎,我偶然发现了一些我无法理解的行为.拿这段代码.(我知道我正在编程的是现有的库,但正如我所说,我这样做是出于教育目的):
-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) 我试图标记字符串.只要没有引用字符一切都很好:
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) 使用默认值初始化记录的常见做法是什么,除非明确指定这些记录?
为了说明我的问题,请使用以下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) 我在 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。
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中的对数? (最好不要自己实施)
我在文件中有一些二进制数据,并将文件加载到内存中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)
甚至是完全不同的东西?
我的问题主要是因为我对"记忆对齐","词边界"等有一些模糊的回忆......
这是我的一段代码:(我要做的是:在我的主类中定义一个方法"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) 我是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) 鉴于这两个片段:
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表达式比函数定义更糟?这些特别简单.
以下代码按预期工作:
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)
这篇文章不是关键字nonlocal或global关键字.
当我用我的用户运行这里描述的脚本时,一切都很顺利:
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上.
我正在研究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)
显然,正如我所说,它有效.这真的让我很烦,因为我无法弄清楚除了聪明并且在第二个中使用更少的线之外,两者之间的区别.我不明白为什么输出不同.为什么输出不同?
我需要从字符串中减去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