Hatena::Groupfukuoka-py

taketin.py RSSフィード

 | 

2011-12-14

はじめてのPython 15章 関数の基礎、16章 スコープと引数

00:47 | はじめてのPython 15章 関数の基礎、16章 スコープと引数 - taketin.py を含むブックマーク はてなブックマーク - はじめてのPython 15章 関数の基礎、16章 スコープと引数 - taketin.py

15章 関数の基礎

ステートメント、式
呼び出しmyfunc("spam", "eggs", meat=ham)
def, return, yielddef adder(a, b=1, *c): return a+b+c[0]
globaldef function(): global x; x='new'
lambdafuncs = [lambda x: x**2, lambda x: x*3]


  • returnステートメント
    • return は他の言語同様、値を返却して制御を戻す。
    • 関数内で returnステートメントを省略すると、Noneオブジェクトが返される。
  • yieldステートメント
    • 呼び出し側に値を戻した後もステートを保持し、処理を再開できるジェネレータと呼ばれる特殊な関数に用いられる。


  • globalステートメント
    • 関数内で定義された変数は、関数内飲みのスコープとなる。
    • モジュール全体で有効にしたい場合、globalステートメントを使用する。

  • defステートメントのネストと動的呼び出し
if test:
    def func():
        …
else:
    def func():
        …
…
func()

分岐によって関数の内容を変えるような記述が可能。


funcname = func
func()

変数関数名を代入する事で、関数オブジェクトリファレンスを代入する為、変数に()をつける事で呼び出しが可能。


16章 スコープと引数

  • スコープに関するルール


  • ネストスコープ
    • 関数1内で変数1と更に関数2が定義され、関数2内で変数1を呼び出す場合、ネストスコープとして特別な宣言無しで利用できる。ただし変更、代入を行う場合は global宣言が必要。
    • 以下のコードのようにすでに存在しない外側のスコープに属する変数を保持しているオブジェクトの事を「クロージャ」あるいは「ファクトリ関数」と呼ぶ
def f1():
    x = 88
    def f2():
        print x
    return f2    # f1() の返り値は f2() である

action = f1()
action()    # f2() が実行され、88 と表示される

  • lambda式
    • defステートメントと同じように関数を作るのに用いられる式
    • 式なのでリストやディクショナリのリテラルの中など、defステートメントが使えない場所で使用する事ができる


つまり、

不変性オブジェクト引数は、Cの「値渡し」引数に似ている。

可変性オブジェクト引数は、Cの「ポインタ渡し」引数に似ている。


  • 参照渡しと同様の結果を得る
    • Pythonには他言語でいう「引数の参照渡し」は無い。しかし同様の結果を得る書き方はできる
def multiple(x, y):
    x = 2
    y = [3, 4]
    return x, y

X = 1
L = [1, 2]
X, L = multiple(X, L)    # X, L の値は (2, [3, 4]) というタプルになる。元の変数の値にアンパック代入している。

  • 引数のバリエーション
    • 通常の引数 <位置によるマッチング>
      • どの位置に置かれているかを基準にマッチングが行われる
    • キーワード引数 <名前によるマッチング>
      • 関数呼び出し側のコードで、(引数 = 値) と指定する事ができる。この場合引数はdefステートメントの引数と名前によって対応付けられる
    • デフォルト値の設定
      • defステートメントのカッコ内で = という記号を使用すれば、引数デフォルト値を設定できる
    • 引数の数を自由に変えられるようにする
      • defステートメントのカッコ内で * という記号を使用すれば、呼び出し時に引数の数を自由に増やす事ができる(Cで言う可変引数に似ている)
    • 引数の数を呼び出し側で自由に変えられるようにする
      • 呼び出し側で * という記号を使えば、複数の引数を同時に渡す事ができる。

※ * が一つならタプル、二つならディクショナリに収められる

JoanaJoana 2012/02/21 03:21 To think, I was confused a mintue ago.

iidyhrkdiidyhrkd 2012/02/21 19:36 GExFmc <a href="http://ufqkcxuvcarx.com/">ufqkcxuvcarx</a>

bniisekobniiseko 2012/02/22 01:33 AdzhX0 , [url=http://bcxehnggfccs.com/]bcxehnggfccs[/url], [link=http://sfntkuxvllmq.com/]sfntkuxvllmq[/link], http://vugswbsuqada.com/

cejpukeucejpukeu 2012/02/29 01:50 7c7Tyi <a href="http://wglslokygyvl.com/">wglslokygyvl</a>

ゲスト



トラックバック - http://fukuoka-py.g.hatena.ne.jp/tksthdnr/20111214
リンク元
 |