ここでは Jupyter-notebookを使って、Pythonの文法を学びます。
C言語やFortranのようなコンパイラ言語と異なり、 変数(オブジェクト)を定義する際にその型を指定する必要がありません。
.. ipython:: python x = 'Hello python!' y = 2 x y
上記の場合 x は文字列( str )であり、yは整数( int )となります。
オブジェクトの型を知りたい場合は、
.. ipython:: python type(x) type(y)
を実行してください。
なお、 type() 関数は、引数のオブジェクト型を返す関数です。
Python の基本的な型には主に以下のものがあります。
- 整数 (
int) - 浮動小数点実数 (
float) - 文字列 (
str) - リスト (
list) - タプル (
tuple) - 辞書 (
dict, 別名:連想配列)
Python はオブジェクト指向の言語であり、 実際には後ほど説明する NumPy などのパッケージに含まれる上記とは別の型(オブジェクト) を多用することになりますが、 ここではまず、上記の基本型を学びましょう。
Python は他のプログラム言語と同様、整数や浮動小数点といった型をサポートしており、 四則演算やべき乗等は一般的な書き方で計算できます。
.. ipython:: python 1 + 3 3.0 ** 2.0 # ** はべき乗を表します。 (1.0 + 3.0j) * 2.j # 複素数は、数字の末尾に j を付けることで表すことができます。
str は文字列を格納するオブジェクトです。
文字をシングルコーテーションもしくはダブルコーテーションで囲うことで文字列となります。
なお、3連のシングルコーテーションで囲うと、改行を含めた文字列として扱うことができます。
str オブジェクトの各要素にアクセスするためには、 [ ] 演算子を利用してください。
このように、連続的なオブジェクトに添字を用いてアクセスする方法を
Indexing (インデクシング)と呼びます。
.. ipython:: python x = 'Hello python!' x[0] x[2] x[-1]
Python の インデクシングには、以下の特徴があります。
- 一番最初の要素は 0 番目として数えられる(C言語と同様。Fortranと異なる)
- 負のインデクスを指定することで、末尾から数えることもできる。
例えば、インデクスとして
-1を指定すると、末尾の要素、-2を指定すると 末尾から2つ目の要素にアクセスでます。
さらに、同時に複数の要素にアクセスするスライシング(Slicing)も可能です。
.. ipython:: python x[1:4] x[:5] x[-3:]
1:4 という表記は、(0から数えて)1〜3番目の要素を示し、元のオブジェクトの部分要素が選択されることになります。
また、片方を省略した :5 などは、 0:5 と同じ意味です。
ここで x は文字列( str )ですが、文字列は以下のように + 記号で結合できます。
.. ipython:: python x2 = x + ' I love you !' x2
リスト(list)は複数のオブジェクトを格納するオブジェクトです。
[ ] 内に複数の要素をコンマ区切りで記述することで、リストオブジェクトを作成することができます。
なお、それぞれのオブジェクトは型が異なっても問題ありません。
.. ipython:: python z_list = [x, 3.0, x2] z_list
リストも、文字列の場合と同様に、インデクシングやスライシングに対応しています。
.. ipython:: python z_list[-1]
.append を用いることで、リストの末尾に新しいオブジェクトを追加することができます。
.. ipython:: python z_list.append(5.0) z_list
また、要素数は len 関数により知ることができます。
.. ipython:: python len(z_list)
タプル(tuple) はリストと似ていますが、
要素数が後から変更できないという点でリストと異なります。
() 内に複数の要素を記述するか、あるいは単純にコンマ区切りで記述することで、
タプルオブジェクトを作成することができます。
.. ipython:: python t = (1, 3.0, x) t a, b = 2.0, 3.0 # (a, b) に (2.0, 3.0) を代入しています a, b
辞書は連想配列とも呼ばれ、 リストと同様に複数の要素を格納できるオブジェクトです。 ただし、引数(キーと呼ぶ)に任意の(より厳密には、ハッシュ可能な) オブジェクトを用いることができる点でリストと異なります。 なお一般的には以下のように、文字列をキーにする場合が多いでしょう。
.. ipython:: python
d = {'a': 1.0, 'b': 3.0}
d['a']
d['c'] = 5.0 # 新しい要素を追加するには、単に新しいキーを指定して値を代入してください。
d
上記のように、{} 内に、キーと要素を : で対応させて記述することで辞書型のオブジェクトを作成できます。
この節では、Python の主な文法を簡単に紹介します。
C言語やFortran などでは例えば if 文の及ぶ範囲を {} や
IF - END IF で囲って表記します。
一方でPythonではそれらをインデントで表します。
なおインデントには4つのスペースを用いることが一般的です。
Pythonの if 文は以下のように、
if [条件] : と書き、条件が真の場合に実行する内容を
次の行から新たなインデントを用いて記述することになります。
if a < b:
print(a)while ループも同様に、繰り返し実行する内容をインデントにより区別して記述します。
while a < b:
a += 1
print(a)Python の for ループは、C言語や Fortran の do ループと少し異なります。 C言語や Fortran では整数を1ずつ増やしながら実行することが多いですが、 Python では リスト(やタプル)を1つずつ選択しながら、全ての要素に対して操作を繰り返すことになります。
.. ipython:: python
for z in z_list:
print(z)
上記は、 z_list の各要素を1つずつzに代入してインデントで表されたコードブロックを実行する、
という操作を z_list の最初の要素から最後の要素まで繰り返しています。
C言語やFortranのforループと同様の操作は、
0から指定した値までの整数を順に並べたオブジェクトを返す range 関数を用いることで実現できます。
.. ipython:: python
for i in range(len(z_list)):
print(z_list[i])
ソースコードは一般的に、短いほど可読性が上がります。 Pythonには内包表記と呼ばれる記述方法があります。 これは、ループ構造を簡略的に記述するもので、簡単な操作を行う時によく用いられます。
.. ipython:: python x_list = [1.0, 2.0, 4.0] y_list = [x**2 for x in x_list] y_list
上記の例の2行目は、
x_list から 1つ要素を取ってきて x に代入し、
それぞれの二乗の値を要素にもつリストを y_list に代入する、という意味であり、
以下を一行で記述したものに相当します。
.. ipython:: python
y_list = []
for x in x_list:
y_list.append(x**2)