def add( a, b ): ※[def]関数の宣言、[add]関数名(任意の名前)
return a + b
● キーワード引数
引数を渡す際に引き渡す変数名を指定する事ができる
例)
add( a = 1, b = 2 ) ※受け手側の変数名を指定できる
※ただし、最初にキーワードを指定すると、以降の引数もキーワード付きにする事
add( 1, 2 )
add( 1, b = 2 )
add( 1, a = 2 ) ※エラー 2つの引数を[a]に渡そうとしている
add( a = 1, 2 ) ※エラー 構文エラー
● 可変長引数
動的に引数の数を変更したい場合[*]を付与して受ける
例)
def add( *values ):
result = 0
or v in values:
result += v
return result
print( add(1,2,3) ) ※6となる
hoge = [ 1, 2, 3 ]
print( add( *hoge ) ) ※リストを渡す場合は渡し手も[*]を付与する。
※タプル型、セット型でも同様の動きをします
print( add( 1, 2, 3 ) ) ※上と同じ動き。こういう場合が可変長が必要となる
【メモ】
あくまで可変長の引数にする可能性がある場合のみ[*]を意識する。
リスト変数を引数にし、リスト変数で受ける場合は[*]は不要です。
● キーワードの可変長引数
動的に引数の数を変更したい場合[**]を付与して受ける
例)
def add( values ):
result = 0
for v in values:
result += v
return result
def sumKeyVal( **keyVal ): ※可変長の辞書型を受ける
result = dict() ※辞書型変数を宣言
for k, v in keyVal.items():
result[k] = add( v ) ※取り出した値をaddメソッドで集計する ※値が全てリスト型を前提としている
return result
print( sumKeyVal( a = [1], b = [ 1, 2 ], c = [ 1, 2, 3, 4, 5 ] ) ) ※{'b': 3, 'a': 1, 'c': 15}となる
hoge = { 'a':[10], 'b':[1,2] }
print( sumKeyVal( **hoge ) ) ※メソッド側に合わせ[**]を付与する
● キーワードオンリー引数
メソッドを呼び出す際に必ずキーワード引数にしてもらいたい場合は単独で[*]を引数に追加する
例)
def keyHisu( *, a, b ):
return a + b
print( keyHisu( a = 1, b = 2 ) ) ※必ずキーワード付きで引数を渡す
def keyHisu( a, *, b ):
return a + b
print( keyHisu( 1, b = 2 ) ) ※第2引数のみキーワード必須となる
例)
def myAdd( a, b):
return a + b
def my2Add( f, a, b ): ※引数fは、関数myAddのオブジェクトを受ける
return f( a, b) + f( a, b)
f = myAdd ※関数myAddを変数fに代入
print( my2Add( f, 1, 2 ) )
上記の例は、関数funcの内容が1行です。
1行の場合は、[lambda]式を使い無名関数にする事が可能です。
例1)
def add_n( n ):
return lambda m: n + m ※lambda式です。
add_4 = add_n( 4 )
print( add_4( 10 ) ) ※答えは 14
例2)
def add_n( x, y ):
return lambda a, b: a + b + x + y ※lambda式です。(引数はカンマで区切る)
例3)
三項演算子を使ったラムダ式です
import re
fn = lambda n: float(n) if re.match(r'[0-9\.]+$', str(n)) else n
print(fn('10')) ※結果 10.0
print(fn('hoge')) ※結果 hoge
数値に変換可能な文字はフロート型に変換します。
更に、map 関数を使えば配列の中を再帰的に処理できます。
import re
fn = lambda n: float(n) if re.match(r'[0-9\.]+$', str(n)) else n
l = ['hoge', '10', 10, 'foo']
print(list(map(fn, l))) ※結果 ['hoge', 10.0, 10.0, 'foo']
例4)
ラムダ式を入れ子(ネスト)にする
-------------------
"hoge","foo","bar"
"A","1","あ"
"B","2","い"
"C","3","う"
-------------------
上記 CSV(hoge.csv)を読込み、2次元配列にします。
その際、ダブルクォーテーションを外し、数値に置換できるものはフロート型に変換します。
import os, re
dir = os.path.dirname(__file__)
fname = os.path.join(dir, 'data', 'hoge.csv')
lines = open(fname, 'r', encoding='utf-8').read().strip().split('\n')
str2float = lambda n: float(n.replace('"','')) if re.match(r'[0-9\.]+$', str(n).replace('"','')) else n.replace('"','')
cols2arr = lambda li: list(map(str2float,li.strip().split(',')))
arr_csv = list(map(cols2arr, lines))
print(arr_csv)
関数 eval を使うと文字列が python コードとして処理されます。
例)
hoge() と eval('hoge')() は同じです。
hoge.foo() と eval('hoge.foo')() は同じです。