«Список пониманий» непосредственно в строке цикла - PullRequest
0 голосов
/ 04 февраля 2019

Можно ли добавить «списки» непосредственно в строку цикла?Текущий код:

cubes = [i**3 for i in range(5)]
for value in cubes:
    print(value)

Я хочу закодировать что-то вроде (это, очевидно, не работает):

for value in cubes = [i**3 for i in range(5)]:
   print(value)

или

cubes = [ ]
for value in cubes = [i**3 for i in range(5)]:
    print(value)

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

Я настоятельно рекомендую вам сохранить код, который у вас есть:

cubes = [i**3 for i in range(5)]
for value in cubes:
    print(value)

Понятно, что он делает, и это правильно.Существует небольшая причина для исключения одной строки кода с риском ее изменения.


Тем не менее, Python 3.8 введет выражений присваивания , которые могут (если я правильно читаю PEP-572 ; там нет похожих примеров), чтобы исключить эту строку кода:

for value in cubes := [i**3 for i in range(5)]:
    print(value)

Время покажет, будет ли это считаться хорошим,или, по крайней мере, приемлемый стиль.

0 голосов
/ 04 февраля 2019

Если вы хотите оба списка cubes для дальнейшего использования в коде и хотите распечатать его, вы можете сделать все, что угодно для понимания списка, используя тот факт, что print возвращает None:

cubes = [print(i**3) or i**3  for i in range(5)]

Это рекомендуется?НЕТ!Это явное нарушение «Дзен Питона» (PEP20) .

0 голосов
/ 04 февраля 2019

Если n для вашего range достаточно велико, использование понимания списка для вашего цикла будет зависать еще до его начала.Возможно, вы захотите абстрагировать циклическую фильтрацию с помощью yield:

def create_numbers(n):
    for x in range(n):
        yield x**3

for i in create_numbers(5):
    print(i)

yield будет выдавать вам эти значения по одному, вычисляя только следующее значение, когда next() вызываетсяпетля.Таким образом, ваш цикл выглядит лучше и не повторяется по этому списку 2 * n раз

0 голосов
/ 04 февраля 2019

Вы можете просто поместить выражение в цикл как:

for value in [i**3 for i in range(5)]:
    print(value)

output:

0
1
8
27
64
...