質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

3372閲覧

呼び出す関数を配列の添字によって変えたいが構文エラーになり、他の解決方法もわからない

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/07 03:13

編集2020/07/07 05:09

前提・実現したいこと

配列の添字によって呼び出す関数を変えるという制御を実現しようとしています。
具体的には

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/07/07 05:45

> (その2) > どうしても手書きではなく自動生成しないと数が多すぎるなどの場合 その仮定はあまりにも変です。 my_func.func0 と my_func.func1 は何が違うのか? を提示する方が、解決方法がでてくると思います。
guest

回答3

0

(その2)

Pythonには疎いので一般論になります。
ふつう、そのようなことはすべきでないです。遅い・セキュリティー的に危険・バグが出やすいといった欠点があります。ほとんどの場合、一般的な手段で事が済みます。
しかしどうしても必要な時のために「eval」や「リフレクション」の仕組みが多くの言語にあります。Wikipediaを見るにPythonにもあるようです。

eval
リフレクション (情報工学)

投稿2020/07/08 14:03

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

文字列としてではなく関数名をそのまま配列に入れればよいです。

Python

1import my_func 2 3num = [8, 4, 6, 2] 4func = [my_func.multi, my_func.div, my_func.sum, my_func.dif] 5 6print(type(my_func.multi)) # <class 'function'> 7 8for i, n in enumerate(num): 9 print(i, n, func[i](n)) 10#0 8 16 11#1 4 2.0 12#2 6 8 13#3 2 1

特定の名前の付いた関数だけ配列として使いたい場合

my_func.py

Python

1#変数の2倍 2def mf_multi(x): 3 y = x * 2 4 return y 5 6#変数の1/2 7def mf_div(x): 8 y = x / 2 9 return y 10 11def mf_sum(x): 12 y = x + 2 13 return y 14 15def mf_dif(x): 16 y = x - 1 17 return y 18 19# これは含まれない 20def other_func(x): 21 pass 22 23# mf_~という名前のついた関数のリストを返す 24def get_func(): 25 func = [] 26 for k,v in globals().items(): 27 if k.startswith('mf_'): 28 func.append(v) 29 return func

main.py

Python

1import my_func 2 3num = [8, 4, 6, 2] 4func = my_func.get_func() 5print(func) # [<function mf_multi at 0x0000020C173DFE58>, <function mf_div at 0x0000020C17426558>, <function mf_sum at 0x0000020C17426798>, <function mf_dif at 0x0000020C17426A68>] 6 7for i, n in enumerate(num): 8 print(i, n, func[i](n)) 9#0 8 16 10#1 4 2.0 11#2 6 8 12#3 2 1

投稿2020/07/07 03:49

編集2020/07/07 05:26
can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/07 04:42

ご回答いただきましてありがとうございます。「ご回答を受けての追記」に伺いたいことを明記させていただきましたので、よろしくお願いいたします。
can110

2020/07/07 04:51

回答修正しました。 別モジュールの関数を参照するには<別モジュール名>.<関数名>とすればよいです。
退会済みユーザー

退会済みユーザー

2020/07/07 05:01

ありがとうございます。最後にもう1点伺いたく、追記その2に明記したのですが、func配列の要素の型はcan110さんのコードでは何になるのでしょうか。文字列からそちらの型に変更することは可能でしょうか。
can110

2020/07/07 05:08

function型です。 type(~)で型がわかりますのでいろいろな変数の型を確認したい場合は活用してくだい。 文字列からfunction型に変更することはできません。
退会済みユーザー

退会済みユーザー

2020/07/07 05:11

ありがとうございます。 追記その2の例のように、今回の場合だと要素を自動生成することはできず、配列に手打ちで入力しておかないと使えないという理解で合っていますでしょうか。
can110

2020/07/07 05:28

回答に追記しました。 あるルールのもとに名前付けすれば、追記した回答コードにて可能です。
guest

0

投稿2020/07/07 03:50

aokikenichi

総合スコア2240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問