LINUX.ORG.RU
ФорумTalks

PEP


0

1

Ну взглянешь на python бегло, вроде нормальный язык, а копнуть чуть дальше, и все. И statements в lambda не запихнуть, и генераторы, созданные с yield, нельзя повторно использовать. Да наверняка много чего еще всплывет после попытки написать еще 100 строк кода.

А может стоит кастрировать Гвидо ван Россума. Пусть он мужик будет такой же, как его творения. С виду нормальный, а на деле ничего не может. Может тогда он сменит генеральную линию партии?

★★

Ответ на: комментарий от quantum-troll

Но ведь можно же просто не использовать питон!

Хитрый посыл, но своим существованием python оттягивает силы разработчиков. Если бы его не было, то эти же люди могли посвятить свое время написанию библиотек для более достойного языка.

ival ★★ ()

Ну крив он не много. Хотя мне он последнее время стал нравится. Наверное юношеский максимализм поутих и больше не хочется мне математического аскетизма, хочется «богатства красок».

dizza ★★★★★ ()
Ответ на: комментарий от dizza

Наверное юношеский максимализм поутих и больше не хочется мне математического аскетизма, хочется «богатства красок».

Продолжая аналогию. В 90 лет яйца не нужны.

ival ★★ ()
Ответ на: комментарий от dizza

Ну крив он не много. Хотя мне он последнее время стал нравится. Наверное юношеский максимализм поутих и больше не хочется мне математического аскетизма, хочется «богатства красок».

Вообще говоря здесь не идет речь про аскетизма (т.е. стремление отказаться от излишеств) здесь дело в недостатке возможностей

ival ★★ ()

На это уныние поведётся только совсем уж школиё. Бегом, марш, перечитывать недавний тред про релиз.

baverman ★★★ ()

нафуя тебе statements в лямбдах, функции же объекты первого порядка - объяви рядом функцию и запихни в нее все что душе угодно

nbdarvin ()

лямбда без скобочек будет жутко выглядеть... и чем хуже просто вложенная функция?

да и про генераторы поясни примером кода который не работает и как он должен работать по-твоему

olegsov ()
Ответ на: комментарий от shimon

Ну скажи мне, зачем тебе многоразовые генераторы.

Как зачем? Несколько раз использовать.

PS Да, я знаю каким костылем это лечится.

ival ★★ ()
Ответ на: комментарий от ival

Как зачем? Несколько раз использовать.

Ты же хаскелист, вроде. Неужели так сложно понять что такое итератор?

baverman ★★★ ()
Ответ на: комментарий от nbdarvin

нафуя тебе statements в лямбдах, функции же объекты первого порядка - объяви рядом функцию и запихни в нее все что душе угодно

В лямбду могут входить внутренние переменный.

Что то вроде


def f (x):
  y = 2 * x;
  F (lambda z: y + z) 

Если объявлять рядом функцию, то y придется передавать ей в качестве параметра. Заводить рядом функцию напрочь убивает всю прелесть лямбды. Она хороша для создание своих statement-ов.

Например цикл for можно было бы оформить как функцию, и его тело передавать eй как параметр. А еще в виде такой функции второго порядка можно оформить получение какой-нибудь блокировки, запуск транзакции и т.д.

ival ★★ ()
Ответ на: комментарий от olegsov

да и про генераторы поясни примером кода который не работает и как он должен работать по-твоему

def f (n):
  for i in xrange (1, n):
    yield i;

def print_cursor (c):
  for i in c:
    print i;

c = f (4);

print_cursor (c);
print_cursor (c);

Печатает 1 2 3 один раз, а хотелось чтобы два.

ival ★★ ()
Ответ на: комментарий от baverman

Ты же хаскелист, вроде.

Нет.

Неужели так сложно понять что такое итератор?

Я понимаю что такое итератор.

ival ★★ ()
Ответ на: комментарий от ival

то y придется передавать ей в качестве параметра.

Штангист, такой штангист. Не позорься. Этот груз не по тебе.

baverman ★★★ ()
Ответ на: комментарий от ival

Я понимаю что такое итератор.

Тогда ты должен понимать, что если ты передаешь итератор в нечто, что будет по нему итерироваться, то он изменит свое состояние. Иначе ССЗБ.

baverman ★★★ ()
Ответ на: комментарий от baverman

