関数

一般形式

def <名前>(引数1,引数2,...):
    <文>
    return <値>
例:
>>> def times(x,y):
...     return x * y
...
>>> times(2, 4)
8
>>> times('Ni',4)
'NiNiNiNi'

関数のスコープ規則

名前(変数名,関数名)の有効範囲
Python では 値を代入した時点で 名前が存在を開始する.
関数内部で代入された名前はその関数内で有効(ローカル・スコープ) (逆はグローバル・スコープ)

名前解決: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]

演習問題

  1. Pythonの対話的プロンプトに対して,引数を1つだけ受けとって,それを 画面に表示する関数を書きなさい.そして,その関数に文字列,整数,リスト, タプル,ディクショナリを渡して呼び出してみなさい.また,引数を何も渡さない 場合と引数を2つ以上渡した場合のエラーメッセージを確かめなさい.
  2. adderという名前の関数をモジュールファイルに作成しなさい. ここで,adder は2つの引数を受けとり,それらの和(あるいは連結)を返す 関数とする.次に,このファイルの最後にさまざまな型のオブジェクトを渡して その関数を呼び出すコードを追加しなさい.このファイルをスクリプトとして オペレーティングシステムのコマンドラインから実行しなさい.結果の表示には print 文が必要であることを確かめなさい.
  3. 上の問題で作成した adder 関数を一般化して,任意の個数の引数の総和 を計算するようにしなさい.
  4. 2つのディクショナリの結び(union)を返すような addDict という関数を 作成しなさい.
  5. 二次方程式の解をタプルで返す関数を書きなさい.ここで,引数としては a * x**2 + b * x + c = 0 の係数 a,b,c で与えるものとする. また,平方根を計算する関数 sqrt() は math モジュールに含まれている.