Есть ли python 3 для l oop однострочника, который не создает список? - PullRequest
2 голосов
/ 18 июня 2020

Я новичок в python 3, и мои поиски в Google оказались непродуктивными. Есть ли способ записать это:

for x in range(10):
  print(x) 

как это:

print(x) for x in range(10)

Я не хочу возвращать список, как это делает синтаксис понимания списка arr = [x for x in X].

EDIT: я на самом деле не в этом конкретном c случае с print(), меня интересует обобщенная c pythoni c синтаксическая конструкция для

method(element) for element in list

Ответы [ 4 ]

4 голосов
/ 18 июня 2020

Нет, нет. Если вы не считаете это однострочным:

for x in range(6): print(x) 

, но для этого нет причин.

0 голосов
/ 18 июня 2020

То, что вы ищете, - это выражение генератора, которое возвращает объект-генератор.

print(i for i in range(10)) #<generator object <genexpr> at 0x7f3a5baacdb0>

Чтобы увидеть значения

print(*(i for i in range(10))) # 0 1 2 3 4 5 6 7 8 9

Плюсы:

  • Чрезвычайно эффективное использование памяти.
  • Ленивая оценка - генерирует следующий элемент только по запросу.

Минусы:

  • Может повторяться до тех пор, пока не будет остановлена ​​итерация. ударил, после этого его нельзя повторить.
  • Нельзя индексировать как список.

Надеюсь, это поможет!

0 голосов
/ 18 июня 2020

Похоже, вы ищете что-то вроде map. Если вызываемая функция возвращает None, это не будет слишком дорого.

Map вернет итератор, поэтому вы просто пытаетесь его использовать. Один из способов:

list(map(print, range(6)))

Или использовать двухстороннюю очередь нулевой длины, если вы не хотите, чтобы фактические элементы списка сохранялись.

from collections import deque

deque(map(print, range(6)), maxlen=0)
0 голосов
/ 18 июня 2020

Для вашего конкретного случая c для печати диапазона 6:

print(*range(6), sep='\n')

Это не для l oop, однако @Boris верен.

...