这到底是怎么回事?(Python 3.7.6)
我正在研究其他人关于代码战的解决方案,对某些事情有点困惑。以下是原始问题的链接:。归功于原作者,falsetru 以下是解决方案:这到底是怎么回事?(Python 3.7.6),python,iterator,iterable,keyword-argument,variable-length,Python,Iterator,Iterable,Keyword Argument,Variable Length,我正在研究其他人关于代码战的解决方案,对某些事情有点困惑。以下是原始问题的链接:。归功于原作者,falsetru 以下是解决方案: def revrot(strng, sz): return ''.join( chunk[1:] + chunk[:1] if sum(int(d)**3 for d in chunk) % 2 else chunk[::-1] for chunk in map(''.join, zip(*[iter(strng)]*sz))
def revrot(strng, sz):
return ''.join(
chunk[1:] + chunk[:1] if sum(int(d)**3 for d in chunk) % 2 else chunk[::-1]
for chunk in map(''.join, zip(*[iter(strng)]*sz))
)
我想我大部分都明白了。除本部分外:
zip(*[iter(strng)]*sz)
我认为以这种方式使用的*表示一个非关键字的可变长度参数列表-这意味着原始字符串(strng
)中可能有任意数量的片段,它们的长度为sz
,例如6。zip()
函数正在接收一些可变数量的iterables,根据文档,这是它所需要的。(对吗?)
因此,map(''.join,zip(*[iter(strng)]*sz)
首先返回字符串strng
的迭代器。它在列表内部返回该迭代器。似乎该列表然后乘以sz
(为什么?),然后通过map
通过join
函数传递
问题:
zip
的结果?我试着加入('m',)
作为一种测试,但得到了'm'
。我不明白为什么这样做也有效谢谢。我还是Python的晚期初学者,所以我非常感谢您的帮助!(即使只是我的一个问题!)为了理解发生了什么,我们想分析一下这个语句
for chunk in map(''.join, zip(*[iter(strng)]*sz))
由内而外:
iter(strng)
返回一个迭代器,每次使用next
或循环访问该迭代器时,该迭代器消耗strng
的元素(字符)并返回所述元素[iter(strng)]
是一个列表,其唯一元素是迭代器[iter(strng)]*sz
是sz
列表副本的串联,[iter(strng),…,iter(strng)]
包含sz
次相同的迭代器对象,我的意思是字面上相同的迭代器对象*[iter(strng)]*sz
相当于*[iter(strng),…,iter(strng)]
并且,当在函数参数列表中使用时,解压其内容:函数将其参数列表视为(iter(strng),…,iter(strng))
zip(*[iter(strng)]*sz)
因此相当于zip(iter(strng),…,iter(strng))
zip
获取每个参数的第一个元素,并将它们放在元组中,但因为对iter
的各种引用都引用了相同的iter(strng)原始实例
由zip
返回的第一个元组包含strng
的第一个sz
字符,第二个元组包含sz+1
到2*sz
字符等'.join()
的参数,因此我们有一系列字符串,每个字符串长sz
个字符,跨越原始strng
就是这样。这是用于解决问题的技术之一。但一般来说,“请向我解释一下这段代码”并不适合堆栈溢出,因为很难理解是什么阻碍了您自己解决问题,而且混淆有多个方面(即,“需要更多关注”).嗨,卡尔,很抱歉。下次我肯定会更专注、更具体。我应该把这篇文章分成几个小问题并单独发布吗?另外,谢谢你的链接;我会仔细看一看。非常感谢,这很清楚。我很感激。