繁体   English   中英

试图了解Python地图

[英]Trying to understand Python maps

在我的编程经验之前,我还没有真正使用过maps ,所以我无法理解更complex versions of maps 所以让我们说问题是你得到一个整数分钟,在这种情况下n = 808 你用这个号码做的是把它转换成24 hour time ,所以hh:mm 这会给你13:28 完成此操作后,将该时间的数字相加以获得答案。 所以, answer would be 14 我看到了这个解决方案的一个非常好的单行,我试图理解它,因为我的解决方案需要大约5 more lines of code

这是解决方案:

sum(map(int, str(n // 60 * 100 + n % 60)))

所以我理解地图在数字迭代中应用相同的函数,但是throws me off is the int,str(...) part 我不确定幕后会发生什么。

这里使用了两个数学运算符:

  • //表示分割,即分割后提取结果的整数部分。
  • %表示模量,即除法后的余数。

因此,对于n = 808 ,算法返回:

str(808 // 60 * 100 + 808 % 60) = str(13 * 100 + 28) = '1328'

map(int, '1328')然后获取字符串'1328'中的每个字符并将其转换为整数,它本身返回一个可迭代的。 map需要一个iterable作为其第二个(和后续)参数。 可以迭代字符串以一次提取一个字符。

最后, sum获取从map返回的每个整数并将它们加在一起。

通过与生成器表达式sum ,可以得到逻辑的等效公式:

sum(int(i) for i in str(n // 60 * 100 + n % 60))

如你所说, map可以在一个iterable上应用一个函数。

所以,当你这样做的时候

map(int, str(n // 60 * 100 + n % 60))

您在iterable str(n // 60 * 100 + n % 60)上使用了int函数str(n // 60 * 100 + n % 60) 您可能知道,字符串是可迭代的(因为,当然,您可以迭代它们) - 可以轻松检查

for char in "abcd":
    print(char)

a
b
c
d

str(n // 60 * 100 + n % 60)的回报是'1328' int应用于每个char时,将每个char转换为整数。 你可以很容易地看到这一点,而不是立即拿走sum ,得到一个lsit

list(map(int, str(n // 60 * 100 + n % 60)))

[1, 3, 2, 8]

我想现在很容易看到sum将得到这些数字的总和,这是你想从一开始:)

int()str()都是函数。 在该特定示例中,当n=808时, str()函数的参数被计算为1328,其在转换为字符串时变为'1328' 字符串是可迭代的,因此map函数只是将int应用于字符串的每个字符,从而生成序列[1,3,2,8]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM