47201


Pythonで

[code]

    def aaa(bbb)
    　 if bbb == "ccc":
           return "ddd"
       return
    
    if aaa(bbb) is not None:
       print aaa(bbb)
    
[/code]

というプログラムがあり、aaa(bbb)がNoneでなければaaa(bbb)の内容を表示させたいと思っていますが、aaa(bbb)の関数が2回呼ばれるが気持ち悪いと感じております。

例えば、if文の中でNone判定をしてNoneでなければ、ある値に結果を入れておいてif文の中でその変数を使って処理のようなことはできないのでしょうか。

もしくはもっと効率のいい方法でも結構です。ご存知の方、是非ご教示お願いします。


CC BY-SA 4.0
2018-08-03T01:10:00.070
47199
2018-08-03T03:00:33.460
8593
question
python
PythonでNone判定をしてNoneでなければその変数をif分の中で処理するには


Pythonでは、一般的には以下の様に書きます。

[code]

    ccc = aaa(bbb)
    if ccc is not None:
       print ccc
    
[/code]


CC BY-SA 4.0
2018-08-03T01:38:54.223
47200
2018-08-03T01:38:54.223
806
47199
answer


Pythonでは、条件式の内部で代入を行えません。

公式チュートリアルの[データ構造のページ](https://docs.python.jp/3.3/tutorial/datastructures.html#more-
on-conditions)のには、以下のように書かれています。

> Python では、C 言語と違って、式の内部で代入を行えないので注意してください。 C 言語のプログラマは不満に思うかもしれませんが、この仕様は、 C
> 言語プログラムで遭遇する、式の中で == のつもりで = とタイプしてしまうといったありふれた問題を回避します。

そのため変数を使って書くのが一般的です。

[code]

    a = aaa(bbb)
    if a is not None:
        print(a)
    
[/code]


CC BY-SA 4.0
2018-08-03T01:46:46.753
47201
2018-08-03T01:46:46.753
15171
47199
answer


`x = aaa(bbb)` と同じ事ですけれども、python
では関数オブジェクト(インスタンス)に属性値を持たせる事ができますので、以下の様にもできます。まぁ、参考までに、という事で…

[code]

    import dis
    
    def aaa(bbb):
      aaa.result = "ddd" if bbb == "ccc" else None
      return aaa.result
    
    def main():
      if aaa("ccc") is not None:
        print aaa.result
    
    if __name__ == '__main__':
      main()
      dis.dis(main)  
    
    ### Execute
    
    8           0 LOAD_GLOBAL              0 (aaa)
                3 LOAD_CONST               1 ('ccc')
                6 CALL_FUNCTION            1
                9 LOAD_CONST               0 (None)
               12 COMPARE_OP               9 (is not)
               15 POP_JUMP_IF_FALSE       29
    
    9          18 LOAD_GLOBAL              0 (aaa)
               21 LOAD_ATTR                2 (result)
               24 PRINT_ITEM          
               25 PRINT_NEWLINE       
               26 JUMP_FORWARD             0 (to 29)
          >>   29 LOAD_CONST               0 (None)
               32 RETURN_VALUE        
    
[/code]


CC BY-SA 4.0
2018-08-03T03:00:33.460
47203
2018-08-03T03:00:33.460
47199
answer