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

result = lambda i, y: i + 1 for x in y if x in "aeoiuAEIOU"
print(result(0,s)

Тем не менее, я получаю синтаксическую ошибку. Также, чтобы прояснить мое понимание, лямбда-выражение возвращает выражение после двоеточия. Может ли кто-нибудь, пожалуйста, указать мне в правильном направлении?

0
Trebond 2 Июл 2019 в 03:51

4 ответа

Лучший ответ

Спасибо Сильвио за помощь! Заполнение списка, как вы предложили, дало мне ответ, который был не так ясен, как я хотел, поскольку он вернулся

[1, 1, 1, 1, 1]

Пока генератор вернулся

<generator object <lambda>.<locals>.<genexpr> at 0x0000028884166C00>

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

result = lambda i, y: sum(i + 1 for x in y if x in "aeoiuAEIOU")
print(result(0, s))

Который дал мне ответ 5.

1
wjandrea 2 Июл 2019 в 01:08

Вы также можете просто использовать один параметр в lambda:

result = lambda y: sum(x in "aeoiuAEIOU" for x in y)

И синтаксическая ошибка не является особенной с lambda:

In [10]: def bar(i, y):
    ...:     return i + 1 for x in y if x in "aeoiuAEIOU"
  File "<ipython-input-10-96fcd0959145>", line 2
    return i + 1 for x in y if x in "aeoiuAEIOU"
                   ^
SyntaxError: invalid syntax

Реальная проблема заключается в том, что i + 1 for x in y if x in "aeoiuAEIOU" является недопустимым выражением в Python.

1
LiuXiMin 2 Июл 2019 в 01:35

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

result = lambda y: sum(1 for x in y if x in "aeoiuAEIOU")

Вы даже можете использовать карту для этого:

result = lambda y: sum(map(y.count, "aeoiuAEIOU"))

Но это может быть сделано более разборчиво и более корректно с фактическим определением функции, и вы можете включить больше операторов

#more appropriately named count_vowels vs result and s vs y
def count_vowels(s):
    _s = s.lower()
    return sum(map(_s.count, 'aeiou')

Для этого вы также можете использовать re (regex) :

import re

def count_vowels(s): return len(re.findall("[aeiou]", s, re.I))

re.I игнорирует регистр, поэтому не нужно беспокоиться о capsvs uncaps

1
Jab 2 Июл 2019 в 01:26

Это просто разбор, который неоднозначен. Рассмотреть возможность

result = lambda i, y: (i + 1 for x in y if x in "aeoiuAEIOU")

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

result = lambda i, y: [i + 1 for x in y if x in "aeoiuAEIOU"]
2
Silvio Mayolo 2 Июл 2019 в 00:57