解决方案
如果您严格要求只有一行代码,那么这就是解决方案:
get_cubes = lambda x: [pow(i, 3) for i in range(0, x+1, 3)]
但是,既然在Python中清晰度和可读性始终应该是优先考虑的,最好像@daniel一样将其编写为函数:
def get_cubes(x):
return [pow(i, 3) for i in range(0, x+1, 3)]
输出
使用for循环测试该函数,您会得到以下结果:
for i in range(20):
print(i, ':', get_cubes(i))
0 : [0]
1 : [0]
2 : [0]
3 : [0, 27]
4 : [0, 27]
5 : [0, 27]
6 : [0, 27, 216]
7 : [0, 27, 216]
8 : [0, 27, 216]
9 : [0, 27, 216, 729]
10 : [0, 27, 216, 729]
11 : [0, 27, 216, 729]
12 : [0, 27, 216, 729, 1728]
13 : [0, 27, 216, 729, 1728]
14 : [0, 27, 216, 729, 1728]
15 : [0, 27, 216, 729, 1728, 3375]
16 : [0, 27, 216, 729, 1728, 3375]
17 : [0, 27, 216, 729, 1728, 3375]
18 : [0, 27, 216, 729, 1728, 3375, 5832]
19 : [0, 27, 216, 729, 1728, 3375, 5832]
解释
对于那些问为什么@daniel的代码起作用的人:
原始代码执行以下操作:
- 给定一个
x
,从0
迭代到3除x的个数
加上1
。
- 对于每个x,将其乘以3并将其立方
- 返回包含步骤2结果的列表
第一步最初编写为
range(int((x - x%3) / 3) + 1)
将一个数除以 3
的余数减去后再除以 3
,最后加上 1
。但是同样的结果可以通过获取 x
除以 3
的整数部分,然后加上 1
来实现,具体如下:
int(x / 3) + 1
第二步是将每个迭代乘以3
,然后将其提高到3
次方,但是这种"乘法"也可以使用范围(就像@daniel所做的那样)来实现:
range(0, x+1, 3)
迭代从0
到x+1
,步长为3
,并产生相同的结果。即x
为10
:
range(0, 10 + 1, 3) | i*3 for i in range(int(x / 3) + 1)
============================================================
0 | 0*3 = 0
3 | 1*3 = 3
6 | 2*3 = 6
9 | 3*3 = 9
对于步骤3,我们只需要应用pow(x, 3)
(或x ** 3
),然后使用列表推导式将所有内容放在一行中,然后我们可以将其适应于lambda函数或函数的return语句中。
[pow(i, 3) for i in range(0, x+1, 3)]