Тогда ты должен понимать, что если ты передаешь итератор в нечто, что будет по нему итерироваться, то он изменит свое состояние. Иначе ССЗБ.

Ну вот здесь предлагают костыль. Почему он не добавляется по умолчанию.

ival ★★ ()
Ответ на: комментарий от tailgunner

Чтобы ты СТРАДАЛ, бугага.

А может Гвидо просто свою мать не любит. Каждый раз, когда кто-то прописывает костыль ее вспоминает и ей икается.

ival ★★ ()
Ответ на: комментарий от baverman

Всё-таки ты не понимаешь сути.

Какой сути?

PS: И как это называется? Питон головного мозга в терминальной стадии?

ival ★★ ()
Ответ на: комментарий от baverman

Не с твоей квалификацией начинать такой тред. Поэтому тихо-мирно ретируйся, мой совет.

Ну попробуй еще раз доходчиво объяснить почему в лямбде ненужны statements.

ival ★★ ()
Ответ на: комментарий от ival

И как это называется?

Я вот тоже не знаю. Вроде на вьюноша. Но за столько лет троллить так и не научился. Без знания матчасти лезет куда-то. Зачем, почему? Очень странно.

Могу предположить, что это называется недалёкий человек, как-то так.

baverman ★★★ ()
Ответ на: комментарий от ival

Ну попробуй еще раз доходчиво объяснить почему в лямбде ненужны statements.

А где я это уже недоходчиво объяснял? Ничего не путаешь?

baverman ★★★ ()
Ответ на: комментарий от geekless

Переходи на Руби.

Тогда он будет ныть почему метод нельзя передать в качестве блока, и надо обязательно его оборачивать.

baverman ★★★ ()
Ответ на: комментарий от geekless

а просто объясни.

Объяснить ненужность полноценных лямбд, когда самому они нравятся и было бы совсем неплохо их иметь? Оригинальная форма мазохизма, я такой не страдаю.

Но с другой стороны это можно сделать только изменив синтаксис языка, а py4 очень плохая идея. Лучше без лямбд, чем без библиотек.

baverman ★★★ ()
Ответ на: комментарий от baverman

> Объяснить ненужность полноценных лямбд, когда самому они нравятся и было бы совсем неплохо их иметь? Оригинальная форма мазохизма, я такой не страдаю.

Вот с этого и надо было начинать. :)

Но с другой стороны это можно сделать только изменив синтаксис языка, а py4 очень плохая идея. Лучше без лямбд, чем без библиотек.

Согласен.

geekless ★★ ()
Ответ на: комментарий от ival

Что то вроде

def f (x):
  y = 2 * x;
  F (lambda z: y + z) 
Если объявлять рядом функцию, то y придется передавать ей в качестве параметра. Заводить рядом функцию напрочь убивает всю прелесть лямбды.

def my_shit(x):
    return another_shit (lambda z: 2 * x + z) # Так, что ли?

Например цикл for можно было бы оформить как функцию, и его тело передавать eй как параметр.

А вот для этого у нас генераторы и итераторы, тащемта, и придуманы.

А еще в виде такой функции второго порядка можно оформить получение какой-нибудь блокировки, запуск транзакции и т.д.

А вот для этого у нас придуманы декораторы. С собачкой такие, типа

@in_transaction
def my_database_shit():
    pass
знаешь, да? Зачем все это тащить в лямбды?

Есть такая поговорка: если все, что у вас есть — это молоток, все проблемы начинают быть похожи на ногти пальцев рук.

shimon ★★★★★ ()
Ответ на: комментарий от baverman

А где я это уже недоходчиво объяснял? Ничего не путаешь?

Да. Спутал тебя с nbdarvin, когда ты ответил на это сообщение.

Там я попытался объяснить почему именованные функции плохо заменяют lambda. Может быть недостаточно внятно. Еще раз.

import sys;

def print_line (x1, x2, f):
  for x in xrange (x1, x2):
    sys.stdout.write (" {0}".format (f (x)));

def print_table (x1, x2, y1, y2, f):
  for x in xrange (x1, x2):
    print_line (y1, y2, lambda y: f (x, y));
    sys.stdout.write ("\n");


print_table (1, 10, 1, 10, lambda x, y: x * y);

