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

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

新規登録して質問してみよう
ただいま回答率
85.36%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

574閲覧

階層構造?になっている引数

esklia

総合スコア81

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

1クリップ

投稿2020/03/18 06:45

下記コードで
document_itadd_intsという関数を引数に持っていて、
new_function(3,5)を引数に持っている(new_functionfuncadd_intだと記憶していることは知っている)」

ことはわかっているのですが、実際に関数呼び出しをするときの引数の挙動が把握できておりません。
イメージ説明
イメージとしては、画像一番最後の行のように、(add_ints)(3,5)の順に階層構造になっており、(add_ints)は一番最初の階層ですので引数funcに参照され、(3,5)は二番目の階層なのでdocument_it関数より階層構造が一つ下である(このような言い方はしない気もしますが、)new_function関数の可変調位置引数*argに参照されるということで合っているのでしょうか?

# デコレータ ''' ・関数名と引数の値を表示 ・その引数を渡して関数を実行する ・結果を表示 ・実際の変更後の関数を返す ''' def document_it(func): def new_function(*args, **kwargs): print('Running function', func.__name__) print('Positional arguments:', args) print('Keyword arguments:', kwargs) result = func(*args, **kwargs) print('Result:', result) return result return new_function def add_ints(a, b): return a + b add_ints(3,5) cooler_add_ints = document_it(add_ints) cooler_add_ints(3,5)

出力

Running function add_ints Positional arguments: (3, 5) Keyword arguments: {} Result: 8 8

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

イメージとしてはそれでいいと思います。

特に他に言うことがない……

投稿2020/03/18 07:59

hayataka2049

総合スコア30935

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

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

esklia

2020/03/18 08:20

ご回答くださりありがとうございます。 そうなんですね、自分で無理やり説明を付けたので間違っている可能性が高いと考えていましたが、意外でした。 当質問に関連してお聞きしたいことがあるのですが、「階層構造になっている」という表現は適切でしょうか?hayatakaさんならなんと表現されますか?
hayataka2049

2020/03/18 08:29

> 当質問に関連してお聞きしたいことがあるのですが、「階層構造になっている」という表現は適切でしょうか? 適切ではないと思います。 特別な構文がある訳ではないので、単に cooler_add_ints = document_it(add_ints) が先に実行されてdocument_itの呼び出しによって返った関数が次の行で呼び出される、でいいかな。 document_it(add_ints)(3, 5) も事情は全く同じですが、構文解析の結合の強さを考えないと「正確には」説明できません。 必要ないのですが、あえて評価の優先順位を表すカッコを補うと(document_it(add_ints))(3, 5)になる、ということだけ知っておけばいいかと思います。要するに左の呼び出しが優先的に評価されます。 https://docs.python.org/ja/3/reference/expressions.html#grammar-token-primary
Zuishin

2020/03/18 09:03

カリー化に出会って戸惑っているんじゃないでしょうか。
hayataka2049

2020/03/18 09:18

カリー化ではないのでは? 高階関数とは言えるでしょうけど。
esklia

2020/03/18 09:26 編集

ありがとうございます。いつもながら大変勉強させていただいております。今してくださった回答でおおむね理解することができたと思います。今回の教訓ですが、入門python3も参考になりますが、公式のドキュメントを読む必要性を強く感じました。本当にありがとうございました。 恥ずかしながら高階関数も理解しておりませんので、この機会に勉強しようと思います。
Zuishin

2020/03/18 09:26

document_it(add_ints, 3.5) をカリー化したものかもしれません。そうでないかもしれませんが。
esklia

2020/03/18 09:28

ご回答くださりありがとうございます。カリー化かどうか未確定なようですが、カリー化について自分でも調べてみようと思います。教えて下さりありがとうございます。
hayataka2049

2020/03/18 10:00 編集

コメントから判断するにデコレータの例のようなので、カリー化ではないだろうと判断しておきます。 ちなみに、デコレータとして使う場合は、 @document_it def add_ints(a, b): return a + b # コメントではインデントが消えますが脳内で補ってください と書いておくと def add_ints(a, b): return a + b add_ints = document_it(add_ints) としたのと同じ効果があるという糖衣構文になります。
esklia

2020/03/18 10:36

おっしゃる通り、デコレータの例です。カリー化について存じ上げなかったのでカリー化の例でもあるのか分からなかったのと、質問内容がデコレータ自体についてではありませんでしたのでご説明しなかったのですが、説明した方が良かったようでした、これからは気を付けます。糖衣構文の例文もありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問