Объяснить работу лямбда-функции
Мне нужно было создать функцию для перевода на "поросячью латынь". Условие: если слово содержит 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 шт):
Функция 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'))