Pythonにおける関数定義
[履歴] [最終更新] (2013/07/22 04:40:02)
最近の投稿
注目の記事

基本

defステートメントを用いて定義します。

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

def rec(x):
    return 1 if x==0 else x*rec(x-1)

for (i,x) in enumerate(range(7)):
    print "%d!=%d" % (i,rec(x))

出力例

$ python sample.py 
0!=1
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720

デフォルト引数の指定

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

def func(x='default'):
    print x

func(123)
func()

出力例

$ python sample.py 
123
default

複数の値を引数として渡す (Rubyの多値相当)

関数定義でアスタリスクを使用

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

def printTuple(*arg): # タプル化
    print arg

def printDict(**arg): # ディクショナリ化
    print arg

printTuple(1,2,3,4)
printDict(a=1, b=2, c=3)

実行例

$ python sample.py 
(1, 2, 3, 4)
{'a': 1, 'c': 3, 'b': 2}

関数呼び出しでアスタリスクを使用

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

def func(a,b,c):
    print a,b,c

T = tuple("str")
D = dict(zip(['a','b','c'],[1,2,3]))

func(*T)
func(**D)

出力例

$ python sample.py 
s t r
1 2 3

動的な関数定義

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

if False:
    def func(x): return x*2
else:
    def func(x): return x+2

print func(10)

出力例

$ python sample.py 
12

変数への代入

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

def func(x,y): return x+y
ref = func
print ref(7,8)

出力例

$ python sample.py 
15

グローバル変数の利用

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

x = 128

def func():
    global x
    x = 256

func()
print x

出力例

$ python sample.py 
256

クロージャ

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

def getFact(base):
    def fact(x):
        return base**x
    return fact

ref = getFact(1)
print ref(10)

ref = getFact(2)
print ref(10)

出力例

$ python sample.py 
1
1024

ラムダ式を用いたクロージャ

いわゆるラムダ式です。Perlでは無名関数と呼ばれていたものです。
なお、ラムダ式内には一つのステートメントしか記述できません。

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

def getFact(base):
    return (lambda x: base**x)

ref = getFact(1)
print ref(10)

ref = getFact(2)
print ref(10)

出力例

$ python sample.py 
1
1024
関連ページ
    概要 AWS Glue を利用すると Apache Spark をサーバーレスに実行できます。基本的な使い方を把握する目的で、S3 と RDS からデータを Redshift に ETL (Extract, Transform, and Load) してみます。2017/12/22 に東京リージョンでも利用できるようになりました