.. toctree:: =============================================== 1. プログラムの作成と実行、変数と型、代入と演算 =============================================== 全てのプログラム言語は、変数を使って演算(足し算、掛け算等)を行います。 変数には型(整数、実数、文字列)が必ずあります。変数に値を代入 した時点で変数の型は自動で決定されます。変数を定義して演算を行うことが 第1回講義の目的です。 * プログラムを作成して実行できるようになる(コマンド操作とエラーを見て修正)。 * 変数に値を代入する。 * 型の概念を理解する。 * 変数を使って演算する方法を理解する(演算子+,*,/,%,**等の使い方)。 * 変数の値や型をターミナルに出力する方法を理解する(**print文**)。 .. note:: プログラム言語を習得するコツは、プログラムを読んで中身を理解し実行する作業を繰り返すことです。プログラムを作成する際は、コピペしてかまいません。ただし内容を理解してコピペしてください。理解しないままコピペして例文を実行しても身につきません。コピペした内容を読んで少しずつ修正し、自分の考えた通りにプログラムが実行できるか確認しながら理解を深めます。 プログラムの作成と実行 ====================== `Google colab `_ にて各自のPCでプログラミングすることとします。`Google colab `_ を利用するために、Googleアカウントが必要になるので、準備しておいてください。以下、教育用端末のPyCharmを想定した説明になっていますが、`Google colab `_ 環境に読み替えてください。 .. プログラムの作成と実行 ====================== プログラムはテキストファイルです。エディタ(テキストファイルを編集するプログラム)は、世の中にたくさんありますが、講義ではPython用のIDLE(Integrated DeveLopment Environment, 統合開発環境)を用います。IDLEは、プログラムの作成と実行を1つのソフトウェア上で行うことができます。また、pythonのプログラミングで必要となるインデント処理や、文法上で特別な意味のあるのキーワードに色をつけて表示したり、キーワードを補完する機能を備えています。 windowsに付属しているメモ帳やwordでプログラムを作成することも可能ですが、IDLEを使うほうが断然プログラムを書きやすいです。千葉大学の教育用端末にインストールされている、PyCharmを使って講義をすすめます。Pycharmの初期設定は、 :doc:`../17_PyCharmの初期設定/pycharm` を参照してください。まだ自宅で学習する場合は、 :doc:`../16_Python開発環境の構築/install` を参照して自分のPC上でPyCharmによるPython開発環境を作成してください。 PyCharmの起動 ============= スタートメニューからPyCharmを選択して起動します。デスクトップにショートカットを作っておくと良いでしょう。今後、PyCharm上でプログラムの作成と実行を行います。 プログラムの作成 ---------------- PyCharm上でプログラムを保存するためのプロジェクトの中にディレクトリ(day01)を作成します。今後、講義毎にディレクトリを作成してその中にプログラムを作成すると良いでしょう。 .. code-block:: none コンピュータ処理/day01 作成したフォルダに以下のPythonファイルを作成します。 .. code-block:: none example-01.py まずは画面に適当な文字を表示させるプログラムを作成します。今回は、何も考えずに画面に文字列を表示してみます。以下のプログラムを実行してみます。ブラウザ上でこのドキュメントを開いてコピペすれば良いでしょう。今後、コピペを頻繁に行うので以下のショートカットを覚えておいてください。 .. code-block:: python :caption: example-01 # ターミナルに「わたしは千葉大生です」を表示させるプログラム print("わたしは千葉大生です") .. csv-table:: :header-rows: 1 :widths: 2, 6 "操作", "ショートカット" "カット", "Ctrlを押しながらx (**Ctrl-x**)" "コピー", "Ctrlを押しながらc (**Ctrl-c**)" "ペースト", "Ctrlを押しながらv (**Ctrl-v**)" コピペせずに入力する場合は、補完機能を積極的に使ってください。補完機能は[TAB]で使うことができます。例えば、[p]を押して[TAB]を叩くと、以下のようにpythonの予約語(Pythonの文法で特別な意味のある単語)でpから始まる候補のリストが表示されます。また[pri]まで入力して、[TAB]を叩くと[print]まで補完してくれます。[pri]からはじまるPythonの予約語は、printだけなので、[print]まで一気に入力を助けてくれます。 必須ではないですが、ブラインドタッチができると、素早くプログラムを完成させることができます。キーボードの[F]と[J]の位置に左手と右手の人差し指を置いて、画面を見ないで入力できるよう練習しましょう。キーボードの左下にあるCtrlキーは、左手の腹で抑えながら[x]や[v]を押してCtrl-xやCtrl-vを使います。下の写真を参照してください。 .. image:: keyboard.png :width: 400px :align: center 実行は、Ctrl-[F5]を押すかマウスでメニューから再生ボタンを押してます。 プログラムの作成と実行は上の手順で行います。 example-01をもう少し解説します。 * **print()** 文を使って文字列を表示する。 * 表示させる文字列は、double quotation「 **\\"** 」で囲む。 * #の後ろの文字はコメントで何を書いても無視されます。空行も無視されます。 もう少し複雑なプログラムを実行してみましょう。 水素原子のd軌道をプロッ トしてみます。 .. literalinclude:: d-orbital.py :caption: example-02 プログラムを実行すると、z=0、xy平面の確率密度(dxy)を等高線(コンターマップ)でプロットした図が表示されます。 .. image:: d-orbital.png :width: 50% :align: center このように簡単な文字出力から複雑な計算とプロットまで、カバーしているところがpythonの魅力です。 プログラムのデバック -------------------- プログラムの間違いを探して修正する作業をデバックと呼びます。文法に間違 いがあると、プログラムはエラーを表示して停止します。ためしに以下の プログラムを実行してみます。 .. code-block:: python :caption: example-03 :linenos: print("私の一番好きな元素は") print("ウランです。") printe("私の一番嫌いな元素は") print("Fです。") このプログラムを実行すると以下のようなエラーになります。 .. code-block:: none :linenos: 私の一番好きな元素は ウランです。 Traceback (most recent call last): File "hoge.py", line 3, in printe("私の一番嫌いな元素は") NameError: name 'printe' is not defined 2行目まで問題なく実行されていますが、3行目で **print** と書くところを **printe** と書いています。デバックする時は、エラーの内容をよく読むことが修正への近道です。エラー内容から3行目が間違っていることを教えてくれています。作成したプログラムがエラーとなったら、エラーの内容をよく読んで間違いを修正します。 プログラムの基本事項 ==================== プログラムは、テキストファイルで作成します。テキストファイルの上から順 番に実行されます。今後、文法の詳しい説明を行いますが、インデント(字下 げ)は特別な意味を持ちます。pythonは、プログラムの行頭にインデントを使っ て、プログラムの流れを制御するので、行頭に無駄なスペースを入れないこと に注意してください。また、上の例で示しているように文頭の#はコメント文 となり、コメント文としてスキップされます。コメント文には変数の意味や処理の内容を好きなように記述できます。 .. note:: 冗長になるくらいコメント文をプログラムに書いておくことは重要です。自分で作成したプログラムでも2週間後には、ほぼ内容を忘れて(別人化)しまっています。少しうるさいくらいまで、コメント文にプログラムの変数の説明や解説を入れておくと、2週間後の自分や他人がプログラムを容易に理解できます。 変数の利用 ========== 数字や文字等をコンピュータに記憶させる文字を **変数** と呼びます。 変数sを使ってexample-01を書き直してみます。 .. code-block:: python :caption: example-04 :linenos: s = "私は千葉大生です。" print(s) 変数に何かを代入する場合は、 **=** で代入する値を指定します。01-example04の場合、sという変数に\"私は千葉大生です。\"が代入されています。変数として利用できる記号は以下のとおりです。大文字と小文字は区別されます。変数はスペースを含むことができないので、スペースを使いたい場合は、アンダースコア(_)を使います。 * 小文字の英字 * 大文字の英字 * 数字 * アンダースコア 注意点として、数字は変数の先頭に使うことができません。以下の変数はpythonで使える文字です。 .. code-block:: none hoge hoge_ hoge3 HOGE A_is_B 以下の変数はpythonで使えない(エラーになる)文字です。 .. code-block:: none 4hoge "hoge (hoge3 .HOGE 変数として使えない文字列を使おうとしたら、IDLE上でhighlightされる(色が 変わる)ので、間違いに気がつくかと思います。 変数の型と代入 ============== 変数に代入でいる値は、数字や文字列です。変数に値が代入されると、変数の **型(type)** が決まります。変数は、必ず何かしらの型を持っています。どの ようなプログラミング言語でも変数は型をもっていて、プログラムを書く人は、 型を意識すること必要です。Pythonで用いる主な型は以下のとおりです。 .. csv-table:: :header-rows: 1 :widths: 2, 6 "型の名", "値の例" "整数型(int)", "1 2 3 9 -10 -56等の小数点をもたない整数" "浮動小数点型(float)", "1.1 54.3 0.2 -0.3, 3.00e8 等の小数点を持つ数字" "文字型(str)", "hoge 千葉大 等の文字列" 変数を「=」で結べば、値を代入できます。プログラムの作成者は、定義した 変数が何の型になっているか、常に意識することが重要です。変数の型を明示する こともできますが、変数に値を代入すると値によってPythonが変数の型を自動決めてくれます。 .. note:: C言語等のコンパイル言語は、変数の型をあらかじめ宣言する必要があります。Python等のスクリプト言語は、変数へ値を代入すると同時に型が決まってしまうため、変数の型を宣言する必要はありません。ただし、変数の型を指定した処理がたくさんあるので、プログラム作成者は変数の型を常に意識する必要があります。 また **type()** を使うことで変数の型を取得できるのでいくつか試してみます。 .. code-block:: python :caption: example-05 :linenos: # 変数の代入と表示 a = 1 # aに1を代入 型はint print("type of a:", type(a)) # aの型を表示 a = 1.0 # aに1.0を代入 型はfloat print("type of a:", type(a)) # aの型を表示 a = 3.0e8 # aに300000000 print("type of a:", type(a)) # aの型を表示 a = "hoge" # aに"hoge"を代入 型はstr print("type of a:", type(a)) # aの型を表示 a = "3" # aに"3"を代入 型はstr intでないことに注意 print("type of a:", type(a)) # aの型を表示 a, b = 3, -4.2 # 2つの変数を同時に代入している。 print("type of (a, b):", type(a), type(b)) a, b = 3, "3" print("type of (a, b):", type(a), type(b)) # aはint, bはstr 変数の代入は1文で2つの変数に代入したり、2つの変数に同じ値を代入する次のような書式でも可能です。 .. code-block:: python :caption: example-06 :linenos: a, b = 2.3, "3.2" # aに2.3, bに"3.2"を代入 a = b = 3 # aとb両方に3を代入 .. note:: type()やprint()は()に引数を与えて引数を表示させるpythonの標準関数です。関数の定義や使い方は、 :doc:`../03_関数とメソッド/03` で扱いますが、print()文の引数に変数を与えれば画面に出力、type()の引数に変数を与えれば引数を型を取得できると知っておけば良いでしょう。 整数(int)変数の定義 ------------------- 値が整数の場合、変数はint型にセットされます。 .. code-block:: python :caption: example-07 :linenos: H = 1 # Hの原子番号の定義 O = 8 # Oの原子番号の定義 .. 講義後に追加 ============ .. 大窪がメモしたファイルを置いておきます。参考にしてください。 :download:`第1回講義メモ <./第1回講義メモ.pdf>` .. アンケートの統計 ---------------- .. image:: 2018-10-03/statistics.png :width: 800px :align: center 浮動小数(float)型変数の定義 --------------------------- 値が浮動少数の場合はfloatにセットされます。float型は指数表現を使うことができます。「3e5」とは「3×10の5乗」のことであり「300000」と同じ値です。また「7.1e-4」とは「7.1×10の-4乗」のことで「0.00071」と同じ値です。値を \"\" で囲んだ場合は、str型になります。下例のように、整数値として 3 を代入する場合と \"3\" を代入する場合では、型が異なることに注意してください。 .. code-block:: python :caption: example-08 :linenos: s = "3" # sは文字列 i = 3 # iは整数型 c = 300000000.0 # float型で光の速度の定義 NA = 6.0221367e23 # float型でアボガドロ数の定義 文字(str)型変数の定義 --------------------- 文字列を **\"** で囲むことで文字列型の変数を定義できます。改行コード(\\n)や **\"** そのものを変数として定義したい場合は、 **\'** (single quotation) や **\\** (日本語キーボードの場合¥マーク)により文字をエスケープします。また改行も含めて文字を定義したい場合、 **\"\"\"** (double quotation3つ)を使います。例をみてみましょう。 .. code-block:: python :caption: example-09 :linenos: moji = "千葉" # ""で文字列の定義 print(moji) moji = "千葉は日本です。\ 日本はアジアです。" # 改行コードをエスケープしているのでエラーにならない。 print(moji) moji = "千葉は日本です\\。" # \を表示させるために、\を\でエスケープ print(moji) moji = "\"千葉\"" # \で"をエスケープ(文字として扱う) print(moji) moji = '"千葉"' # ''で""を含む文字列の定義 print(moji) moji = """私は千葉大生です。 勉強大好きです。 """ # 改行コードも文字として定義できる print(moji) 変数を使った演算 ================ 数学でおなじみの足し算、引き算、割り算、掛算は、演算子(\*, +, -, /, \*\*等)を 使ってできます。演算の優先順位のために()も使えます。intとfloat型の変数 に対して使える演算子は以下のとおりです。 .. csv-table:: :header-rows: 1 :widths: 4, 6, 10 "演算子", "例", "意味" "\*", "a \* b", "aとbの掛け算を行う。a×b" "/", "a / b", "aとbの割り算を行う。a/b" "\+", "a + b", "aとbの足し算を行う。a+b" "\-", "a - b", "aとbの引き算を行う。a-b" "\*\*", "a ** b", "aのb乗を計算する。a\ :sup:`b`\" "\%", "a % b", "aをbで割った余りを求める。 7 % 4 は3" "//", "a // b", "切り捨て除算を求める。 7 // 2 は3" 文字型の変数は、以下の演算子使って演算を行うことがでます。ただし、文字型に許される演算は、「\+」と「\*」の2つだけです。 .. list-table:: :header-rows: 1 :widths: 2, 4, 10 * - 演算子 - 例 - 意味 * - \+ - a + b - 文字列aと文字列bを連結する。\"ab\" + \"cd\" = \"abcd\" * - \* - a * b - 文字列aをn回繰り返します(nはint型)。4 * \"cd\" = \"cdcdcdcd\" 複数の演算子を作用させる場合は、優先順位があります。演算子の優先順位は以下のとおりです。 .. csv-table:: :header-rows: 1 :widths: 10 "1つの式での演算子の優先順位(高い順番)" "\*\*" "\* / % //" "\+ \-" 例えば :math:`3 + 4 \times 8` を計算する場合、以下のように書けば :math:`4 \times 8` が優先されます。 .. code-block:: python :caption: example-10 :linenos: a = 3 + 4 * 8 # 4×8を先に演算して3を足す print(a) # aは35 また、数式と同様に括弧を使えば演算が優先されます。 .. code-block:: python :caption: example-11 :linenos: a = (3 + 4) * 8 # 3+4を演算して8をかける print(a) # aは56 文字型変数対して、文字列同士の\+ と整数との掛け算以外の演算はエラーになります。 .. code-block:: python :caption: example-12 :linenos: a = "千葉" b = "大学生" print(a + b) # 千葉大学生の表示 print(3 * a) # 千葉千葉千葉の表示 print(4.0 * a) # これはエラー いくつか演算の例を以下にあげます。演算によって生じる結果も特定の型をもちます。同じ型同士の演算は、同じ型の結果を返します。int型とfloat型の演算(+ - / * ** )は、float型になります。 .. code-block:: python :caption: example-13 :linenos: a, b = 3, 7 # aとbはint c = a / b print("a/b:", type(c)) # int型とint型の割り算はfloat型 c = a * b print("a*b:", type(c)) # int型とint型の掛け算はint型 a, b = 3.2, 7 # aはfloat型、bはint型 c = a * b print("a*b:", type(c)) # aとbの掛け算はfloat型 変数aに、変数aを使った演算を行うことで変数aの内容を変更できます。以下の例をみてください。 .. code-block:: python :caption: example-14 :linenos: a = 3.0 # 変数aの定義 a = a + 1 # 変数aは、4(3.0 + 1 = 4)が代入される a = a - 3 # 変数aは、1(4.0 - 3 = 1)が代入される a = a * 4 # 変数aは、4 (1 * 4 = 4)が代入される a = a / 2 # 変数aは、2 (4 / 2 = 2)が代入される a = a + 1 のような変数aの値をupdateする演算は、プログラムの中で頻繁に使いま す。次のような単項演算子で短く書き直すこともできます。 .. code-block:: python :caption: example-15 :linenos: a = 3.0 # 変数aの定義 a += 1 # a = a + 1と同じ意味 a -= 3 # a = a - 3と同じ意味 a *= 4 # a = a * 4と同じ意味 a /= 2 # a = a / 2と同じ意味 変数を使ったいくつか計算をしてみます。「三平方の定理」を使って辺の長さを計算してみます。直角を含む三角形の直角をなす辺の長さを :math:`a, b` 、残りの辺の長さを :math:`c` とした場合、以下の関係があります。 .. math:: c^2 &= a^2 + b^2 c &= \sqrt{a^2 + b^2} 変数として :math:`a` と :math:`b` を与えて :math:`c` を計算するプログラムは以下のとおりになります。 .. code-block:: python :caption: example-16 :linenos: a = 10 # aの長さ b = 3 # bの長さ c = (10**2 + 1**2)**(0.5) # cの計算 print("c =", c) # cの表示 もう少し複雑な計算を行ってみます。 :math:`a, b, c` を与えて :math:`\alpha` を計算してみます。 :math:`a=3.0, b=2.3, c=-12.3` とします。 .. math:: \alpha = \frac{ a+b }{a\cdot c \cdot (b+c)^3} + (a + b)^{\frac{1}{3}}\cdot (b + c^2)^3 .. code-block:: python :caption: example-17 :linenos: a, b, c = 3.0, 2.3, 12.3 # a, b, cの定義 alpha = (a + b) / (b + c)**3 /a /c + (a + b)**(1 / 3) * (b + c**2)**3 # 分母を括弧でくくる print("alpha = ", alpha) 結果として :math:`\alpha` は6317047.042422106と求まります。 次のように分母と分子を括弧でくくったり、別々に書いても結果は同じです。 長い数式は、わかりやすく分割したり括弧を使って書く方が良いでしょう。 .. code-block:: python :caption: example-18 :linenos: a, b, c = 3.0, 2.3, 12.3 # a, b, cの定義 # 分子と分母、項1と項2を別々に計算する bunshi = a + b bunbo = a * c * (b + c)**3 term1 = bunshi / bunbo term2 = (a + b)**(1 / 3) * (b + c**2)**3 alpha = term1 + term2 print("alpha = ", alpha) 当然ですが、同じ結果が得られます。 クイズ ====== Q1 -- 次の変数a, b, c, d, eの型を表示しなさい。 .. code-block:: python :linenos: a = "3.0" b = 300000 c = 20000 d = b/c e = c * 1e-10 答え .. code-block:: python :linenos: a = "3.0" b = 300000 c = 20000 d = b/c e = c * 1e-10 print(a, type(a)) print(b, type(b)) print(c, type(c)) print(d, type(d)) print(e, type(e)) Q2 -- 変数x=0.3, y=2000000000, z=0.00000003を定義して、Aを以下の式を使って計算しなさい。 .. math:: A = \frac{x^2y^{\frac{1}{3}}}{(x + y + z)\cdot x} 答え .. code-block:: python :linenos: x, y, z = 0.3, 2e9, 3e-8 A = x**2 * y**(1/3)/(x + y + z)/x print(A) 問題3 ----- 以下のプログラムで定義されている変数aとbの演算より、文字列「千葉千葉千葉大学千葉千葉千葉大学」を作成して表示する。なお、単項演算子( += )を使ってください。 .. code-block:: python a = "千葉" b = "大学" 答え .. code-block:: python :linenos: a, b = "千葉", "大学" s = 3 * a s += b s += 3 * a s += b print(s) Q4 -- 圧力, 体積, 温度(:math:`P, V, T`)が与えられた時、 理想気体の状態方程 式を使って、モル数 :math:`n` を計算するプログラムを作成する。圧力, 体積, 温度 :math:`P, V, T` とガス定数 :math:`R` は以下のように与える。 .. math:: P &= 2.5\times 10^5\ {\rm Pa}\\ V &= 1.2\ {\rm m}^3\\ T &= 30 ℃\\ R &= 8.31451\ {\rm J/K\cdot mol} 答え .. code-block:: python :linenos: P = 2.5e5 # 圧力, Pa V = 1.2 # 体積, m3 T = 30 # 温度, K R = 8.31451 # ガス定数 T = T + 273.15 # degC -> Kelvin # PV=nRTよりn=PV/RT n = P * V/(R * T) print(n) Q5 -- 水分子1,000個が立方体の中に存在する。水の密度を :math:`\rho=1.0\ {\rm g/cm^3}` とした場合、立方体の1辺の長さを計算して Å(= :math:`10^{-10}\ {\rm m}`) で求める。なお水の分子量と アボガドロ数は、以下の数字を使う。 水の分子量 :math:`M_w` :math:`18.015280\ {\rm g/mol}` アボガドロ数 :math:`N_A` :math:`6.0221367 \times 10^{23}\ {\rm mol^{-1}}` 答え .. code-block:: python :linenos: NA = 6.0221367e23 # アボガドロ数 個/mol Mw = 18.015280 # 水の分子量 g/mol W = 1000 / NA * Mw # weight, g rho = 1.0 * 1e-24 # g/cm3 -> g/Å3 # rho = W/Vより V = W/rho V = W/rho # 体積, Å3 L = V**(1/3) # 立方体の長さ, Å # 出力 print("立方体の1辺の長さ", L, "Å") Q6 -- 変数sとtに文字「千葉」と「東京」をそれぞれ定義する。 空文字の変数k (k="")も定義する。 変数kをupdateし(演算子 +=等を使って)次の文字を表示させなさい。 .. code-block:: none 千葉東京千葉千葉千葉東京 ちなみに以下のような解答はダメです。 +=を使って変数sをupdateするプログ ラムを作ってください。 .. code-block:: python s, t = "千葉", "東京" print(s + t + s + s + s + t) 答え .. code-block:: python k, s, t = "", "千葉", "東京" k += s k += t k += s k += s k += s k += t print(k) .. 講義後に追加 ============ 大窪がメモしたファイルを置いておきます。参考にしてください。 :download:`第2回講義メモ <./第2回講義メモ.pdf>` .. アンケートの統計 ---------------- .. image:: 2018-10-10/statistics.png :width: 800px :align: center