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

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

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

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

関数

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

Python

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

Q&A

解決済

4回答

2406閲覧

Python3で、関数名を引数として渡し、呼び出した関数内で実行することは出来ますか?

biwahoushi

総合スコア2

Python 3.x

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

関数

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

Python

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

0グッド

0クリップ

投稿2020/07/24 10:23

編集2020/07/27 06:00

前提・実現したいこと

Python3で、関数名を引数として渡し、呼び出した関数内でその引数に格納された関数を実行することは出来ますか?

したいこと

正確には実行できないコードですが、概念が伝わればと思い、一旦Pythonコード風に書きます。

Python

1def func(hoge): # hogeには、div(a,b)が代入されてほしい 2 try: 3 hoge # div(a,b)関数がここで初めて実行してほしい 4 except Exception as e: 5 return e 6 else: 7 return hoge # div(a,b) 2回目の実行にしたい 8 9def div(a,b): 10 return a/b 11 12def main(): 13 c = func(div(a,b)) # 本来であればdiv(a,b)の結果をfunc関数に渡されるが、この行ではdiv関数を実行してほしくない。 14

このプログラムにおいて、

  1. main関数を実行する
  2. main関数内のfunc関数の呼び出しで、引数として【div(a,b)】を与える(この時にdiv(a,b)を実行しない)
  3. func関数において、try文内とelse文内で、hoge(<-引数hogeに格納されたdiv(a,b))を実行する

これが出来るかお聞きしたいです。
ちなみにこれを実現したい目的としては、func関数内で、div関数ではない関数も同様に実行したいからです。

========

補足説明(7/27追記)

皆様ご回答ありがとうございます。
意図が一部伝わっていないような気がしましたので、追記させていただきます。(私の書き方が悪かったです…申し訳ないです…)
上記のPythonコードにおいて、既出のコード内に、add(a,b)関数があった場合において、
main関数内でc=func(add(a,b))を実行すると、前出のdiv関数のときと同様にfunc関数内でadd関数が動くようにしたいです。
言い換えると、main関数内でプログラム内に存在する関数の関数名(div,add等)をfunc関数に渡し、func関数内にて、「渡された関数名(div,add等)」と同じ名前の関数(div()関数, add()関数等)を実行したいです。
よろしくお願いいたします。

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

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

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

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

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

ozwk

2020/07/27 06:30

私の含めて皆さんの回答は「main関数内でプログラム内に存在する関数の関数名(div,add等)をfunc関数に渡し、func関数内にて、「渡された関数名(div,add等)」と同じ名前の関数(div()関数, add()関数等)を実行」できますけど何が条件に合わないんでしょうか?
tiitoi

2020/07/27 06:32

たしかに3人の回答はどれも 「func 関数内で div() 関数が動く」という要件を満たしていますね
guest

回答4

0

ベストアンサー

できますよ。

ただし、pythonでは関数そのものを引数に渡すことができるので、「関数名を渡す」ではなく、「関数を渡す」という形ですが。

【追記に対応】
追記された内容には「プログラム内に存在する関数の関数名(div,add等)をfunc関数に渡し、func関数内にて、「渡された関数名(div,add等)」と同じ名前の関数(div()関数, add()関数等)を実行したい」とありますが、このとおりの事がちゃんとできますよ。
参考までにadd関数を追加してみます。

python

1def func(hoge, *args): 2 try: 3 ret = hoge(*args) # 関数に引数をここで適用する。 4 except Exception as e: 5 return e 6 return ret 7 8def div(a,b): 9 return a/b 10 11def add(a,b): 12 return a+b 13 14def main(): 15 a = 10 16 b = 2 17 c = func(div, a, b) # div を 10 と 2 で呼ぶと 5が返りcに入る 18 d = func(add, a, b) # add を 10 と 2 で呼ぶと 12が返りdに入る 19

だだ、もし、どうしても func(div(a, b)) の様に呼び出したいということだとすると、それは、pythonの構文上できないはなしになります。

これでどうですかね?

投稿2020/07/24 10:37

編集2020/07/29 13:09
TakaiY

総合スコア12825

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

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

biwahoushi

2020/07/27 05:57

ご回答ありがとうございます。 少しお助けいただきたいと考えております。 質問文内に補足説明として追記いたしましたので、目を通していただいた上で再度ご回答いただけましたら幸いです。
guest

0

できます。

Python

1def func(hoge, *args): 2 try: 3 hoge(*args) 4 except Exception as e: 5 return e 6 7def div(a,b): 8 print(a,b) 9 return a/b 10 11def main(): 12 func(div,1,2)

投稿2020/07/24 10:29

編集2020/07/24 10:36
can110

総合スコア38278

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

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

退会済みユーザー

退会済みユーザー

2020/07/24 10:32

そういうことを言っている訳ではないのでは? 自分の解釈ですが、1,2,の引数の部分も渡したいということなのでないでしょうか。
can110

2020/07/24 10:34

質問の2.の部分ですね。 この部分の要件がちょっと分からなかったのでとりあえず回答しましたが、渡すような回答考えてみます。
biwahoushi

2020/07/27 05:58

ご回答ありがとうございます。 少しお助けいただきたいと考えております。 質問文内に補足説明として追記いたしましたので、目を通していただいた上で再度ご回答いただけましたら幸いです。
can110

2020/07/27 06:03

読みましたが、不可能と思います。 func(div(a,b))の「div(a,b)」という記述部分、Pythonは関数呼び出しとして解釈するので。
guest

0

皆様、ご回答ありがとうございました。
おとなしく、if-else文で関数を分岐させることとします。

投稿2020/07/27 06:21

biwahoushi

総合スコア2

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

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

can110

2020/07/27 06:30

後のためにif-elseで実現できたコードを回答に追記ください。
guest

0

python

1def func(hoge): 2 try: 3 hoge() 4 except Exception as e: 5 return e 6 else: 7 return hoge() 8 9def div(a,b): 10 print("div") 11 return a/b 12 13 14a = 2 15b = 1 16c = func(lambda : div(a,b)) 17print(c) 18
div div 2.0

投稿2020/07/27 06:18

ozwk

総合スコア13532

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問