for s in[*open(i:=0)][1:]:i+=1;print(f'Case #{i}:',sum(b'%a'%s)%34)
我无法理解上面的代码..我搜索了一下,现在我知道 open(0) 与 sys.stdin 相同,并且 := 是 warlus 运算符,但我仍然不知道 [1:] 和 sum(b '%a'%s)%34,以及该代码的工作原理。
这是一个更易读的版本:
for s in [*open(i:=0)][1:]:
i += 1
print(f'Case #{i}:', sum(b'%a' % s) % 34)
正如你所说,
open(0)
打开标准输入进行读取。[*open(0)]
将所有标准输入解压到一个列表中,每个条目一行。i:=0
同时也将变量i
初始化为0
;这只是高尔夫代码的简写。[1:]
切片列表以省略第一行。
%a
格式化程序使用ascii
转换行:
[..] 返回包含对象的可打印表示形式的字符串,但使用
、repr()
或\x
转义对\u
返回的字符串中的非 ASCII 字符进行转义。这会生成一个类似于 Python 2 中\U
返回的字符串。repr()
>>> '%a' % 'foobar'
"'foobar'"
使用
b''
字符串可得到 bytes
。bytes
实际上只是整数序列(字节值)。sum
对整数序列求和。% 34
mod-34s 结果:
>>> sum(b'%a' % 'foobar')
711
>>> sum(b'%a' % 'foobar') % 34
31