通常の引数
関数定義の時に引数も定義できます。
def testFunc(a,b,c): print "a:%s,b:%s,c:%s" % (a,b,c) testFunc("a","b","c")
結果
a:a,b:b,c:c
引数の指定
関数を呼び出すときに、どの引数に値を入れるかを指定できます。このとき、値を指定した場合は、引数の順番は無視されます。
testFunc(b="b",a="a",c="c")
結果
a:a,b:b,c:c
引数の値を指定したものとそうでないものが混在する場合には、必ず指定しない物を先に書かなければなりません。
testFunc("a",c="c",b="b")
結果
a:a,b:b,c:c
順番を守らないとエラーとなります。
testFunc(c="c",b="b","a")
結果
SyntaxError: non-keyword arg after keyword arg
引数のデフォルト値
引数にデフォルト値を設定することも可能です。 その場合、引数を省略すると定義時のデフォルト値が使われます。
def testFunc(a, b = "b", c = "c"): print "a:%s,b:%s,c:%s" % (a,b,c) testFunc("a","b")
結果
a:a,b:b,c:c
関数を定義するときには、デフォルト値のないもの、デフォルト値のあるものの順に定義しないとエラーとなります。
def testFunc(a = "b", b, c = "c"): print "a:%s,b:%s,c:%s" % (a,b,c)
結果
SyntaxError: non-default argument follows default argument
可変引数
可変引数にも対応しています。引数をリストで受け取りたい場合は、「*」を使います。
def testFunc(*i_list): for i in i_list: print i testFunc(1,2)
結果
1 2
このとき、引数をリストで指定することも可能です。その時には呼び出し時の引数にも「*」を付けます。
testFunc(*[1,2,3])
結果
1 2 3
「**」を使うと辞書オブジェクトで引数を受け取ることも可能です。
def testFunc(**i_dic): for k,v in i_dic.iteritems(): print k,v testFunc(A='a',B='b')
結果
A a B b
リストと同様に、関数呼び出し時の引数に「**」を付けることで、辞書オブジェクトを引数とすることもできます。
testFunc(**{'A':'a','B':'b'})
結果
A a B b
関数を変数に入れる
関数は変数に入れることもできます。
def testFunc(a, b, c): print "a:%s,b:%s,c:%s" % (a,b,c) f = testFunc f("a","b","c")
結果
a:a,b:b,c:c
ただし、定義と同時に変数や関数の引数には入れられないため、その場合はラムダ式を使います。ラムダ式については「Python/ラムダ式」を参照のこと。
ドキュメントストリング
関数やクラス定義のすぐ下に書かれた引用符で囲まれた部分はドキュメントストリングと呼ばれ、「__doc__」で参照することができます。
def testFunc(a, b, c): """print a,b,c""" print "a:%s,b:%s,c:%s" % (a,b,c) print testFunc.__doc__
結果
print a,b,c
「"」「'」「"""」「'''」どれでも書けますが、複数行に渡るときもあるので、三重引用符を使うのが普通です。
このドキュメントストリングは対話モードで「help()」でも参照可能です。IDEなどでも表示してくれることもあります。なるべく関数の機能がわかるようなコメントを書いておきましょう。
Page Info | |
---|---|
Page Name : | Python/関数定義 |
Page aliases : | None |
Page owner : | njf |
Can Read | |
Groups : | All visitors |
Users : | All visitors |
Can Edit | |
Groups : | All visitors |
Users : | All visitors |
Counter: 2356,
today: 1,
yesterday: 0
Princeps date: 2017-01-02 (Mon) 06:38:36
Last-modified: 2017-05-24 (Wed) 17:59:32 (JST) (2756d) by njf