Python 入門

この章では、プログラミング言語の一つであるPythonの基本的な使い方について述べる。

プログラミングスキルを上達させるコツは、たくさんのコードを書くことである。 以下に示すコードは全てColabで実行させ、その意味を考えること。

この章ではたくさんのコードを例示する。 コードは基本的には「セル」の中に表示されており、出力がそのすぐ下に表示される。

セル内の「#」始まる文章は理解を助けるためのコメントであり、Pythonには読み込まれない。

例えば

[1]:
# これは一行目のコメントである
spam = 1 # これは二行目のコメントで
        # これは3行目のコメントである。
text = '# この文章は、コーテーションの内側にあるためコメントではない。'

このようにして、適宜コメントを残しておくことができる。

なお、上の例の二行目は spam という変数に数字の1を割り当てるという意味である。

ほとんどのプログラミング言語では、このような 変数 を用いることができる。変数は基本的には数字や文字などを保持しておく入れ物のようなものであると考えてもらえればよい。

Pythonの変数は

  • 英字から始まる好きな文字列を用いることができる
  • 大文字と小文字は区別する
  • class などいくつかの文字列は予約されているため使うことができない

などが特徴である。 現在の変数に割り当てている内容は以下の print 関数などで確かめることができる。

[2]:
print(spam)
1
[3]:
print(text)
# この文章は、コーテーションの内側にあるためコメントではない。

Python を電卓として使う

Pythonは簡単な電卓のように使うことができる。 例えば四則演算は+,-,*, /を用いることで計算する。

数値

[4]:
2+2
[4]:
4
[5]:
50-5*6
[5]:
20
[6]:
(50-5*6)/4
[6]:
5.0
ここで,小数部がない「4」や「20」は文字通り整数である.
一方,「5.0」のように小数部が表示されているのは,Pythonの内部で結果が実数(浮動小数点数)として保持されていることを表す.浮動小数点数は8”バイト”のデジタルな値であることに起因して,
- その有効桁数は10進で15桁程度
- 扱える数値の絶対値が10の308乗程度の大きさまでであること

を頭の片隅にとめておくとよい.通常,これらのことが問題になることは少ないが,非常に精密な計算をしたり,巨大な値を扱う際に注意が必要になることがある.この浮動小数点数の構造については2回生配当の計算機数学で学習する.

またPythonでは指数も簡単に計算できる。

[7]:
5 **2 # 5の2乗
[7]:
25
[8]:
2**7 # 2の7乗
[8]:
128

以下は変数に計算結果を代入する例である。

イコール記号=は、変数に値を割り当てることを意味する。 この場合、結果は表示されない。

[9]:
width=20
height=5*9
width*height
[9]:
900

しかし、もし変数に何も値が割り当てられていない場合は、エラーになる。

[10]:
n # 値を割り当てていない変数nにアクセスしてみる
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-10-01c56600faee> in <module>()
----> 1 n # 値を割り当てていない変数nにアクセスしてみる

NameError: name 'n' is not defined

このようにエラーがでた場合は、その内容を確認すること。 ここでは 「NameError: name ‘n’ is not defined ( ‘n’ という名前が定義されていません)」とあるように、 定義していない変数を使おうとしたことによるエラーであることがわかる。


文字列

数値と同じように、Pythonは文字列も扱うことができる。 文字列はシングルコーテーション'...'もしくはダブルコーテーション"..."で囲むことで表現できる。

コーテーションで囲わない場合は、Pythonへの命令として扱われるため区別が必要である。

[11]:
'spam eggs' # シングルコーテーションを使う
[11]:
'spam eggs'
[12]:
'doesn\'t'
# コーテーション自体を扱いたい場合は \' というように「\(バックスラッシュ)」が必要である。
# なお、Windowsではバックスラッシュは半角の円マーク(¥)と表示されることがある。
[12]:
"doesn't"

文字列は、+記号で繋ぐことができる。

[13]:
'Py' + 'thon'
[13]:
'Python'

また、文字列中の各文字には[]記号を用いてアクセスすることができる。

なお、Pythonでは1番最初の要素にアクセスするためには0を与える(0から数える)。

