2015-12-28 2 views
2

Учитывая, что вы не заботитесь о фактическом выходе, каков способ истощения генератора?Кратчайший код для истощения генератора при кодировании кода

Функция, которую я использую на карте, будет печатать сама по себе, поэтому все, что мне нужно сделать, - это получить карту для оценки.

На данный момент я использую list(), но я ищу более короткий путь.

Произвольный пример:

list(map(print,range(10))) 
+1

Переключиться на Python 2.7, где 'map' не возвращает генератор. Только половина шутки ;-) – Kevin

+0

Используйте 'for'-loop. Что в этом плохого? (Также подумайте о бедных душах, которые должны будут прочитать ваш код! :) –

+1

@ AndreaCorbellini OP упомянул, что это для кодового гольфа. – erip

ответ

3

В 3.5, вы можете злоупотреблять additional unpacking generalizations и заменить:

list(map(print,range(10))) 

с:

*map(print,range(10)), 

сохранение четырех символов (это производит tuple от None с).

С 3.4 и выше, вы можете (при условии, один символ долго буквальным существует, не будет существовать на выходе) делать:

0in map(print,range(10)) # tokenizer is fine with no space between 0 and in 

который сохраняет два символа в то же время избегая хранения каких-либо промежуточных list с.

Если выходы не контролируются на всех, и вы ниже 3,5, как отметили другие, сохраняя один символ легко (например, просто замените list с any, если только возможно «falsy» значения, если all возможны только «правдивые» значения, или set() для всех значений за счет хранения set), но выше сохранены немного больше, если у вас есть версия или генераторный выход.

Очевидно, что если вам не нужно print, это может сократить еще больше, так как *somegen, будет делать работу без каких-либо бессмысленных print с, требуя только два символа больше, чем ссылки на генератор, в первую очередь.

+0

Да, я знаю, что код в примере странный, но в основном там было создано «Нет», мне все равно, пока все результаты оцениваются. Действительно просто истощить генератор. '* X,' - отличное решение. – PascalVKooten

+1

@PascalvKooten: Ах, поэтому «карта» была примером создания генератора в первую очередь, и вы искали более короткий код для исчерпания «карты», чем «list()», не сокращая самого «карты» или что-нибудь. Попался. Да, я сомневаюсь, что вы получите это ниже двух символов над головой. :-) – ShadowRanger

1

Если вы знаете, что ваш генератор не будет содержать один из однозначных чисел (например 2) вы можете истощить его с 2 in ..., который один символ меньше, чем list(...).

+1

Как я уже упоминал в [моем ответе] (http://stackoverflow.com/a/34495629/364696), токенизатор в порядке с '2in', а не' 2 in', так что брить другой символ. – ShadowRanger

3

Set - один символ короче list.

set(map(print,range(10))) 

список понимание может быть лучше в некоторых случаях:

[print(a)for a in range(10)]  
+1

Ну, для краткости, если вы отбрасываете «карту», ​​не используйте понимание списка. 'for a in range (10): print (a)' один символ короче в конце концов; вам не нужно создавать «список». – ShadowRanger