2015-06-22 5 views
2

Некоторые языки программирования функционального программирования (многие? Все?), Такие как StandardML и Haskell, имеют тип выражения в форме let ... in ..., где можно создавать временные переменные с областью действия самого выражения.Временные переменные в выражении python

Пример: let a=b*c in a*(a+1)

Похоже, что в Python есть никакого выражения не построить похожее на это.

Мотивация:

Например, тело lambda функции должны быть (один) выражение. Не два выражения. Не утверждение (присваивание - это утверждение, а не выражение).

Кроме того, при написании функциональных выражений и вообще однострочниками в питона, все может стать грязным довольно легко (см my answer в Python 2 list comprehension and eval).

Точка такой конструкции, чтобы избежать повторений (который иногда приводит к повторным вычислениям), например l[:l.index(a)]+l[l.index(a)+1:] вместо гипотетического let i=l.index(a) in l[:i]+l[i+1:]


Как можно достичь аналогичной функции языка в python2/python3?

+0

Что не так с 'a = b * c; а * (а + 1) '? Разумеется, он будет иметь больший объем, чем просто выражение, но это не должно быть проблемой, если ваш код достаточно структурирован и ваши переменные разумно названы. – TigerhawkT3

+0

@ TigerhawkT3 две вещи «неправильны» с этим: 1) это на самом деле два выражения, а не одно.) Scope не является выражением «a * (a + 1)», но область, в которой выражение содержится в – fferri

+0

И теперь я не понимаю, что не так с этими двумя вещами. :(Я не вижу какой-либо ловушки с двумя выражениями вместо одного, и я признал большую область видимости, но заметил, что это не должно вызывать проблем. Программисты Python очень часто сохраняют ссылки на переменные, часто с вполне приемлемыми результатами. – TigerhawkT3

ответ

5

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

>>> b, c = 2, 3 
>>> (lambda a: a * (a + 1))(b * c) 
42 

Вы также можете написать это с помощью именованных аргументов, если это помогает читаемость:

>>> (lambda a: a * (a + 1))(a=b * c) 
42 
0

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

>>> b,c = 2,3 
>>> var = [a*(a+1) for a in [b*c]][0] 
>>> var 
42 

Это ставит одно значение b*c в list, затем перебирает, что list в понимании, причем каждое новое значение состоит из некоторой трансформации каждого элемента. Созданный list является одним из элементов длины, и мы получаем первый элемент в нем с [0]. Без понимания это выглядит следующим образом:

>>> b,c = 2,3 
>>> var = [] 
>>> for a in [b*c]: 
...  var.append(a*(a+1)) 
... 
>>> var = var[0] 
>>> var 
42 

 Смежные вопросы

  • Нет связанных вопросов^_^