python join、map 和 lambda 方法

python join,map and lambda methods

我对 python 很陌生。谁能解释一下这一行

exec("print(' '.join(map(lambda x: s[x::{0}], range({0}))))".format(ceil(sqrt(len(s)))))

s[x::{0}]range({0})) 是什么意思?

下面一段代码有详细介绍吗?

此代码是以下 hackerrank 问题的解决方案: https://www.hackerrank.com/challenges/encryption/problem

#!/bin/python3

import sys
from math import ceil, floor, sqrt


def encryption(s):
    exec("print(' '.join(map(lambda x: s[x::{0}], range({0}))))".format(ceil(sqrt(len(s)))))

if __name__ == "__main__":
    s = input().strip()
    result = encryption(s)

这是您的代码的简化版本,您应该能够遵循:

from math import ceil, sqrt

s = 'hello'

y = ceil(sqrt(len(s)))
# 3

res = ' '.join(map(lambda x: s[x::y], range(y)))
# 'hl eo l'

要点

  • ys 长度的 rounded-up 平方根,在本例中 sqrt(5) 向上取整为 3。
  • lambda 是一个匿名函数,它映射 range(y) 中的每个值,即 0, 1, 2 映射到 s[x::y],即 return 每 y 从索引 x 开始的序列的第一个元素。另见 Understanding Python's slice notationxrange(y).
  • 成员的任意符号
  • 将所有结果值与 space 连接起来形成一个字符串。
  • 在您的原始代码中,{0}str.format 用于在一行中将 y 合并到您的字符串中。在这种情况下,我认为这是令人费解的错误做法。

此行在字符串上使用 format() 函数。 因此,{0} 将被格式函数中的第一个元素替换,即 ceil(sqrt(len(s))))

documetnation 你可以看到 format() 的作用。

在你的例子中:

exec("print(' '.join(map(lambda x: s[x::{0}], range({0}))))".format(ceil(sqrt(len(s)))))

您在两个地方插入了 ceil(sqrt(len(s))) 的结果,即:

lambda x: s[x::ceil(sqrt(len(s)))]

range(ceil(sqrt(len(s))))

现在,exec可以用简单的变量来避免:

def encryption(s):
    var = ceil(sqrt(len(s)))
    print(' '.join(map(lambda x: s[x::var], range(var))))

当使用str.format()方法时(see here),其中的括号和字符将替换为方法中传递的对象。 “0”表示替换为方法中传递的第一个字符。