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

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

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

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

Q&A

解決済

2回答

1597閲覧

Pythonで書いたスクリプトの構造を完璧に理解したい

hiro_weedslayer

総合スコア15

Python 3.x

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

0グッド

0クリップ

投稿2016/01/06 17:39

###前提・実現したいこと
Pythonで書いた以下のスクリプトの仕組みを理解したい。感覚的には何となくわかるが、square(y)の部分について言葉で建設的に説明できない。

###疑問
[online python tutor](http://www.pythontutor.com/visualize.html#code=from+operator+import+add,+mul%0Adef+square(x%29%3A%0A%09return+mul(x,+x%29%0A%0Adef+sum_squares(x,+y%29%3A%0A%09return+add(square(x%29,+square(y%29%29%0A%0Aresult+%3D+sum_squares(5,+12%29&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=3&rawInputLstJSON=%5B%5D&curInstr=0)を参考にステップ毎に見ていたら、[丁度このステップ](http://www.pythontutor.com/visualize.html#code=from+operator+import+add,+mul%0Adef+square(x%29%3A%0A%09return+mul(x,+x%29%0A%0Adef+sum_squares(x,+y%29%3A%0A%09return+add(square(x%29,+square(y%29%29%0A%0Aresult+%3D+sum_squares(5,+12%29&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=3&rawInputLstJSON=%5B%5D&curInstr=11)で`square(y)`関数の中身である12が`square(x)`の中身としてすり替わっているのに気が付きました。なぜそうなったのかと自問自答すると納得の行く答えが出なかったので質問させて頂きました。

別の例として例えば

from operator import add, mul def square(x): return mul(x, x) def square1(y): return mul(y, y) def sum_squares(x, y): return add(square(x), square1(y)) print(sum_squares(5, 12))

を試してみましたが、[online python tutor](http://www.pythontutor.com/visualize.html#code=from+operator+import+add,+mul%0A%0Adef+square(x%29%3A%0A%09return+mul(x,+x%29%0A%09%0Adef+square1(y%29%3A%0A%09return+mul(y,+y%29%0A%0Adef+sum_squares(x,+y%29%3A%0A%09return+add(square(x%29,+square1(y%29%29%0A%0Aprint(sum_squares(5,+12%29%29%0A&mode=display&origin=opt-frontend.js&cumulative=false&heapPrimitives=false&textReferences=false&py=3&rawInputLstJSON=%5B%5D&curInstr=0)で調べてみると同じ結果に至りました。

###ソースコード
もとのソースコード:

from operator import add, mul def square(x): return mul(x, x) def sum_squares(x, y): return add(square(x), square(y)) result = sum_squares(5, 12)

###補足情報(言語/FW/ツール等のバージョンなど)
Python 3.4.3

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

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

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

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

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

guest

回答2

0

ベストアンサー

sum_squares(5, 12) と指定していますので、
sum_squares(x, y) の方では x が 5、y が 12 になります。
これをその次の add に当てはめると以下のようになります。
add(square(5), square(12))
次にこのsquare(5)の方を受け取る square(x) の方は x が5になります。
(ここの x は sum_squares のx とは別物です)
これを mul に当てはめると以下のようになります。
mul(5, 5)
これで 25 が返ります。
同様に square(12) を mul に当てはめると以下のようになります。
mul(12, 12)
これで 144 が返ります。
ここで add(square(5), square(12)) に戻ると
square(5) は 25, square(12) は 144 が返るのでaddに当てはめると
add(25,144)
になり、この結果、169 が返ります。

投稿2016/01/07 11:00

yoshi777

総合スコア674

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

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

hiro_weedslayer

2016/01/07 20:47

sum_square(x, y)のxとsquare(x)のxを混同させて考えていたのが原因でした。ありがとうございます。
guest

0

ご質問の意図はわかりませんが、こう考えてみてはいかがでしょうか。
「疑問」に記載されたソースコードと同じ意味を持ちます。仮引数名が違うだけです。

python

1from operator import add, mul 2 3def square(a): 4 return mul(a, a) 5 6def square1(b): 7 return mul(b, b) 8 9def sum_squares(x, y): 10 return add(square(x), square1(y)) 11 12print(sum_squares(5, 12))

投稿2016/01/07 02:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hiro_weedslayer

2016/01/07 20:47

まさに仮引数名がごっちゃになっていただけでした。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問