Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > использование print в lambda-функции


Автор: pythonwin 24.8.2006, 15:52
Пожалуйста, помогите:

Есть код:

Код

map(lambda x: print x, dir(range()))


ругается на "print"

как обойти эту проблему?


Автор: Void 24.8.2006, 16:18
Никак. Лямбда в Питоне может содержать только выражение, но не оператор. Используй цикл.

Автор: pythonwin 24.8.2006, 16:26
Цитата(Void @  24.8.2006,  23:18 Найти цитируемый пост)
Никак. Лямбда в Питоне может содержать только выражение, но не оператор. Используй цикл. 

спасибо!

Автор: Artemios 24.8.2006, 21:18
Цитата(Void @ 24.8.2006,  16:18)
Никак. Лямбда в Питоне может содержать только выражение, но не оператор. Используй цикл.

Нет, в обход пойти можно:
Код

import sys
map(lambda x: sys.stdout.write(x+'\n'), dir(range(5)))

Автор: Void 24.8.2006, 21:32
Artemios, по правде говоря, я все равно предпочёл бы видеть в коде for. Потому что map — это преобразование списка, а не просто итерация.

Автор: Artemios 24.8.2006, 21:44
Цитата(Void @  24.8.2006,  21:32 Найти цитируемый пост)
по правде говоря, я все равно предпочёл бы видеть в коде for. Потому что map — это преобразование списка, а не просто итерация.

Все зависит от целей, преследуемых топикстартером. Может, человек решил написать программку без единого iffor и while smile Я, по крайней мере, однажды так развлекался smile 

Автор: pythonwin 25.8.2006, 07:04
Artemios, спасибо! Интересный способ. smile

Цитата(Artemios @  25.8.2006,  04:44 Найти цитируемый пост)

Все зависит от целей, преследуемых топикстартером. Может, человек решил написать программку без единого if, for и while smile Я, по крайней мере, однажды так развлекался smile 


Мои цели:
1) увеличить скорость выполнения (читал статью что map, reduce и т.д. быстрее for, while)
2) сделать код более читабельным (представьте, что у Вас 300-400 строк проверок if и циклов for или while)

сделал примерно вот так:

Код

def PrintL(l):
    print '-'*50
    for x in l: print x
import os
PrintL(dir(os))


может скорость и не увеличилась, но читать код уже намного легче!

Автор: albertn 25.8.2006, 09:02
Но все-таки с идеологической точки зрения функции обработки  списков в питоне должны применяться исключительно для обработки списков. Это ведь не Лисп.
Но если очень надо, то в принципе можно.
И еще, функции вывода на экран выполняются гораздо дольше, чем та разница во времени выполнения между циклами и функциями map, reduce. Так что на скорость в данном случае почти не повлияет.

Автор: Artemios 25.8.2006, 13:05
Цитата(pythonwin @  25.8.2006,  07:04 Найти цитируемый пост)
но читать код уже намного легче! 


мм...
Код

import sys
PrintL = lambda x: map(lambda y: sys.stdout.write('-'*50+'\n%s\n'%y),x)
PrintL(dir(sys))

нет, наверно все-таки твой вариант легче читать smile 

Цитата(albertn @  25.8.2006,  09:02 Найти цитируемый пост)
И еще, функции вывода на экран выполняются гораздо дольше, чем та разница во времени выполнения между циклами и функциями map, reduce. Так что на скорость в данном случае почти не повлияет.

А вот это верно.

Автор: pythonwin 25.8.2006, 13:37

Цитата(Artemios @  25.8.2006,  04:18 Найти цитируемый пост)
Нет, в обход пойти можно:
import sys
map(lambda x: sys.stdout.write(x+'\n'), dir(range(5)))



Artemios,  +1
Спасибо! 

Автор: albertn 25.8.2006, 13:42
Цитата(Artemios @  25.8.2006,  13:05 Найти цитируемый пост)
нет, наверно все-таки твой вариант легче читать smile 

поддерживаю

Автор: cherep 9.12.2006, 03:20
Раз пошла такая пьянка, то вот Вам решению полностью в 1 строку:

Код

>>> map(lambda x: __import__('sys').stdout.write(x+'\n'), dir(range(5))) and None
__add__
__class__
__contains__
__delattr__
__delitem__
__delslice__
__doc__
...


А вообще хочу сказать, что делать это категорически не стоит, ибо это совершенно non-pythonic, и совершенно не прибавляет читабильности ну ни на йоту. Не забывайте, что у питона есть вполне определенная идеология (import this - изучать полчаса smile ) Python это не руби и не перл.
И еще одно предостережение - один из самых страшных грехов - преждевременная оптимизация. Программа должна быть в первую очередь красивой и понятной.

Ах да, забыл о главном. Существенно более pythonic будет так:

Код

>>> print '\n'.join(dir(range(5)))
__add__
__class__
__contains__
__delattr__
__delitem__
__delslice__
__doc__
__eq__
__ge__
...

Автор: Artemios 11.12.2006, 09:07
Цитата(cherep @  9.12.2006,  03:20 Найти цитируемый пост)
Ах да, забыл о главном. Существенно более pythonic будет так:

И существенно быстрее smile
Как это мы только все забыли про join? smile ++

Автор: dvska 11.12.2006, 15:30
Не совсем в тему, но 
Надеюсь, все знакомы с функцией http://docs.python.org/lib/module-pprint.html?
Код
from pprint import pprint as pp
pp( dir( range(5) ) )

Код

['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
...
 'remove',
 'reverse',
 'sort']

Автор: Artemios 11.12.2006, 15:50
Цитата(dvska @  11.12.2006,  15:30 Найти цитируемый пост)
Надеюсь, все знакомы с функцией pprint / pformat?

Често не знал, спасибо smile

Цитата(dvska @  11.12.2006,  15:30 Найти цитируемый пост)
Не совсем в тему, но 

в тему, в тему: она (pprint) и в лямбду замечательно лезет (тема топика):
Код

from pprint import pprint
PrintL = lambda x: pprint(x) # :D 
PrintL(dir([]))


smile 

Автор: cherep 12.12.2006, 00:37
Цитата

Код

PrintL = lambda x: pprint(x) # :D 



Не забываем про карринг (привет, Haskell  smile)

Проще уж тогда
Код

PrintL = pprint


Или вообще избавиться от лишней переменной PrintL

Автор: Artemios 12.12.2006, 00:46
Цитата(cherep @  12.12.2006,  00:37 Найти цитируемый пост)
Не забываем про карринг (привет, Haskell  smile)
Проще уж тогда

Таки человеку лямбда нужна былаsmile

Автор: Virtuos86 20.1.2010, 05:49
  fixed: Вот этот вариант чуть пошустрее будет аналогичного:
Код
map(lambda x, printf=__import__('sys').stdout.write: printf(x+'\n'), dir(range(5)))

Если уж делать что-нибудь плохое, то нужно это делать хорошо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)