pythonについて勉強したことをまとめていきます。
関数
キーワード引数
def test(a,b,c):
return {"a" : a ,'b' : b, 'c' : c}
print(test(b=3,c=3,a=66))
この場合は{'a': 66, 'b': 3, 'c': 3}
と出力される
このように引数の名前を指定して実行できる。
(わかりづらくてスマン)
デフォルト引数
引数を指定し忘れたときのためにデフォルト引数を指定できる
def test(a=0,b=1,c=2):
return {"a" : a ,'b' : b, 'c' : c}
print(test())
>>> {'a': 0, 'b': 1, 'c': 2}
*による位置引数のタプル化
仮引数の一部として*を使うと可変個の位置引数をタプルにまとめて仮引数にセットする。
def test(*args):
print(args)
test(1,4,22,'hell')
>>> (1, 4, 22, 'hell')
*を使うときに仮引数をargsと呼ぶ必要はないが argsとするのが一般的になっている
**によるキーワード引数の辞書化
**を使うとキーワード引数を一つの辞書にまとめることが出来る。
ef test(**kwargs):
print(kwargs)
test(akb=48,nogizaka=46,kkk="hello")
>>>{'akb': 48, 'nogizaka': 46, 'kkk': 'hello'}
位置引数をまとめるargsと*kwargsを併用する場合、この2つはこの順序で並べなくてはいけない。
docstring
関数本体の先頭に文字列をつけると関数定義にドキュメントをつけることが出来る。
def test(s):
'引数をそのまま返す'
return s
print(test.__doc__)
>>>引数をそのまま返す
アンダースコアの意味はまだわからない。
クロージャ
クロージャが何なのかはよくわからないが少しまとめておく
def circle_area_func(pi):
"""円の面積を求める関数を返す"""
def circle_area(radius):
return pi * radius ** 2 #このpiは、circle_area_func()の引数に指定された値
return circle_area #関数を返り値として返す
#円周率を 3.14 に設定した場合の面積を計算する関数を生成
ca1 = circle_area_func(3.14)
#次に、円周率を3.141592に設定した場合の関数を生成
ca2 = circle_area_func(3.141592)
#上記で作成した2つの関数に、半径=1 を引数に与えて、演算結果を取得
ca1(1) #>>>3,14
ca2(1) #>>>3.141592
このようにクロージャの特徴を使えば、関数を生成して返す関数をひとつ作っておくだけで「ロジックは同じだけどその内部で使用するパラメータが異なる関数」を動的に作成することができます。この仕組みにより、「変数だけでなく処理(=関数)を部品化し使いまわせる」という特徴(関数型言語的特徴)が言語に加わります。
だそうです、、、
イメージはつかめた気がします。
ただ使えるとは言ってない
ラムダ関数
Pythonでは、「lambda式」を使って無名関数を作ることができます。
myfunc = lambda x: x ** 2
myfunc(5) # 25
myfunc(6) # 36
これは、「def」を使って
def myfunc(x):
return x ** 2
と定義したときと同じ処理となります。つまり、「lambda x: y」という形のうち、xが引数、yが戻り値となります。