解决方案
如果您严格要求单线,那么这就是解决方案:
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 divides x 加上1 的次数。
- 对于每个 x,将其乘以 3 并提高到 3 次方
- 返回包含第 2 步结果的列表
Step 1最初写成
range(int((x - x%3) / 3) + 1)
在除以3 时减去一个数字的提醒,然后在添加1 之前将该结果除以3。但同样的结果可以通过将x除以3的整数部分然后加上1来实现,如下所示:
int(x / 3) + 1
第 2 步 将每次迭代乘以 3,然后将其提升到 3 的幂,但是 “乘法” 也可以通过使用范围 (就像@daniel 所做的那样)使用:
range(0, x+1, 3)
在3 的步骤上从0 迭代到x+1 并产生相同的结果。即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)]