ポイント
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
ジェネレータ
>>> 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