для цикла одна строка в Python - PullRequest
0 голосов
/ 22 сентября 2018

Когда я пытался использовать для оператора в одной строке, как показано ниже,

def get_cubes(x):
ls=[]
ls.append(pow(item*3, 3)) for item in range(int((x-x%3)/3)+1)
return ls

всегда возникает ошибка:

File "<ipython-input-47-8c391c3d568a>", line 3
ls.append(pow(item*3, 3))  for item in range(int((x-x%3)/3)+1)
                             ^
SyntaxError: invalid syntax

Но когда я пишу это в обычном для метода цикла,это работает хорошо.Кто-нибудь может сказать мне, почему?

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

Мой ответ следует (изменяет) ваш подход (код) вместо использования понимания списка, но исправленным образом.Сравнивая его с вашим кодом, вы выясните, где была ошибка.Я добавил комментарии #, чтобы объяснить изменения

def get_cubes(x):
    ls=[] # create an empty list outside the for loop once
    for item in range(int((x-x%3)/3)+1): # for loop for iterating through elements
        ls.append(pow(item*3, 3)) # append one item at a time
    return ls

print (get_cubes(10))                                   
> [0, 27, 216, 729]
0 голосов
/ 22 сентября 2018

Решение

Если вам строго нужен однострочник, то это решение:

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:

Исходный код выполняет следующие действия:

  1. С учетом x, итерация с 0на количество раз 3 divides x плюс 1.
  2. Для каждого x умножьте его на 3 и увеличьте до степени 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)]
0 голосов
/ 22 сентября 2018

Правильный синтаксис для циклов for:

def get_cubes(x):
    ls = []
    for item in range(int((x-x%3)/3)+1):
        ls.append(pow(item*3, 3)) 
    return ls

Возможно, вы ищете понимание списка, которое является способом генерации списков, когда тело цикла только добавляет к списку:

def get_cubes(x):
    ls = [(item*3) ** 3 for item in range(int((x-x%3)/3)+1)]
    return ls

или коротко:

def get_cubes(x):
    return [i ** 3 for i in range(0, x+1, 3)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...