Объяснить работу лямбда-функции

Мне нужно было создать функцию для перевода на "поросячью латынь". Условие: если слово содержит 2 разные гласные, мы добавляем к нему 'way', иначе нужно перенести первую букву в конец слова и добавить 'ay'. Например: wine > wineway, wind > indway. Это усложненная версия задания, простая версия проблем не вызвала. Далее представлен код для решения задания(это версия моего кода для решения простого(первого) задания, пропущенная через chatGPT, для решения второй части задания:

def to_pig_latin(word):
    vowels = {'a', 'e', 'i', 'o', 'u'}
    unique_vowels = set(filter(lambda x: x in vowels, word))
    print(unique_vowels)
    if len(unique_vowels) >= 2:  # Если есть две или более различные гласные
        return word + 'way'  # Добавляем 'way' в конце
    else:
        return word[1:] + word[0] + 'ay'  # Переносим первую букву в конец и добавляем 'ay'
print(to_pig_latin('apple'))

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

Вопрос следующий: в коде используется lambda x: x in vowels, word, я совсем не могу понять как это работает, прогон кода через pythontutor.com показал что тут проверяется каждая буква слова word, если она гласная, то возвращается True и она попадает в массив. Но как именно это работает и как в лямбда-функции работает цикл я не понимаю. Например, если написать

vowels = {'a', 'e', 'i', 'o', 'u'}
word = 'apple'
for x in vowels, word:
print(x)
>>{'i', 'a', 'o', 'u', 'e'}
>>apple

x будет принимать всего 2 значения и не будет проходить по каждой букве. Помогите разобраться, пожалуйста.


Ответы (1 шт):

Автор решения: Runneso

Функция filter принимает два аргумента: 1 - функция, которая должна возвращать булевое значение (True/False), 2 - итерируем объект. Возвращает же она объект типа <class 'filter'>, по которому можно итерироваться. Этот итератор содержит лишь те элементы из переданного итерируемого объекта (2 аргумент), которые прошли проверку функцией (1 аргумент), то есть для них вернулось True. После объекта типа <class 'filter'> превращается в set, ведь у данного объекта есть свойство __iter __ и __next __. В данном случае lambda используется, чтобы не делать отдельную фукнцию, а просто описать её сразу, как аргумент функции filter. Ниже приведу код, который аналогичен вашему, но не использует lambda:

# вынесли в отдельную функцию
def check(x):
    vowels = {'a', 'e', 'i', 'o', 'u'}
    return x in vowels


def to_pig_latin(word):
    unique_vowels = set(filter(check, word))
    print(unique_vowels)
    if len(unique_vowels) >= 2:  # Если есть две или более различные гласные
        return word + 'way'  # Добавляем 'way' в конце
    else:
        return word[1:] + word[0] + 'ay'  # Переносим первую букву в конец и добавляем 'ay'


print(to_pig_latin('apple'))
→ Ссылка