[英]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.