2022年4月20日現在、以下で紹介していくコードは[Try Jupyter]ページの[Jupyter Notebook]リンクから起動したPython実行環境ではうまく動作しない。これは、実行環境をホストしているPyoliteにおけるinput関数が非同期処理となるように実装されているからだ(詳細はこちら)。
これは既知の問題として対応が検討されているようだが、当面の対策としては「input」の前に「await 」を記述して、関数内部での処理が終わるまで次の行に制御が進まないようにしようといわれている。が、これでもうまくいかないかもしれない。
この場合は、以前に[Try Jupyter]ページから起動するPython環境をホストするのに使われていたBinderを使うのがよい。簡単にはGitHubの[Binder Examples]リポジトリにある[conda]タイルか[requirements]タイルをクリックして、表示されたページにあるURLをクリックするのがよい。例えば、以下は[conda]タイルをクリックしたところだ。
このリンクをクリックすると、Binderにより実行環境が起動され、最終的に次のような画面が表示される。
この後は[File]メニューから[New Notebook]−[Python 3]を選択すると、以下のようにノートブックが新しいタブに開かれる。
本稿では以降、このようにして作成した環境を用いて、動作を解説していく。
次に以下のプログラムについて考えてみよう。
name = input('input your name: ')
message = 'Hello ' + name + ' !'
print(message)
先ほどは1行のプログラムだったのが、今度は3行のプログラムになった。これをセルに入力して、実行すると次のようにセルの下にメッセージと入力用のテキストボックスが表示される。
ここで何かテキストを入力して[Enter]キーを押すと、次のように「Hello 誰それ」といったメッセージが表示されるはずだ。
このプログラムでは、新しく次の要素が使われている。
以下では、各行を順に見ながら、これらの要素とこのプログラムの動作について説明をしていく。
1行目のコードは次のようになっていた。
name = input('input your name: ')
この行は変数(name)、代入演算子(=)、input関数の3つの要素で構成されている。「=」の前後には空白文字が入っているが、これは入れても入れなくても構わない。ただし、コードが見やすくなるので入れた方がよいだろう。
「変数」は「何かの値を取っておくための箱」のようなものだ。「何かの値に付けたラベル(名前)」といってもよい(「取っておく」ということは、後からそれを利用するということだ)。
変数は何かの値を取っておくためのものなので、変数を使うときには、最初にその値を変数に保存しておく必要がある。そして、変数に「何かの値」を保存するには多くの場合、代入演算子を使う。Pythonでは「何かの処理を行う記号類」のことを「演算子」と呼び、その中でも「=」記号は代入を行うことから「代入演算子」と呼ばれる。
代入演算子「=」記号の右側(右辺)の値が代入演算子「=」記号の左側(左辺)に代入される。つまり、「変数 = 何か」と書けば、代入演算子(=)の右辺の値が左辺の変数に「代入」される。右辺の「何か」が計算式や関数呼び出しであれば、その結果が代入されることにも注意しよう。例えば、「ans = 1 + 1」という文があったとすると、ans変数にはその計算結果である「2」が代入される。
「代入」といったが、これは左辺の変数(ラベル)が右辺の値を参照するように結び付ける処理ともいえる。このことから、結び付けるという意味がよく分かる「束縛」と呼ぶこともある。
実際には、Pythonでは何らかの値を変数などに代入する操作は「代入文」として規定されている。その最もシンプルな構文が「変数 = 代入する値」であって、このときに「=」は演算子というよりも代入文を構成する要素でしかない(そのため、Pythonのドキュメント「演算子の優先順位」には「=」は登場していない)。
ではあるが、本連載では便宜的に「=」を代入演算子と呼ぶことにする。
また、「変数 = 値」という「代入文」は文なので、実はどこにでも書けるものではない(Pythonでは文を書ける場所が決められている)。例えば、if文の「if 条件:」の条件には文は書けない。これがわずらわしいことがあることから、Python 3.8では「代入式」が導入されている。代入文とは異なり、代入式は「変数 := 式」のように「:=」演算子を使用して、先のif文の条件など文を書けない場所で変数に式の値を代入(しつつ、その式の値を条件判断などの処理に使用)できる。
上のコードでは代入演算子の右辺にあるのは「input関数」の呼び出しだ。先ほど、関数は「引数に何かの値を渡すと、その値を基に何らかの計算を行い、その結果を返す」と述べたが、input関数は「引数に受け取ったメッセージを画面に表示して、ユーザーからの入力を受け取り、それを文字列として返す」という動作をする。
これらの処理をまとめると次のようになる(ここではユーザーが「World」と入力したものとしている)。
以上のことから、1行目で行っている処理を日本語にすると「input関数を呼び出して、ユーザーにメッセージを表示し、入力を受け取り、それをname変数に代入する」となる。変数に値を代入すると(この場合はinput関数によりユーザーから受け取った値)、その変数を介してその値を利用できる。これを行っているのが2行目だ。
2行目のコードは次のようになっていた。
message = 'Hello ' + name + ' !'
今度はname変数とは別の「message」という名前の変数が出てきた。ただし、やっていることは「変数 = 何か」の基本形と同じであり、1行目と変わらない。つまり、このコードはmessage変数に「'Hello ' + name + ' !'」の「値」を代入しているということだ。
'Hello 'と' !'は既に見た文字列だ。それ以外にあるのは、1行目で値を代入したname変数と2つの「+」記号だ。この「+」記号はPythonの演算子の1つであり、文字列を「結合」したり、数値を「加算」したりするために使われる。ここでは、文字列を結合するためにこの演算子を使っている(そのため、「+」の左右に文字列を置く場合、これを「結合演算子」と呼ぶことがある。一方、「1 + 1」のように「+」の左右に数値があるときには、加算を行うので「加算演算子」と呼ぶことがある)。
例えば、1行目でinput関数に対してユーザーが「World」と入力したとしよう。すると、name変数の値は'World'という文字列になる。その値は、プログラムコード中に「name」と書くことで利用できる。よって、「'Hello ' + name + ' !'」という式の値は次のようになる。
これにより、message変数には'Hello World !'という文字列が代入される。このmessage変数を利用しているのが3行目だ。
3行目のコードは次のようになっている。
print(message)
message変数の値は既に見た通り、'Hello World !'という文字列であり、print関数にmessage変数を渡しているので、これが画面に表示されたというわけだ。
ここまで、少し難しくなったHello Worldプログラムの動作の解説と、そこで使われているプログラムの構成要素を取り上げてきたが、大事なことがもう1つある。それは「プログラムは上から下に順に実行される」ということだ。上から順に「ふんふん」と読めてしまうので、あまり気にしなかった人もいるだろうが、プログラムは「基本的」に上から下へと順に実行される。そして、プログラムがどのような順序で実行されるかを「実行の流れ」とか「制御フロー」などと呼ぶことがある。
最後により複雑なHello Worldプログラムを見てみよう。
Copyright© Digital Advantage Corp. All Rights Reserved.