我正在评估外观和说序列的连续术语(更多关于它的信息:https : //en.wikipedia.org/wiki/Look-and-say_sequence)。
我使用了两种方法并对它们进行计时。在第一种方法中,我只是迭代每个术语来构建下一个。在第二个中,我曾经itertools.groupby()这样做过。时差相当大,所以我做了一个图来玩:
是什么让itertools.groupby()效率如此之高?两种方法的代码如下:
第一种方法:
def find_block(seq):
block = [seq[0]]
seq.pop(0)
while seq and seq[0] == block[0]:
block.append(seq[0])
seq.pop(0)
return block
old = list('1113222113')
new = []
version1_time = []
for i in range(40):
start = time.time()
while old:
block = find_block(old)
new.append(str(len(block)))
new.append(block[0])
old, new = new, []
end = time.time()
version1_time.append(end-start)
Run Code Online (Sandbox Code Playgroud)
方法二:
seq = '1113222113'
version2_time = []
def lookandread(seq):
new = ''
for value, group in itertools.groupby(seq):
new += '{}{}'.format(len(list(group)), …Run Code Online (Sandbox Code Playgroud) 我对python的eval()非常困惑:
我试过eval('"\x27"') == eval('"\\x27"'),它评估为True.有人可以解释为什么会这样吗?两个表达式都评估为"'".我理解为什么eval('"\x27"')(评估的字符串有一个字符,这是一个表示撇号的转义十六进制),但不eval('"\\x27"')应该等于"\\x27"?
其次,加上混乱,如果我设置以下变量,
s = "\x27"
t = "\\x27"
Run Code Online (Sandbox Code Playgroud)
然后eval('s')又是"'",但是eval('t')是"\\x27".这是为什么?
我正在阅读官方的Python教程,它说
一个特定的模块值得注意:sys,它内置于每个Python解释器中.
但是,如果我启动python解释器并输入,例如sys.path,我得到了一个NameError: name sys is not defined.
因此,sys如果我想要访问它,我需要导入.
那么它是什么意思"它内置于每个python解释器中"?
我有以下代码:
string promptPlayerForFile(ifstream &infile, string prompt) {
while (true) {
string filename;
cout << prompt;
getline(cin, filename);
infile.open(filename.c_str());
if (!infile.fail()) return filename;
infile.clear();
cout << "Unable to open that file. Try again." << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
该函数按预期工作:输入文件名,直到给出正确的文件名,在这种情况下,它将流与文件关联并返回文件名字符串.
然后我尝试评论该行infile.clear(),看看会发生什么.(我读到在发生故障后需要包含它才能重置流的相关位.)
但是,在对此进行注释后,该函数的行为与以前一样.如果我首先给出一个错误的文件名,然后一个正确的文件名就可以了,所以即使没有那行,故障位也会被重置.那么infile.clear()有必要,它的适当用途是什么?