我有个有趣的问题。我在——因为他妈的傻笑——想很快就写一个程序。我有2条线,但它有比赛条件,我不知道为什么。要点如下:
imports...
...[setattr(__main__, 'f', [1, 2, ..]), reduce(...random.choice(f)...)][1]...
每隔一段时间,就会生成以下异常。但并不总是这样。这就是我的问题。我怀疑执行的顺序不能保证,特别是因为我使用了列表技巧——我假设解释器可以预测setattr()返回None,并且知道我只选择了列表中的第二件事,所以它将实际的setattr()推迟到以后。但它只是偶尔发生。有什么想法吗?CPython是否会自动执行诸如map、filter、reduce调用之类的线程?在
^{pr2}$我尝试过在setattr()中修改globals()和vars(),但这似乎没有帮助(相同的异常序列)。在
以下是实际代码:
import sys,collections as c,random as r,functools as g,__main__ as n
print(" ".join([setattr(n,'f',open(sys.argv[1],"r").read().replace("\n"," ").split(" ")),setattr(n,'m',c.defaultdict(list)),g.reduce(lambda p,e:p+[r.choice(m[p[-1]])],range(int(sys.argv[2])),[r.choice(list(filter(lambda x:[m[x[0]].append(x[1]),x[0].isupper()][1],zip(f[:-1],f[1:]))))[0]])][2]))
如果你好奇的话:这是读入一个文本文件,生成一个马尔可夫模型,然后吐出一个句子。在
好吧,实际上是这样的:在我的句子生成过程中,我有时会碰到文件中的最后一个单词(在某些情况下,根据文件的不同,它没有可能的后继状态)。因此,在这种情况下,我试图从一个空列表中进行选择。在
当然,这是不确定的。如果你非常小心的话,你可以把伪随机数发生器的种子设为常数,希望每次都能产生相同的序列。很有可能奏效。在
^{pr2}$相关问题 更多 >
编程相关推荐