sum()函数是否会增加值?

时间:2016-12-22 08:19:41

标签: python

有这个“别给我五个!”关于代码战的kata。 (https://www.codewars.com/kata/dont-give-me-five/train/python)。

这就是你要做的事情:“在这个kata中,你得到一个区域的起始编号和结束编号,并且应该返回所有数字的计数,除了其中包含5的数字。开始和结束编号都包括在内!”

我以一种丑陋的方式解决了这个问题,我不会在这里发布。我展示的是其中一个用户的解决方案。它看起来很流畅,但我不明白它为什么会起作用。

def dont_give_me_five(start,end):
    return sum('5' not in str(i) for i in range(start, end + 1))

我一直认为sum()对值进行求和,而不是索引。如果我是对的,“我”应该是一个值,而不是一个索引。但如果是的话,为什么这个解决方案有效?

1 个答案:

答案 0 :(得分:2)

sum() 添加生成器表达式生成的值。这些值恰好是布尔值,因此TrueFalse。在Python中,bool类型是int的子类,False的整数值为0True的整数值为1。

产生布尔值的表达式是'5' not in str(i),它针对for i in range(start, end + 1)循环的每个迭代进行求值。因此,对于istart范围内的每个end,它会计算其中没有数字5的值的数量:

>>> for i in range(495, 502):
...     print('{:2d} -> {} == {}'.format(i, '5' not in str(i), int('5' not in str(i))))
...
495 -> False == 0
496 -> True == 1
497 -> True == 1
498 -> True == 1
499 -> True == 1
500 -> False == 0
501 -> False == 0
>>> sum('5' not in str(i) for i in range(495, 502))
4