メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年2月10日日曜日

[Python][お勉強] Python入門(26) - 引数

さて、Pythonのお時間。今日は引数を学ぶ。

引数の重要事項

  • 引数が渡されると自動的にローカルスコープの変数に代入される。
  • よって引数に渡された変数を関数内で更新しても呼び出し元では影響しない。
  • ただし、引数の内部のリファレンスを上書きした場合は呼び出し元でも影響する。
な感じ。要は変数は全てポインタっぽく動作するので、ポインタそのものはコピーされるがそのポインタが保持しているポインタを上書きすれば呼び出し元にも影響を及ぼすということか。

たとえば、

>>> L = [1,2,3,4]
>>> def func(ll):
... ll = [5,6,7,7]
...
>>> func(L)
>>> L
[1, 2, 3, 4]
>>>


としてもグローバル変数Lは更新されない。が、

>>> def func(ll):
... ll[0] = 5
...
>>> func(L)
>>> L
[5, 2, 3, 4]
>>>


と、Lの内容はコピーされているわけじゃなくて、同じリファレンスを持つので、グローバル変数の値は更新されてしまう。
この辺、要注意らしい。

仮に、上記のようにリストの中身を変更しても呼び出し元に影響されたくないとするならば、

>>> L = [1,2,3,4]
>>> def func (ll):
... ll[0] = 5
...
>>> func(L[:])
>>> L
[1, 2, 3, 4]
>>>



と、スライシングの[:]を使って全ての要素をコピーしてしまえばよい。



キーワード引数
pythonではキーワード引数なるものが使える。


>>> def func(a,b,c):
... print a, b,c
...
>>> func(c=10,b=20,a=30)
30 20 10
>>>


な感じに引数を定義順には関係なく渡すことができる。
c=10は、引数cに10をという意味。
b=20は、引数bに20をという意味。
a=30は、引数aに30という意味。
順番ではなく、引数の名前を指定して値を渡すことができる。
このことを「名前によるマッチング」という。


可変引数
*や**を使用する。


>>> def func(*a):
... print a
...
>>> func("a","b","c")
('a', 'b', 'c')
>>>


となり、*を使用した場合は引数全てがタプルとなって関数内で受け取れる。

**を使用した場合は、

>>> def func(**a):
... print a
...
>>> func(a=10,b=20,c=30)
{'a': 10, 'c': 30, 'b': 20}
>>>


となり、関数内ではディクショナリとして受け取れる。
これらは、全て自由に引数の個数を変えられる。

**を使用した場合は、引数に渡す時点で、a=10、b=20のようにキーワード引数の形で渡す必要がある。


デフォルト値
関数の定義時に、仮に引数が指定されなかったときのためにデフォルトの値を設定できる。


>>> def func(a,b=20,c=30):
... print a,b,c
...
>>> func(10)
10 20 30
>>>


呼び出し時には1つしか引数を渡していない。定義時にbとcのデフォルト値を設定してあるので、
実際に呼び出すとa=10、b=20、c=30という値で呼び出されたことになる。

仮に、

>>> def func(a=10,c,d):
... print a,b,c
...
SyntaxError: non-default argument follows default argument
>>>



と引数aにだけデフォルト値を設定すると構文エラーになる。
これは引数が2つ以上あった場合、どの引数が省略されたのかPythonは知るすべがないからである。


>>>func(10,20)

とコールした場合、10はaに設定され、20はbに設定される。
cは未定義となってしまう。




おしまい。
.

0 コメント: