Pull to refresh

Comments 15

Всё-таки, у Python'а совершенно неочевидная семантика. Почему вообще возникает мысль, что эти "def" и "lambda" как-то должны отличаться, а не быть синтаксическим сахаром друг друга? :-)

потому что, скажем, на javascript анонимные функции и обычные - две больших разницы. Тут вроде тоже речь об обычных и анонимных.

Вы имеете в виду может быть стрелочные а не анонимные? Анонимной может быть не только стрелочная функция.

нет, я про разницу типа "определяется внутри блока или на весь объемлющий файл", например. Если вы где-то внизу джаваскриптовского файла напишете
let MyFunc = function() {
// какая-то функциональность
}
то вызывать её вверху файла из хэндла MyFunc вы не сможете. Даже если сам этот хендл как переменная определён выше, файл будет знать, что там лежит функция только ниже определения.

Если же вы внизу файла напишете то же самое, только начнёте с function MyFunc() {тут та же функциональность}, такая всплывёт наверх.

ЗЫ но на питоне, на самом деле, вверх вообще ничего не всплывает (кроме как в определениях классов), так что моё сравнение с джаваскриптом не очень. Питон же интерпретируется по мере прохода текста.

Это лишь поднимает вопрос - а там-то зачем? Я ещё пойму про implicit return (хотя я бы старался унифицировать), но вот остальное-то нафига сделано по-разному?

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

Ваш синтаксис - это def в одну строчку, внутри другой функции. Которая далее вызывается, как я понимаю, единожды.

В реальности же использование def - это не "создание (и использование)", а "создание, потом использование, использование, использование, ... использование ещё много много раз".

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

ЗЫ повторюсь, что я не питонистка, и... самой интересно, а как оно на самом деле

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

Почему сохранения хэндла функции в переменную это плохой тон? А если ее надо несколько раз использовать? Или считается, что тогда надо создавать отдельную функцию? Я в питоне ничего не знаю, но мне интересна мотивация.

Потому что суть анонимной функции в том, чтобы у нее не было имени (создал и передал куда-то сразу). Если нужно дать функции какое-то имя - есть обычная декларация через def. Заодно оно и в трейсах будет нормально выглядеть.

Ну и pep8 так рекомендует если моего мнения недостаточно

Да вы батенька извращенец. У меня и мысли не было о том, что они хоть как-то должны отличатся.

Выше написали про это, но я добавлю:

import timeit
exec_time = timeit.timeit(func, number=n)

И так, чтобы не писать boilerplate:

def timewrap(func):
  def wrapper(number: int):
    return timeit.timeit(func, number=number)
  return wrapper
 
 @timewrap
 def test_whatever():
   pass

Кхм... вы кажется переливаете из пустого в порожнее. Заглянем в документацию:

It is also possible to create anonymous functions (functions not bound to a name), for immediate use in expressions. This uses lambda expressions, described in section Lambdas. Note that the lambda expression is merely a shorthand for a simplified function definition; ...

Для меня после выныривания из JS обратно в родной Python это перестало быть очевидным -- уже привык, что функция и лямбда (стрелочная функция) совсем ни разу не одно и то же. Д -- деградация

Sign up to leave a comment.

Articles