Я не понимаю, как работает этот синтаксис, и не могу найти по нему документацию:

word = '123xyz567'
s = ''.join (c if c.isdigit() else ' 'for c in word)

Строка 2 кода возьмет xyz123 и объединит "123 567" в одну строку, передав лямбда-функцию для соединения

Однако меня смущает, как работает этот синтаксис, обычно инструкция python if-else выглядит так:

def example():
    for c in word:
        if c.isdigit():
            return c
        else:
            return ' ' 

Может ли кто-нибудь объяснить или направить меня к документации, которая объясняет мне синтаксическую структуру лямбда-функции, переданной в .join(), и как я могу ее правильно использовать?

3
Alpha_Omega 3 Май 2021 в 01:37

3 ответа

Лучший ответ

Здесь происходит несколько вещей, ни одна из них не lambda.

Во-первых, это генерирующее выражение, имеющее форму: (<expresion> for <var> in <iterable>).
В вашем примере <expresion> равно c if c.isdigit() else ' ', <var> равно c, а iterable равно word.
Он создает генератор (который является своего рода итеративным) для передачи в str.join.

Второе - это тернарный оператор, имеющий форму: <expresion> if <bool-expresion> else <expresion>.
В вашем примере первый <expresion> - это c, <bool-expresion> - c.isdigit(), а второй <expresion> - ' '.
Он возвращает первый <expresion>, если <bool-expresion> оценивается как True, иначе он возвращает второй <expresion>.

Все вместе (c if c.isdigit() else ' 'for c in word) представляет собой генератор, в котором все символы word заменены нецифровыми символами на один пробел (каждый).

2
Roy Cohen 2 Май 2021 в 22:49

Это не лямбда, а выражение-генератор.

https://www.python.org/dev/peps/pep-0289/

Почти как понимание списка, но вместо этого буквальный генератор.

list = [a for a in [1,2,3]]
generator = (a for a in [1,2,3])
print(list) # [1,2,3]
print(generator) # <generator object <genexpr> at 0x7f8ee3abd6d0>
4
Işık Kaplan 2 Май 2021 в 22:40

Отображаемый синтаксис не является функцией lambda, а скорее выражением генератора. См .: Выражения генератора и понимание списков

Подробнее о lambda можно прочитать здесь: Чем полезны лямбда-выражения Python?

Отображаемая вами функция def некорректно работает с оператором return; используйте yield, чтобы функция не выпрыгивала из первого символа:

def example(word):
    for c in word:
        if c.isdigit():
            yield c
        else:
            yield ' ' 

Подробнее о yield здесь: Что делает ключевое слово "yield"?

2
Ann Zen 2 Май 2021 в 22:47