例: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らしく書くならイテレータを使った方がいいのかな?
こういう再帰関数の使い方ってありなのかな?
御意見やアドバイスがあればコメントしてください!