teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

二回目のPythonのコードが最初の一緒だった件

2017/11/23 10:27

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -35,8 +35,8 @@
35
35
  `y`は変わらず`54`のはずです。では、Pythonではどうでしょう。
36
36
 
37
37
  ```Python
38
+ y = x * 9
38
39
  x = 6
39
- y = x * 9
40
40
  print(y)
41
41
  ```
42
42
 

1

誤字とか一杯修正

2017/11/23 10:27

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -9,9 +9,9 @@
9
9
  y = x * 9
10
10
  ```
11
11
 
12
- `*`は掛け算を表すとします。`y = 9x`や`y = x・9`や`y = x × 9`や`Y IS X MULTIPLIED BY NINE`などの表現もありますが、表記だけの問題ですので、気にしないことにします。さて、この数式導かれる`y`は`54`です。[究極の疑問の答え](https://ja.wikipedia.org/wiki/%E7%94%9F%E5%91%BD%E3%80%81%E5%AE%87%E5%AE%99%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6%E4%B8%87%E7%89%A9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E7%A9%B6%E6%A5%B5%E3%81%AE%E7%96%91%E5%95%8F%E3%81%AE%E7%AD%94%E3%81%88)は`42`なのですが、そこも気にしてはなりません。
12
+ `*`は掛け算を表すとします。`y = 9x`や`y = x・9`や`y = x × 9`や`Y IS X MULTIPLIED BY NINE`などの表現もありますが、表記だけの問題ですので、気にしないことにします。さて、この数式によって導かれる`y`は`54`です。[究極の疑問の答え](https://ja.wikipedia.org/wiki/%E7%94%9F%E5%91%BD%E3%80%81%E5%AE%87%E5%AE%99%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6%E4%B8%87%E7%89%A9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E7%A9%B6%E6%A5%B5%E3%81%AE%E7%96%91%E5%95%8F%E3%81%AE%E7%AD%94%E3%81%88)は`42`なのですが、そこも気にしてはなりません。
13
13
 
14
- この数式をプログラミングで表現し、計算結果を得ることにしましょう。言語はPythonを使用してみます。(Pythonは3を使用しています)
14
+ この数式をプログラミングで表現し、計算結果を得ることにしましょう。言語はPythonを使用してみます。(Pythonは3を使用します)
15
15
 
16
16
  ```Python
17
17
  x = 6
@@ -53,7 +53,7 @@
53
53
 
54
54
  数式である`x = 6`や`y = x * 9`は**命題**です。これは、`x`と`6`は同じである、`y`と`x * 9`は同じである、という命題を表し、それぞれが成り立つ場合を考えるというものです。そして、それが成り立つのは`y`が`54`の時しかありません。命題ですから、別に前後しても問題ありません。始めに`y`と`x`の関係を述べた後に、`x`が何であるかを述べても、結果が変わることはありません。
55
55
 
56
- 別の見方をすると、常に成立する命題というのは**定義**と言い換えることができます。`x`を`6`と定義する、`y`を`x * 9`と定義する、という感じです。定義ですので、`y`が何か定めてから、あとから`x`を定めても問題ありません。どちらの定義が最初に来ようが、同じく結果が変わることはありません。
56
+ 別の見方をすると、常に成立する命題というのは**定義**と言い換えることができます。`x`を`6`と定義する、`y`を`x * 9`と定義する、という感じです。定義ですので、`y`が何か定めてから、から`x`を定めても問題ありません。どちらの定義が最初に来ようが、同じく結果が変わることはありません。
57
57
 
58
58
  しかし、プログラミングのコード、つまり、Pythonのコードにおいては、`x = 6`と`y = x * 9`は**命令**です。それぞれ、次のような意味です。
59
59
 
@@ -61,15 +61,15 @@
61
61
  2. `y = x * 9`: `x * 9`を評価し、その結果を`y`に割り当てよ。
62
62
  3. `pirnt(y)`: `y`を評価し、その結果を印字せよ。
63
63
 
64
- 「割り当て」という言葉を使いましたが、これは「代入」と同じく"assignment"の日本語訳としての表現です。これは命令ですので、一つ一つが順番に処理されます。初めの1.で`x`に`6`が割り当てられました。これは、`x`が何か調べる(評価する)と`6`が出てくるようになったと言うことです。次の、2.で、まず`x * 9`が評価されます。評価とは何か説明するととても長くなるのですが、`x * 9`の評価とは「`x`を評価して、その結果に`9`を掛けること」とだけ説明してきます。最初の割り当てで、`x`は評価すると`6`になるようになっていたのでした。ですので、`6`に`9`を掛けて`54`がその結果になり、`y`に割り当てることになります。最後の3.は、さきほど`y`を評価して、結果の`54`を印字するとなります。
64
+ 「割り当て」という言葉を使いましたが、これは「代入」と同じく"assignment"の日本語訳としての表現です。これは命令ですので、一つ一つが順番に処理されます。初めの1.で`x`に`6`が割り当てられました。これは、`x`が何か調べる(評価する)と`6`が出てくるようになったと言うことです。次の、2.で、まず`x * 9`が評価されます。評価とは何か説明するととても長くなるのですが、`x * 9`の評価とは「`x`を評価して、その結果に`9`を掛けること」とだけ説明してきます。最初の割り当てで、`x`は評価すると`6`になるようになっていたのでした。ですので、`6`に`9`を掛けて`54`がその結果になり、`y`に割り当てることになります。最後の3.は、さきほど`y`を評価して、結果の`54`を印字するとなります。
65
65
 
