Как реализовать счетчик с помощью лямбды? - PullRequest
0 голосов
/ 03 июля 2018

Могу ли я реализовать счетчик, используя функцию lambda в python или какое-нибудь выражение более pythonic?

Вот мой код:

counter = 0     
if 0 < arrival_time:
   counter += 1
else:
   pass

вот что я пробовал:

count_late = lambda x, arrival_time: x+=1 if 0 < arrival_time else pass
counter_late(counter, arrival_time)

Ошибка: enter image description here

Что мне не хватает или как я могу улучшить этот код?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

если у вас есть функция counter_late ():

**
#the 'counter' is in counter_late() or  global
counter_late((lambda arrival_time: counter+1 if 0 < arrival_time else PASS), 10)

**

остальное:

**
counter = 0 #global variable

counter = (lambda arrival_time: counter+1 if 0 < arrival_time else PASS)(10)

#check the value of counter 
print('conter=',counter)
**

10 - это переменная, которую вы хотите получить для значения Arrival_time.

если вы получили синтаксическую ошибку.

PASS это изменить другое значение, вы хотите номер или условие.

например)

counter = (лямбда-время прибытия: счетчик + 1, если 0 <время прибытия-еще 1) (0) </p>

0 голосов
/ 03 июля 2018

И x+=1, и pass - операторы, но lambda - это выражение, и вы не можете помещать операторы в выражение.

Но это нормально.

lambda и def оба просто создают функцию одинаково, но lambda более ограничен.

Если вам нужно создать функцию в середине выражения, вы должны использовать lambda, но здесь это не так, поскольку вы создаете ее просто для использования в операторе присваивания.

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

Некоторые люди (в основном те, кто провел слишком много времени с функциональными языками семейства Lisp или ML) также любят использовать lambda, чтобы дать понять, что они пишут «чистую функцию», которая имеет не имеет побочных эффектов и возвращает значение, которое зависит только от значения его параметров. Но и здесь это не так. (Если вы измените его на lambda x, arrival_time: x+1 if 0 < arrival_time else x, это будет хороший пример чистой функции. Затем вы вызовете его с помощью, например, x = count_late(x).)

Итак, нет абсолютно никакой причины использовать lambda здесь, во-первых. Просто используйте def:

def count_late(x, arrival_time):
    if 0 < arrival_time:
        x += 1

Тем не менее, стоит отметить, что, хотя сейчас это правильный синтаксис, он не принесет никакой пользы.

Числа неизменны; нет способа изменить число 2 на число 3, потому что это сломало бы всю физику. Когда вы пишете x += 1, это просто превращает локальную переменную x в имя для номера 3 вместо имени для номера 2. Если вы называете это с помощью count_late(spam, 5), это не изменит того, что означает spam, точно так же, как если бы вы назвали это с помощью count_late(2*3, 5), это не изменит того, что означает 2*3.

Итак, вы, вероятно, хотели:

  • Сделайте эту функцию чистой, значение которой return (как упоминалось выше, это будет означать, что вы могли бы использовать lambda, и некоторые люди были бы довольны этим, но я все равно определенно предпочитаю def здесь) или
  • Сделать это методом некоторого объекта, который имеет self.x или
  • Сделать x глобальным.
...