Лямбда вместо выражения "если" - PullRequest
2 голосов
/ 16 августа 2011

Я слышал, что можно заменить оператор if с помощью лямбды.

Возможно ли это в Python?Если да, то как?

Ответы [ 5 ]

6 голосов
/ 16 августа 2011

Возможно, вы имеете в виду что-то вроде этого ( Лямбда-исчисление )?

If = lambda test, x, y: test(x, y)
True = lambda x, y: x
False = lambda x, y: y

Что вы можете использовать как ...

# I guess you have to convert them sometimes... oh well
C = lambda b: [False, True][b]

x = If(C(2 > 3), "Greater", "Less")
print(x)
# "Less"

Но сейчасвещи начинают разваливаться ...

If(C(2 > 3), print("Greater"), print("Less"))
# Invalid syntax unless you use
    #     from __future__ import print_function
# And if you do, it prints both!
# (Because python has eager evaluation)

# So we could do
True = lambda x, y: x()
False = lambda x, y: y()

# And then
If(C(2 > 3), lambda:print("Greater"), lambda:print("Less"))
# "Less"

Так что, не такие красивые или полезные.Но это работает.

4 голосов
/ 16 августа 2011

Как и другие, я не уверен, о чем вы спрашиваете, но я хочу угадать.

Иногда я использую лямбды немного хакерским способом, обрабатывая результаты вызовов API.

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

Вы можете определить лямбду, чтобы превратить строку в целое число, если она состоит из цифр:

lambda x: x and x.isdigit() and int(x) or None

Это позволяет избежать оператора if, но не из-за lambda, вы можете сделать то же самое, что и функция:

def f(x):
  return x and x.isdigit() and int(x) or None

Обновление

Меньше глючного взлома, любезно предоставлено Полом МакГуайром:

lambda x: int(x) if x and x.isdigit() else None

т.е. поскольку int('0') возвращает эквивалент False, лямбда может удивить вас, вернув None, когда вы захотите 0

3 голосов
/ 16 августа 2011

Я мог бы быть серьезно отключен, но я мог бы представить, что это означает что-то вроде:

filter(lambda x: x > 0, list_of_values)

Вернул бы вам элементы из list_of_values, которые имеют значение больше 0.

1 голос
/ 16 августа 2011

Вот небольшой трюк, вдохновленный Smalltalk языковое ядро, которое не использует оператор if или ternary оператор, еще работающий как условное исполнение механизм. : -)

#!/usr/bin/env python
class ATrue:
  def ifThen(self,iftrue): iftrue()
  def ifThenElse(self,iftrue,iffalse): return iftrue()
  def andThen(self,other): return other()
  def orElse(self,other): return self

class AFalse:
  def ifThen(self,iftrue): pass
  def ifThenElse(self,iftrue,iffalse): return iffalse()
  def andThen(self,other): return self
  def orElse(self,other): return other()

def echo(x): print x

if __name__=='__main__':
  T = ATrue()
  F = AFalse()

  x = T                    # True
  y = T.andThen(lambda: F) # True and False
  z = T.orElse(lambda: F)  # True or False

  x.ifThenElse( lambda: echo("x is True"), lambda: echo("x if False"))
  y.ifThenElse( lambda: echo("y is True"), lambda: echo("y if False"))
  z.ifThenElse( lambda: echo("z is True"), lambda: echo("z if False"))

ОБНОВЛЕНИЕ: приведите в порядок некоторые символы, чтобы избежать путаницы и прояснить суть. И добавлен код, показывающий, как можно реализовать краткую оценку логических операторов.

0 голосов
/ 16 августа 2011
if condition:
    do_stuff()
else:
    dont()

- это

(lambda x: do_stuff() if x else dont())(condition)

Но неясно, что вы ищете.

Обратите внимание, что это не if утверждение -- это троичная операция .В Python они оба используют слово if.Смотрите, например, Лямбда-оператор "if"? для этого в C #.

...