

引数内にlambdaを改行しながら書く方法がわかりません。

下記のコードと同じ挙動をするコードを書きたいです。

[code]

    import pandas as pd
    df = pd.DataFrame(
        {
            'name': ('Hoge', 'Bar'),
            'value':('1', '2')
        }
    )
    def conditionally_combine(r):
        if r['name'] == 'Hoge':
            return r['name'] + r['value']
        else:
            return r['name']
    df["combine"] = df.apply(lambda r: conditionally_combine(r), axis=1)
    print(df)
    
[/code]

<https://naruport.com/blog/2019/9/5/python-tutorial-lambda/>

> ラムダ式は基本的には1行で書きます。  
>  なので複数行のラムダ式はサポートされていません。  
>  複数行で書きたい場合は↓のように改行をエスケープします。

> ラムダ式には↓のようにreturn文は書けません。

とあるので、下記のようにしましたがエラーです。

> File line 11  
>  if r['name'] == 'Hoge':  
>  ^  
>  SyntaxError: invalid syntax
[code]

    import pandas as pd
    
    df = pd.DataFrame(
        {
            'name': ('Hoge', 'Bar'),
            'value':('1', '2')
        }
    )
    
    df["combine"] = df.apply(lambda r:\
            if r['name'] == 'Hoge':\
                r['name'] + r['value']\
            else:\
                r['name']
        ,
        axis=1
    )
    print(df)
    
[/code]

また

<http://www.sakito.com/2012/10/python-lambda.html>

> とりあえず簡単なサンプルが以下。時々 lambda は改行ができないと思っている人がいるみたいだが、括弧でかこめば普通に改行できる。

とあるので、下記のようにしましたが、同様のエラーでした。

[code]

    import pandas as pd
    
    df = pd.DataFrame(
        {
            'name': ('Hoge', 'Bar'),
            'value':('1', '2')
        }
    )
    
    df["combine"] = df.apply((lambda r:
            if r['name'] == 'Hoge':
                r['name'] + r['value']
            else:
                r['name']
        ),
        axis=1
    )
    print(df)
    
[/code]


CC BY-SA 4.0
2021-06-09T08:34:57.743
77429
2022-11-22T04:04:25.510
2021-06-09T08:49:23.943
9008
9008
question
python
引数内にlambdaを改行ありで書く方法


コメントに 「`if` 文(statement)」とあるように,
[`if`は文](https://docs.python.org/ja/3/reference/compound_stmts.html#grammar-
token-python-grammar-if_stmt) です。(式の途中に現れる `if` は[条件式 (Conditional
Expressions)](https://docs.python.org/ja/3/reference/expressions.html#if-expr)
で式 expression)

(文と式の関係はそれなり複雑なのですべて記すことはムリなので以下を参照)

[Python 言語リファレンス](https://docs.python.org/ja/3/reference/) では …

  * [6\. 式 (expression)](https://docs.python.org/ja/3/reference/expressions.html)
    * ラムダ式: [6.14. ラムダ (lambda)](https://docs.python.org/ja/3/reference/expressions.html#lambda)
  * [7\. 単純文 (simple statement)](https://docs.python.org/ja/3/reference/simple_stmts.html)
  * [8\. 複合文 (compound statement)](https://docs.python.org/ja/3/reference/compound_stmts.html)

この様にまとめられ,「ステートメント, 文」の説明中に時々現れる「expression」の部分に式を記述できます。つまり …

  * ステートメント中に式(expression)を記述できる箇所がある
  * ラムダ式は「式」(expression)であり, その内部にステートメントを記述することはできない

* * *

式として扱える, `if`ステートメントの様な条件判断には, 以下のものが考えられるでしょう

  * [条件式 (Conditional Expressions)](https://docs.python.org/ja/3/reference/expressions.html#conditional-expressions)

  * [内包表記 (comprehension)](https://docs.python.org/ja/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries)

  * あとほかに [itertools](https://docs.python.org/ja/3/library/itertools.html) 内の, `compress()`, `filterfalse()`, `dropwhile()`, `takewhile()` など使えるものがあるかも？

また, 関数をうまく使えば, (式での記述も)それなりのことは可能かも

[code]

    import sys
    lst = [print('hello'), print('world'), sys.exit(0)]   # list/dictなどによる呼び出し
    f'{func_a()}{func_b()}{sys.exit(0)}'   # f-stringによる呼び出し
    
[/code]

このような howtoもあるので参考に

  * [関数型プログラミング HOWTO](https://docs.python.org/ja/3/howto/functional.html)


CC BY-SA 4.0
2021-06-10T12:15:27.277
77463
2022-09-21T09:27:11.387
2022-09-21T09:27:11.387
43025
43025
77429
answer