有这个“别给我五个!”关于代码战的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()
对值进行求和,而不是索引。如果我是对的,“我”应该是一个值,而不是一个索引。但如果是的话,为什么这个解决方案有效?
答案 0 :(得分:2)
sum()
添加生成器表达式生成的值。这些值恰好是布尔值,因此True
和False
。在Python中,bool
类型是int
的子类,False
的整数值为0
,True
的整数值为1。
产生布尔值的表达式是'5' not in str(i)
,它针对for i in range(start, end + 1)
循环的每个迭代进行求值。因此,对于i
到start
范围内的每个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