関数
一般形式
def <名前>(引数1,引数2,...):
<文>
return <値>
例:
>>> def times(x,y):
... return x * y
...
>>> times(2, 4)
8
>>> times('Ni',4)
'NiNiNiNi'
関数のスコープ規則
名前(変数名,関数名)の有効範囲
Python では 値を代入した時点で 名前が存在を開始する.
関数内部で代入された名前はその関数内で有効(ローカル・スコープ)
(逆はグローバル・スコープ)
- 取り囲むモジュールは,グローバルスコープとなる.
- 関数の呼び出しごとに新しいローカルスコープが生まれる.
- グローバルであると宣言されていない限り,代入された名前はローカルなものとなる.
(global文の使用)
- それ以外のすべての名前はグローバルであるか,あるいは組み込みである.
名前解決:LGB 規則
Local, Global, Builtin の順で名前を検索する.
例
>>> x = 99
>>> def f(y):
z = x + y
return z
>>> f(1)
100
global を使う例
>>> x = 99
>>> def g(y):
global x
x = x + y
>>> g(1)
>>> x
100
引数渡し
- 引数は,オブジェクトをローカルな名前に代入することで渡される.
- 関数の内側で引数名に代入しても,呼び出し側には影響がない.
- 更新可能なオブジェクト引数を更新すると,呼び出し側に影響することがある.
>>> def changer(x, y):
x = 2
y[0] = 'spam'
>>> X = 1
>>> L = [1, 2]
>>> changer(X, L)
>>> X, L
(1, ['spam', 2])
実際に代入をおこなって,上と同じ結果になることを確かめてみよう.
return
return は 任意のオブジェクトを返すことができる.
>>> def multiple(x, y):
x = 2
y = [3, 4]
return x, y
>>> X = 1
>>> L = [1, 2]
>>> X, L = multiple(X, L)
>>> X
2
>>> L
[3, 4]
引数の対応付け
- 位置による:左から右へ
- キーワードによる:引数名
- 可変引数:任意の個数の余分な変数をタプルまたはディクショナリの形で受け取る
- デフォルト値:引数が少なかったときのデフォルト値をあらかじめ指定.
>>> def func(spam, eggs, toast=0, ham=0):
print (spam, eggs, toast, ham)
>>> func(1,2)
(1, 2, 0, 0)
>>> func(1, ham=1, eggs=0)
(1, 0, 0, 1)
>>> func(spam=1, eggs=0)
(1, 0, 0, 0)
>>> func(toast=1, eggs=2, spam=3)
(3, 2, 1, 0)
>>> func(1, 2, 3, 4)
(1, 2, 3, 4)
>>> func(0)
Traceback (innermost last):
File "", line 1, in ?
func(0)
TypeError: not enough arguments; expected 2, got 1
可変引数の例(inter2.pyを用意しておく)
>>> from inter2 import intersect, union
>>> s1, s2, s3 = "SPAM", "SCAM", "SLAM"
>>> intersect(s1, s2), union(s1, s2)
(['S', 'A', 'M'], ['S', 'P', 'A', 'M', 'C'])
>>> intersect([1,2,3], (1,4))
[1]
>>> intersect(s1, s2, s3)
['S', 'A', 'M']
>>> union(s1, s2, s3)
['S', 'P', 'A', 'M', 'C', 'L']
補足
ラムダ式
一行で書く関数
>>> f = lambda x, y, z: x + y + z
>>> f(1,2,3)
6
apply
使用法
if test:
action, args = func1, (1,)
else:
action, args = func2, (1, 2, 3)
...
apply(action, args)
map
リストを一度に作る.
>>> counters = [1, 2, 3, 4]
>>> map(lambda x: x + 3, counters)
[4, 5, 6, 7]
値を返さない関数
>>> list = [1, 2, 3]
>>> list = list.append(4)
>>> list
>>> list = [1, 2, 3]
>>> list.append(4)
>>> list
[1, 2, 3, 4]
演習問題
- Pythonの対話的プロンプトに対して,引数を1つだけ受けとって,それを
画面に表示する関数を書きなさい.そして,その関数に文字列,整数,リスト,
タプル,ディクショナリを渡して呼び出してみなさい.また,引数を何も渡さない
場合と引数を2つ以上渡した場合のエラーメッセージを確かめなさい.
- adderという名前の関数をモジュールファイルに作成しなさい.
ここで,adder は2つの引数を受けとり,それらの和(あるいは連結)を返す
関数とする.次に,このファイルの最後にさまざまな型のオブジェクトを渡して
その関数を呼び出すコードを追加しなさい.このファイルをスクリプトとして
オペレーティングシステムのコマンドラインから実行しなさい.結果の表示には
print 文が必要であることを確かめなさい.
- 上の問題で作成した adder 関数を一般化して,任意の個数の引数の総和
を計算するようにしなさい.
- 2つのディクショナリの結び(union)を返すような addDict という関数を
作成しなさい.
- 二次方程式の解をタプルで返す関数を書きなさい.ここで,引数としては
a * x**2 + b * x + c = 0 の係数 a,b,c で与えるものとする.
また,平方根を計算する関数 sqrt() は math モジュールに含まれている.