例:2乗を出力する関数(square)
#配列に対応していない版
square_1.py
# coding:utf-8
#関数本体
def square(x):
#シンプルに2乗を計算する
return x ** 2
#関数を呼び出す
ans = square(2)
print(ans)
#配列(リスト)に対応させた版
square_2.py
# coding:utf-8
#関数本体
def square(x):
if type(x) is list: #引数がリスト配列のとき
lsRet = [] #返り値はリスト型配列
for cnt in range(len(x)):
#配列の中身を再帰的に関数に渡して、返り値のリストに追加する
lsRet.append(square(x[cnt]))
return lsRet
#引数がリスト配列ではないときはシンプルに計算
else:
return x ** 2
#関数を呼び出す
ans1 = square(2) #引数が数値のとき
print(ans1) #返り値は数値
#>>4
ans2 = square([2,3,4]) #引数がリスト配列のとき(1次元)
print(ans2) #返り値は配列となる
#>>[4, 9, 16]
ans3 = square([[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]]) #引数が3次元のリスト配列でも対応
print(ans3)
#>>[[[1, 4, 9], [4, 9, 16]], [[9, 16, 25], [16, 25, 36]]]
#リストとタプルに対応させた版
square_3.py
# coding:utf-8
#関数本体
def square(x):
if type(x) in [list,tuple]: #引数がリストかタプルのとき
lsRet = [] #返り値はとりあえずリスト配列
for cnt in range(len(x)):
lsRet.append(square(x[cnt]))
return type(x)(lsRet) #配列の型を維持する
else:
return x ** 2
#関数を呼び出す
ans1 = square((2,3,4)) #引数がタプル配列のとき(1次元)
print(ans1) #返り値はタプルとなる
#>>(4, 9, 16)
ans2 = square([([1,2,3],[2,3,4]),([3,4,5],[4,5,6])]) #リストのタプルのリストの...とかでも対応
print(ans2)
#>>[([1, 4, 9], [4, 9, 16]), ([9, 16, 25], [16, 25, 36])]
#まとめ
Pythonらしく書くならイテレータを使った方がいいのかな?
こういう再帰関数の使い方ってありなのかな?
御意見やアドバイスがあればコメントしてください!