Возвращаемые значения из лямбда-выражения - PullRequest
0 голосов
/ 03 января 2019

Я импортирую значения из базы данных SQLite и хочу запустить лямбда-выражение над одним из столбцов для создания списка.

cur.execute('SELECT p, T FROM W')
data = cur.fetchall()

lst = list()
for row in data:
    p = float(row[0])
    T = float(row[1])
    lst.append(lambda T: p if T < 1 else 0)

Когда я запускаю это, выводится список следующего:

< function <lambda> at 0x00000255E52AA8C8> . 

Я хочу добавить список со значением p, когда T <1 и 0, если <code>T> 1.

Ответы [ 4 ]

0 голосов
/ 03 января 2019

У вас уже есть 2 отличных ответа, поэтому я собираюсь предложить другой подход.Это можно решить на уровне запросов, если предположить, что вы на самом деле выбираете только эти 2 столбца с логикой, которую вы нам показали.

Это может повысить производительность, если в таблице много строк:

cur.execute('SELECT CASE WHEN T < 1 THEN p WHEN T > 1 THEN 0 END FROM W')
data = cur.fetchall()

Тогда вам не нужен цикл, поскольку data уже содержит то, что вам нужно.Просто имейте в виду, что этот запрос вернет None для строк, в которых T == 1, но это можно легко обработать с помощью другого WHEN.

0 голосов
/ 03 января 2019

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

lst = [float(row[0]) if float(row[1]) < 1 else 0 for row in data]
0 голосов
/ 03 января 2019

Вам не нужно лямбда-выражение.

Вы можете думать об этом так: в настоящее время вы говорите компьютеру добавить саму функцию в список;Вы не говорите компьютеру добавить оценку этого значения.Если вы избавляетесь от бита lambda T:, вы в основном выполняете встроенный оператор if, который оценивает значение.Лямбда-функции используются для определения однострочных функций, которые будут использоваться позже.

0 голосов
/ 03 января 2019

Нет lambda нужно вообще:

lst.append(p if T < 1 else 0)

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

lst.append((lambda: p if T < 1 else 0)())

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...