関数
Contents
関数を利用する
関数を呼び出す
関数名とカッコ( )で呼び出す
- 呼び出すと結果が返ってくる
>>> str(1000) '1000'
関数の引数
カッコ ( )の中に数値や文字列を書き添え、関数に渡す
>>> range(100, 105) [100, 101, 102, 103, 104]
- 引数の数や型は決まっている
- 決まったルール以外の引数を与えるとエラー
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range('10')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: range() integer end argument expected, got str.
関数の戻り値
- 返ってくる値を戻り値という
- 戻り値も型が決まっている
>>> int('123')
123
関数の定義
関数名
- 関数名は変数名と同じルールが適用される
関数を作る
def 関数名():の形式で定義
処理はインデントしたブロックに定義
- 関数の呼び出しは関数を定義した後でないとエラー
>>> def spamfactory(): ... print "Spam!" ... >>> spamfactory() Spam!
引数の定義
- 関数を定義するときのカッコ( )内に変数名を定義
- 関数を呼び出したときに引数として値を渡すと、上で定義した変数に引数の順に値が代入される
この変数は関数の中だけで利用できるローカル変数となる
>>> def hamspamfactory(spams, hams): ... print "Spam! " * spams ... print "Ham! " * hams ... >>> hamspamfactory(2, 4) Spam! Spam! Ham! Ham! Ham! Ham!
引数のキーワード指定
- 引数名を指定すると、順番にかかわらず変数に値を渡すことが出来る
>>> def hamspamfactory(spams, hams): ... print "Spam! " * spams ... print "Ham! " * hams ... >>> hamspamfactory(hams=5, spams=1) Spam! Ham! Ham! Ham! Ham! Ham!
引数のデフォルト値
- 引数を定義するとき変数に値を代入することでデフォルト値を指定できる
>>> def foodfactory(times, foodname="Spam! "): ... print foodname * times ... >>> foodfactory(3) Spam! Spam! Spam! >>> foodfactory(3, "Egg! ") Egg! Egg! Egg!
- デフォルト値を持った引数を、デフォルト値を持たない引数の前に置くことはできない
>>> def spamfactory(spam="Spam! ", times): ... print spam * times ... SyntaxError: non-default argument follows default argument
関数の戻り値
return文で戻り値を指定できる
- returnの後にカッコ ( )は不要
>>> def newfoodfactory(times, foodname="Spam! "): ... return foodname * times ... >>> foods = newfoodfactory(4) >>> print foods Spam! Spam! Spam! Spam!
不定個のパラメータ
- アスタリスク「*」をつけたキーワードを師弟すると、関数に未定義の引数を渡せる
- 「**」だと未定義のリストとなる
>>> def fruitfactory(fruit, *args, **kwds):
... print fruit
... print args
... print kwds
...
>>> fruitfactory("Apple", "Orange", "Peach", red="Grape", white="Muscat")
Apple
('Orange', 'Peach')
{'white': 'Muscat', 'red': 'Grape'}
スコープ(関数とローカル変数)
関数内で定義された変数はローカル変数となる
- 関数の中でのみ利用できる
- 多言語のように特殊な記号でローカルやグローバルの指定をしない
- 変数が定義された場所で変数の性質が決まる
>>> def foo(num): ... a = 1 ... print a, num ... >>> foo(100) 1 100 >>> print a Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'a' is not defined >>> print num Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'num' is not defined
- 同じ変数名でも関数内と外では以下のよう別の変数
言うところの名前空間というものが違う
>>> def bar(): ... a = 10 ... print a ... >>> a = 100 >>> bar() 10
- 書換可能なリストや辞書などを引数とした場合は、引数として渡した値が書き換わるので注意
- 要するに参照渡しをした場合と同じように扱われる
>>> def baz(locallist): ... locallist.append(100) ... >>> a = [1, 2, 3] >>> baz(a) >>> a [1, 2, 3, 100]
