Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использование print в lambda-функции, ошибка синтаксиса 
V
    Опции темы
pythonwin
Дата 24.8.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Пожалуйста, помогите:

Есть код:

Код

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


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

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


PM WWW GTalk Jabber   Вверх
Void
Дата 24.8.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
pythonwin
Дата 24.8.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



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

спасибо!
PM WWW GTalk Jabber   Вверх
Artemios
Дата 24.8.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



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

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

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


Это сообщение отредактировал(а) Artemios - 24.8.2006, 21:33


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Void
Дата 24.8.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



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


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Artemios
Дата 24.8.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



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

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


Это сообщение отредактировал(а) Artemios - 24.8.2006, 21:46


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
pythonwin
Дата 25.8.2006, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



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))


может скорость и не увеличилась, но читать код уже намного легче!
PM WWW GTalk Jabber   Вверх
albertn
Дата 25.8.2006, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Но все-таки с идеологической точки зрения функции обработки  списков в питоне должны применяться исключительно для обработки списков. Это ведь не Лисп.
Но если очень надо, то в принципе можно.
И еще, функции вывода на экран выполняются гораздо дольше, чем та разница во времени выполнения между циклами и функциями map, reduce. Так что на скорость в данном случае почти не повлияет.
PM WWW ICQ   Вверх
Artemios
Дата 25.8.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(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. Так что на скорость в данном случае почти не повлияет.

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



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
pythonwin
Дата 25.8.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36




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



Artemios,  +1
Спасибо! 
PM WWW GTalk Jabber   Вверх
albertn
Дата 25.8.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



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

поддерживаю
PM WWW ICQ   Вверх
cherep
Дата 9.12.2006, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 11.1.2006
Где: Москва

Репутация: 1
Всего: 4



Раз пошла такая пьянка, то вот Вам решению полностью в 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__
...


Это сообщение отредактировал(а) cherep - 9.12.2006, 03:26
PM MAIL WWW ICQ   Вверх
Artemios
Дата 11.12.2006, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



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

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


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
dvska
Дата 11.12.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 182
Регистрация: 30.1.2006

Репутация: 6
Всего: 9



Не совсем в тему, но 
Надеюсь, все знакомы с функцией pprint / pformat?
Код
from pprint import pprint as pp
pp( dir( range(5) ) )

Код

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


Это сообщение отредактировал(а) dvska - 11.12.2006, 15:31
--------------------
PM MAIL   Вверх
Artemios
Дата 11.12.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 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 

Это сообщение отредактировал(а) Artemios - 11.12.2006, 15:52


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0970 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.