関数

ポイント

if x <= 5:
    def foo():
        print(x + x)
else:
    def foo():
        print(x * x)
  • リファレンス共有
    • 呼出元・呼出先でリファレンスを共有している
      • 引数が可変性のオブジェクトである場合、引数操作が呼出元に影響する。
>>> def foo(lst):
...     lst.append("x")
...
>>> lst = ["y"]
>>> foo(lst)
>>> lst
['y', 'x']
  • どんなインターフェースが対応するかを意識して関数定義する
  • 関数名は変数と同じ扱い
>>> def foo(): print("FOO")
...
>>> foo()
FOO
>>> x = foo
>>> x()
FOO
  • None
    • returnなしの際に戻される

ジェネレータ

>>> def foo():
...     yield "Hello"
...
>>> f = foo()
>>> print(next(f), "World")
Hello World

スコープ

LEGBルール
  • スコープの頭文字をとったもの。
  • 変数利用時、どのスコープで利用されるかを確かめる。
  • 順序はローカル→外側の関数(関数ネスト時)→グローバル→ビルトイン
ビルトインスコープ
  • 標準ライブラリモジュール__builtin__の変数が属するスコープ。
グローバルスコープ
外側の関数スコープ
  • ネストスコープ
  • クロージャ:すでに存在しない外側のスコープに属する変数を保持するオブジェクト
>>> def foo():
...     x = 10
...     return lambda y: y * x
...
>>> f = foo()
>>> f(2)
20