[14]:
word = 'Python'
word[0] # 0番目の文字
[14]:
'P'
[15]:
word[5] # (0から数えて)5番目の文字
[15]:
'n'

また、インデックス([]内の数字)には、負の数を入れることができる。

[16]:
word[-1] # 最後の文字
[16]:
'n'
[17]:
word[-2] # 最後から二番目の文字
[17]:
'o'
[18]:
word[-6]
[18]:
'P'

このように特定の一つの文字にアクセスすることを「indexing(インデクシング)」と言う。

また、Pythonは特定の一部分にアクセスする「slicing(スライシング)」にも対応している。

[19]:
word[0:2] # 0番目から2番目にわたる部分(なお、2番目は含まれない)
[19]:
'Py'
[20]:
word[2:5] # 2〜5番目の部分
[20]:
'tho'

また、:の片側を記入しない場合は、残り全てという意味になる。

[21]:
word[:5]
[21]:
'Pytho'
[22]:
word[:2]
[22]:
'Py'
[23]:
word[:-2]
[23]:
'Pyth'

ただし、含まれる文字数以上の部分にアクセスしようとするとエラーになる。

[24]:
word[42]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-24-4d0f20275732> in <module>()
----> 1 word[42]

IndexError: string index out of range
[25]:
word[-10]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-25-3a39584f106f> in <module>()
----> 1 word[-10]

IndexError: string index out of range

リスト

Pythonには、複数の数値を同時に扱うことのできるリストという仕組みが用意されている。 リストを用いるには、以下のように[]で囲った中に、複数の数値を「,」で区切って含める。

[26]:
squares = [1, 4, 9, 16, 25]
squares
[26]:
[1, 4, 9, 16, 25]

リストは、文字列のようにインデクシング、スライシングが可能である。

[27]:
# インデクシング
squares[0]
[27]:
1
[28]:
# 負の整数を用いたインデクシング
squares[-1]
[28]:
25
[29]:
# スライシング
squares[-3:]
[29]:
[9, 16, 25]

リストは、文字列のように+記号で結合することができる。

[30]:
squares + [36, 49, 64]
[30]:
[1, 4, 9, 16, 25, 36, 49, 64]

リストの内容は書き換えることができる。

[31]:
cubes = [1, 8, 27, 65, 125] # 何かおかしい。
4 ** 3 # 4の3乗は65ではなく64
[31]:
64
[32]:
cubes[3] = 64 # 正しい値を、3番めの要素に代入する。
cubes
[32]:
[1, 8, 27, 64, 125]

さらに、リストの末尾に要素を加えることも可能である。

[33]:
cubes.append(216) # 6の3乗を加える。
cubes.append(7**3) # 7の3乗も加える。
cubes
[33]:
[1, 8, 27, 64, 125, 216, 343]

この操作ではリストの含む要素数が変化する。 リストがいくつ要素を持っているかはlen()関数で調べることができる。

[34]:
len(cubes) # cubes というリストの要素数を調べる
[34]:
7

リストの要素は、数値だけでなく、文字列、さらには別のリストとすることも可能である。

[35]:
a = ['a', 'b', 'c']
n = [1,2,3]
x = [a,n]

x
[35]:
[['a', 'b', 'c'], [1, 2, 3]]

インデックスを用いて要素を読みだす。

[36]:
x[0]
[36]:
['a', 'b', 'c']
[37]:
x[0][1]
[37]:
'b'

プログラミング学習の第一歩 ~ while ループ ~

Pythonは、上記のような命令よりさらに複雑なものにも応用できる。

例えば、次の例ではフィボナッチ数列を計算している。

なお、フィボナッチ数列は以下のように定義される数式である。

\[\begin{split}F_0 = 0, \\ F_1 = 1, \\ F_{n + 2} = F_{n} + F_{n + 1} \;\; (n ≧ 0)\end{split}\]
[38]:
# フィボナッチ数列。 2つの数値の和が、次の数値になる。
a, b = 0, 1
while b < 10:
    print(b)
    a, b = b, a+b
print('The loop ends')
1
1
2
3
5
8
The loop ends

