这到底是怎么回事?(Python 3.7.6)

这到底是怎么回事?(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))

我正在研究其他人关于代码战的解决方案,对某些事情有点困惑。以下是原始问题的链接:。归功于原作者,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))
    )
我想我大部分都明白了。除本部分外:

zip(*[iter(strng)]*sz)
我认为以这种方式使用的*表示一个非关键字的可变长度参数列表-这意味着原始字符串(
strng
)中可能有任意数量的片段,它们的长度为
sz
,例如6。
zip()
函数正在接收一些可变数量的iterables,根据文档,这是它所需要的。(对吗?)

因此,
map(''.join,zip(*[iter(strng)]*sz)
首先返回字符串
strng
的迭代器。它在列表内部返回该迭代器。似乎该列表然后乘以
sz
(为什么?),然后通过
map
通过
join
函数传递

问题:

  • 这接近正确吗
  • 为什么国际热核实验堆(strng)必须放在一个列表中
  • 为什么你可以加入
    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

  • 就是这样。

    这是用于解决问题的技术之一。但一般来说,“请向我解释一下这段代码”并不适合堆栈溢出,因为很难理解是什么阻碍了您自己解决问题,而且混淆有多个方面(即,“需要更多关注”).嗨,卡尔,很抱歉。下次我肯定会更专注、更具体。我应该把这篇文章分成几个小问题并单独发布吗?另外,谢谢你的链接;我会仔细看一看。非常感谢,这很清楚。我很感激。