Решение
Если вам строго нужен однострочник, то это решение:
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
Шаг 1 был первоначально записан как
range(int((x - x%3) / 3) + 1)
, который вычитает напоминание числа при делении на 3
, а затем делит результат на 3
перед добавлением 1
.Но того же результата можно достичь, просто получив целочисленную часть от деления x
на 3
и затем добавив 1
, что будет выглядеть примерно так:
int(x / 3) + 1
Шаг 2 умножает каждую итерацию на 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)]