ここでは、いくつか新しい内容が出てきている。

  • 1行目は、多重代入と呼ばれる操作である。abにそれぞれ0,1を代入している。
  • whileループが用いられている。while文は、ある条件(ここではb<10)が満たされている間、内部の命令を繰り返すものである。 ここでb<10は、bが10未満の時に真となり、そうでないときは偽となる。真と評価されている間はprint(b), a=b, b=a+bが繰り返される。
  • while文が繰り返す命令の範囲はインデントで示される。文頭に4文字分のスペースを明けている部分が繰り返し実行される(なお、キーボードのTabキーを押すことで、4文字分のスペースを入力できる)。
  • その次のprint(The loop ends)コマンドはインデントされていない。そのため、whileループが終わった後に一度だけ実行される。
  • print()関数print(b)print('The loop ends')は、括弧内の値(引数:ひきすう と呼ぶ)を画面に表示させる役割を持つ。 whileループにより繰り返し実行されるに従い、内容が毎回表示される。

毎回結果を表示させるよりも、リストに格納するほうがよい。

[39]:
a, b = 0, 1
fibonacci = [a] # 最初の要素のみが入ったリストを用意する。
while b < 1000:
    fibonacci.append(b) # リストにbの値を追加する。
    a, b = b, a+b # 現在のbの値と、現在のaとbの値から計算したa+bの値をそれぞれ aとbに代入する。
print(fibonacci)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

このような計算の結果は、数値を画面に表示させるよりも、その結果をグラフに表すほうが全体的な様子を理解しやすい。

最後に、この結果をグラフに描画する方法を学ぶ。


グラフ描画

グラフ描画にはいくつか「ライブラリ」と呼ばれるプロブラム機能をまとめたものが必要である。 Pythonのグラフ描画ライブラリの最も広く用いられているものは matplotlibというものである。

matplotlibを使えるようにするためには、以下のimport文を実行する。

[40]:
# この行は、notebook内にグラフを表示するために必要である。
%matplotlib inline

# 「matplotlib というライブラリのうち、pyplotというモジュールを`plt`という名前で利用する」という意味。
import matplotlib.pyplot as plt

# これらの命令はグラフを描画するときに毎回必要なわけではなく、一度実行するだけでよい。

plt.plot()という関数のひとつ目の引数にさきほど計算した結果を格納したリストを、 2つ目以降には、描画様式を与える。

  • '-': グラフを線で描く
  • 'o': グラフを丸印で描く
  • '-o': 丸印で線で結んだグラフ描く
[41]:
plt.plot(fibonacci,'-o')
[41]:
[<matplotlib.lines.Line2D at 0x7f11ec888710>]
../_images/src_tutorial1_71_1.png

フィのナッチ数列が急激に値が増加するものであることが実感できる。

値の小さいところを詳しく見るためには片対数グラフがよいだろう。

片対数グラフを描くには、plt.plot(fibonacci, 'o')の代わりに、plt.semilogy(fibonacci, 'o')を実行する。

[42]:
plt.semilogy(fibonacci,'-o')
[42]:
[<matplotlib.lines.Line2D at 0x7f11ec8976a0>]
../_images/src_tutorial1_73_1.png

フィボナッチ数列の値は、指数関数的に増加していることがわかる。

フィボナッチ数列の一般項は以下の式で与えられることが知られている。

\[F_n = \frac{1}{\sqrt{5}} \left\{ \left(\frac{1+\sqrt{5}}{2}\right)^n -\left(\frac{1-\sqrt{5}}{2}\right)^n \right\}\]

フィボナッチ数列の各項は整数であるのに対し、一般項に無理数である \(\sqrt{5}\) が出てくることは不思議に感じるかもしれない。 試しに \(n = 0, 1, 2\) などを代入してみるとよい。

課題1

\(f(n) = n!\)

となる\(f(n)\)の値を、\(n\in{1,...,10}\)に対し計算せよ。

さらにそれを片対数グラフに描画せよ。

[43]:
# 解答をここに記入する

課題2

Python における リストと文字列の共通点について述べよ。

[ ]:
# 解答をここに記入する