前提・実現したいこと
配列の添字によって呼び出す関数を変えるという制御を実現しようとしています。
具体的には
num = [8, 4, 6, 2] func = ["multi", "div", "sum", "dif"]
のように配列に格納されている0番目の数字は、関数も0番目のものを適用したいです。
発生している問題・エラーメッセージ
現在の書き方だとシンタックスエラーになるので、今回のようなことを実現するためには、どのようにすればいいのかわからない状態です。
検索でも配列に関数を格納するといった例を見つけられず、他の方法もわかりません。
$ python test.py File "test.py", line 8 ans = my_func.str(func[i]).(num[i]) ^ SyntaxError: invalid syntax
該当のソースコード
test.py
python
1import my_func 2 3num = [8, 4, 6, 2] 4func = ["multi", "div", "div", "multi"] 5 6if __name__ == '__main__': 7 for i in range(len(num)): 8 ans = my_func.str(func[i]).(num[i]) 9 print(ans) 10
my_func.py
python
1#変数の2倍 2def multi(x): 3 y = x * 2 4 return y 5 6#変数の1/2 7def div(x): 8 y = x / 2 9 return y 10 11def sum(x): 12 y = x + 2 13 return y 14 15def dif(x): 16 y = x - 1 17 return y
試したこと
以下のようにして関数呼び出しができることは、確認しました。
test.py
python
1import my_func 2 3num = [8, 4, 6, 2] 4if __name__ == '__main__': 5 a = my_func.multi(num[0]) 6 b = my_func.div(num[1]) 7 print(a) 8 print(b)
python
1#変数の2倍 2def multi(x): 3 y = x * 2 4 return y 5 6#変数の1/2 7def div(x): 8 y = x / 2 9 return y
bash
1$ python test.py 216 32.0
ご回答を受けての追記
(その1)
my_func.pyを別ファイルで持ちたい場合、以下のようにコードはなりますが、
test.py
python
1import my_func 2 3num = [8, 4, 6, 2] 4func = [div, div, sum, dif] 5 6for i, n in enumerate(num): 7 print(i, n, my_func.func[i](n)) 8
関数についての配列の要素でエラーが起こり、0番目をdiv
に変更しても同じエラーが起こるのは回避できるのでしょうか。
$ python test.py Traceback (most recent call last): File "test.py", line 4, in <module> func = [multi, div, sum, dif] NameError: name 'multi' is not defined
(その2)
もし以下のように、functionの要素を文字列で生成する(どうしても手書きではなく自動生成しないと数が多すぎるなどの場合)とき、
['my_func.func0', 'my_func.func1', 'my_func.func2', 'my_func.func3']
をfunc = [div, div, sum, dif]
と同じデータ型にするにはどうすれば良いでしょうか。
num = [8, 4, 6, 2] func = [] for j in range(len(num)): func.append('my_func.func'+ str(j)) print(func)
補足情報(FW/ツールのバージョンなど)
Python 3.7.4
回答3件
あなたの回答
tips
プレビュー