66
- さて、この動作ですが、1.と2.が逆であったらどうでしょうか?2.の命令を実行する時「`x`を評価する」という動作がありました。まだ1.が実行されていない場合、`x`には何も割り当てられていません。ましてや、将来ないんが割り当てられるのかもわかりません。命令は一つ一つこなしていく必要があり、保留にすると言うこともできません。つまり、「`x`を評価する」ということが1.が実行される前に行うことはできず、プログラミングの処理ができないため、エラーになってしまったのです。
66
+ さて、この動作ですが、1.と2.が逆であったらどうでしょうか? 2.の命令を実行する時「`x`を評価する」という動作がありました。まだ1.が実行されていない場合、`x`には何も割り当てられていません。ましてや、将来が割り当てられるのかもわかりません。命令は一つ一つこなしていく必要があり、保留にすると言うこともできません。つまり、「`x`を評価する」ということが1.が実行される前に行うことはできず、プログラミングの処理ができないため、エラーになってしまったのです。
67
67
 
68
68
  Pythonはエラーでしたが、他のプログラミング言語も同じとは限りません。暗黙的にデフォルト値が割り当てられる場合もあれば、不確定の値が割り当てられる場合もあります。どちらにしても、1.と2.が逆の場合、未来に行われる命令を予想して`x`を正しく評価すると言うことはできません。
69
69
 
70
70
  ###「命令」ではないプログラミング言語もある。
71
71
 
72
- 実はここまでの話は全てのプログラミング言語にまるわけではありません。C、C++、Java、C#、VB.NET、Perl、Python、PHP、Ruby、JavaScrit、Lua等の**命令型プログラミング言語**と言われるものに対してのみ言えることです。それに対して**関数型プログラミング言語**(Prolog等)や**論理型プログラミング言語**(Haskell、Erlang、Elixir等)等の**宣言型プログラミング言語**というものがあります。
72
+ 実はここまでの話は全てのプログラミング言語にまるではありません。C、C++、Java、C#、VB.NET、Perl、Python、PHP、Ruby、JavaScrit、Lua等の**命令型プログラミング言語**と言われるものに対してのみ言えることです。それに対して**関数型プログラミング言語**(Haskell、Erlang、Elixir等)や**論理型プログラミング言語**(Prolog等)等の**宣言型プログラミング言語**というものがあります。
73
73
 
74
74
  Haskellでの例を見てみましょう。
75
75
 
@@ -83,7 +83,7 @@
83
83
  54
84
84
  ```
85
85
 
86
- `x = 6`の方が後なのに問題なく処理できました。これは、Haskellにとって、`x = 6`や`y = x * 9`が**定義**だからです。数学の数式は定義としても考えられると述べましたね。そう、Haskellにおいては**数学と同じように考えることができる**と言えます。ただ、実際の処理を行うCPUは命令しか動きません。どういう処理になるのかというと、thunk遅延評価、必要呼びといった概念を説明しないと難しいので割愛しますが、命令型プログラミングよりも数学に近い考え方でプログラミングできると言えます。
86
+ `x = 6`の方が後なのに問題なく処理できました。これは、Haskellにとって、`x = 6`や`y = x * 9`が**定義**だからです。数学の数式は定義としても考えられると述べましたね。そう、Haskellにおいては**数学と同じように考えることができる**と言えます。ただ、実際の処理を行うCPUは命令しか動くことはできません。どういう処理になるのか、thunk遅延評価、必要呼びといった概念を説明しないと難しいので割愛しますが、命令型プログラミングよりも数学に近い考え方でプログラミングできると言えます。
87
87
 
88
88
  実は、先ほどのPythonも定義として作ることができます。
89
89
 
@@ -97,4 +97,4 @@
97
97
  54
98
98
  ```
99
99
 
100
- `x`や`y`を何らかの数値の変数として考えるのではなく、何らかの関数として考えるという物です。数式をプログラミングのコードにすると考えた場合、こちらのほうが正しいのかも知れません。
100
+ `x`や`y`を何らかの数値の変数として考えるのではなく、何らかの関数として考えるという物です。数式をプログラミングのコードにすると考えた場合、こちらのほうが正しいと言えるのかも知れません。