Выражение «lambda y: f (x, y)» содержит свободное вхождение переменной x, которая является переменной цикла в функции print_table. Если бы это выражение было не такое короткое и содержало statements, то его пришлось бы оформлять в виде именованной функции и все свободные переменные делать параметрами. В реальном примере таких переменных мог быть пяток и лишней писанины получилось много.

После этого ты сказал, что то про штангиста и порекомендовал ретироваться.

В чем я не прав?

ival ★★ ()
Ответ на: комментарий от ival

В чем я не прав?

print_line можно объявить внутри print_table, внезапно. Конечно это не полноценная замена, но переменные замкнёт как-надо.

baverman ★★★ ()
Ответ на: комментарий от shimon

А вот для этого у нас придуманы декораторы. С собачкой такие, типа

Декоратор можно прикрутить к произвольному блоку?

Функций второго порядка бывает много. Например сlosure (f, S), которая берет функцию f и множество S, а возвращает наименьшее множество T, содержащее S для которого x \in T => f (x) \in T

На эту мелочь у вас тоже своя пимпочка придумана?

ival ★★ ()
Ответ на: комментарий от baverman

print_line можно объявить внутри print_table, внезапно. Конечно это не полноценная замена, но переменные замкнёт как-надо.

Не знал, что функции можно объявлять внутри циклов. Тогда почти полноценная заменой будет

import sys;

def print_line (x1, x2, f):
  for x in xrange (x1, x2):
    sys.stdout.write (" {0}".format (f (x)));

def print_table (x1, x2, y1, y2, f):
  for x in xrange (x1, x2):
    def g (y):
      return f (x, y);
    print_line (y1, y2, g);
    sys.stdout.write ("\n");


print_table (1, 10, 1, 10, lambda x, y: x * y);

Спасибо.

ival ★★ ()
Ответ на: комментарий от ival

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

это обходится использованием мутабельных объектов . то есть к примеру если надо сделать счетчик, который увеличивается внутри функции, вместо counter +=1 можно сделать counter[0]+=1.

кроме того, не обязательно объявлять функцию внутри цикла - ей доступны текущие значения переменных в момент вызова.

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

или о чем речь? можно еще в список преобразовать его и этот список использовать сколько угодно, но тогда придется подождать завершения первого прохода... или обернуть вызов .next() добавлением результата к списку для последующего реюза...

вообще генераторы - именно то что они есть... объекты то есть. кстати, даже рекурсивные генераторы работают. не понимаю чего от них еще хотеть можно? ах да, я когда-то хотел параметры в .next() передавать :) мне ответили, что это очень сложно реализовать.

olegsov ()
Ответ на: комментарий от olegsov

вспомнил ограничение генераторов - они не могут быть вложенными функциями, то есть если используется yield, то генератором считается глобальная функция, внутри которой есть yield, независимо внутри вложенной функции он или нет.

olegsov ()
Ответ на: комментарий от olegsov

ах да, я когда-то хотел параметры в .next() передавать

send()? Насколько знаю появился еще в 2.5

baverman ★★★ ()

он просто еще не на все костыли наткнулся. Вот как наткнется на все...

stevejobs ★★★★☆ ()

Кастрируй, разрешаю.

age ()

В нём дофига возможностей и он (python) крут.

</thread>

different_thing ()
Ответ на: комментарий от ival

Ну вот здесь предлагают костыль. Почему он не добавляется по умолчанию.

Непредсказуемый костыль, же. Допустим, нам передается генератор для обработки. Внезапно, мы хотим пропустить значения (скажем, пока не встретится X, затем пока не встретится Y):

gen = Regenerator(_squares,16)

for val in gen:
    if val == 25: break
for val in gen:
    if val % 10 == 6: break

print(list(gen))

Вроде нормально: пропускаем вплоть до 25, затем до числа с 6 на конце.

Но положим, вместо 25 у нас почему-то 24. Нам радостно выведется список начиная с 25. А «gen = (i*i for i in range(16))» вполне предсказуем и есть просит немного.

n01r ★★ ()
Ответ на: комментарий от ival

Наверное я хотел сказать не аскетизм, а некая формальная строгость.

dizza ★★★★★ ()
Ответ на: комментарий от ival

>Если объявлять рядом функцию, то y придется передавать ей в качестве параметра

Ай-ай, что такое замыкание мы не знаем, а троллить на ЛОР уже лезем.

Zenom ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.