Open In Colab

1. Pythonの基本 その1:

授業の冒頭で説明するように、プログラミングによるデータ分析は、複雑なデータの取り扱いを簡単にしてくれたり、系統的な作業を可能にしミス(精度)をコントロールすることが出来たりと利点が多い。しかし、その恩恵を受けるためには基本的な事項をまず学修しなくてはならない。

この授業で重視するのはPythonの文法や作法、テクニックではない。というのも、自分が実現したい操作・作業をきちんと言語化することさえできれば、授業で扱う程度の内容であればググればだいたいのことは解決できるし、インターフェース(見た目)が違ったとしても別のプログラミング言語やデータ解析ツールにも応用が効く。

したがって、以降では「いったいなんのためにホニャララなんてものを導入(定義)するのか?」を意識しながら学習していくことにしよう。

1.1. 変数の定義と簡単な演算

「”値”に固有の名前(識別子)を付したもの」変数と定義する。

どのようなものが”値”として扱えるかは後で見ていくことにして、まずは代表的な値である実数値,整数を変数として定義してみよう。

a = 2.0 
b = 5
print(a)
2.0

これで変数aと変数bに値が代入され”定義”された。
プログラムでは通常、等号記号(=)は代入に使用される。値の代入は、等号の左に変数(値を入れたいものの名前)、等号の右に値を書くことで行う。

注: よく書籍などでは変数を箱と見立てて箱の中に数値や文字列を入れる説明もよく見られるが、変数は値が保管されるメモリ上の住所を示すものというのが正確。関連した話題としては、次の章のリスト操作の注意点を参照.

1.2. 簡単な演算

次に、上で定義された変数を使って四則演算をしてみよう。

足し算

a+b 
7.0

引き算

a-b
-3.0

掛け算 掛け算記号は*(アスタリスク)

a*b
10.0

割り算

a/b

演算した結果を別の変数cとして定義したり代入して保存しておくこともできる

c=a*b 

cの値が後で知りたいと思ったときは、以下のようにprint関数というものを使う

print(c)
10.0

変数の値を確認することは、プログラムが正しく動いているかを確認する最も単純かつ強力な方法である。
慣れないうちは「値はなんだっけな?」「何かおかしい、意図した動きと違うな」と思ったらprintしてみよう。

またコード部分に#(半角シャープ記号)をつけるとその行の#以降に書かれたことは無視されるのでコメント(注釈)を書いたりすることができる。

print("Hello") # Helloとプリントする(ここは読まれない)

なれないうちはどういった計算をするのかその行をいつ編集したのかなどコメントを逐一書いておくのも良い。

## 10月1日に編集
print(b//a) # 切り捨て除算 
print(b%a) # bをaで割った余り
print(a**b) # aのb乗

上の例で、#を忘れると

print("Hello") Helloとプリントする
  File "<ipython-input-1-477d89cfb689>", line 1
    print("Hello") Helloとプリントする
                              ^
SyntaxError: invalid syntax

構文エラー(SyntaxError)が発生する。 基本的にSyntaxError:あなたの書いたコードがPythonの文法上許されない書き方になっていることを意味している。

print("Hello")

は一見問題ないように見えるが、print関数の右側の括弧が全角になっているため、これもSyntaxErrorとなる。 細かな文法やエラーの原因の特定については、一緒に少しずつ慣れていこう。

一度定義した変数は、値を更新することもできる。

a = a + 2は、”aに2を加えた値”でaを再定義することを表し、a += 2 と書いても同じ結果が得られる。(+= を用いた書き方のほうがシンプルなので、今後多用します)

a = 2.0 
a += 4.0; print("2行目", a) 
a -= 3.0; print("3行目", a)
a *= 3.0; print("4行目", a)
a /= 3.0; print("5行目", a)

上では、セミコロン(;)で、複数のコードを1行に書くことができる機能を用いた。

1.3. 変数名に関する約束

この授業では変数名に全角文字(ひらがな・カタカナ・漢字)は使わず、文字列かコメントにのみ使うと約束をしよう。

#非推奨
=1.0
print()

上記のように、変数名にひらがな等を使用すること自体は可能で、Google Colaboratoryでも何も特別なことをしなくてもひらがなが使える。また、最近の多くのプログラミング言語は全角文字をサポートしている。 ただファイルの互換性などを考慮すると、一般にはひらがなや漢字など全角文字を変数に指定することは避けたほうが無難である。

また、変数名などにひらがなを使うことに由来して起こりがちなバグとしては「括弧()を間違って全角にしてしまってそれに気が付かない」といったことがある。コードを編集する際に日本語の変数などを利用していると、半角・全角の切り替え忘れなどが生じうるので、コードセルではなるべく半角英数字のみを使うというのが、ミスを防ぐための一つの方法にもなっている。

以降ではこの慣例にならって、変数名に全角文字は使わない。変数名は基本的に半角英数字, アンダースコア_のみで定義しよう。 +-%/=などの記号も使うことができない。たとえば-は既に引き算という演算を表すのに使用されているので、a-b という名前の変数を定義しようとしても、コンピュータにとっては変数ではなく[a マイナス b]という演算だと認識されてしまう。 また変数の頭に数字を使うこともできない。 例: 2a

a=5.0
a2 = a*2.0 #これはOK
2a = a*2.0 #これは構文エラー(SyntaxError)
  File "<ipython-input-2-a0feb3e303b1>", line 1
    2a = a*2.0 #これは構文エラー(SyntaxError)
     ^
SyntaxError: invalid syntax

その他、よくあるエラーについてはこちらを参照

1.4. Pythonでの文字列操作

Pythonでは、数値はもちろん文字列もとして扱うことができる。文字列は""(ダブルクォーテーション)か''(シングルクォーテーション)で囲むことで定義することができる。

text = "私の名前はXXXです" ## XXXのところを自分の名前にしてみましょう。
print(text)

文字列には、足し算や整数値との掛け算が適用できる。たとえば

text1 = "ティッシュ配りの"
text2 = "バイトを監視する"
print(text1 + text2) 

とすれば、text1text2にそれぞれ代入した2つの文字列を連結した一つの文字列を表示することができる。 また、

a = 2
print(str(a)+"人の"+text1+ text2 * 5 +"正社員")

とすれば、text2部分を5回繰り返して他の文字列とつなぎ合わせた長い文字列を作ることもできる。

1点注意点としては、整数値を代入したaを文字列として他の文字列と結合したいときは、 str()関数(strはstringの略)を使って、文字列に変換してやらなくてはならない。 これに関連して、後ほど変数のというものを勉強する。

また足し算と掛け算は定義できるが、文字列に対して引き算や割り算を行おうとするとエラーを吐く。

※もう少し詳細な文字列操作 replace関数,split関数,strip関数なども便利ですが、この章では省略します。以降の”ファイル・文字列操作”の章で扱います。

1.5. プログラムの実行順

基本的にプログラミングでは、上から処理が実行される。
(ループや関数が導入されると少し事情が異なり、ブロックと呼ばれる処理単位でまとめて実行されることもあるが、この点については、2・3章以降で追々見ていくことにしましょう)

以下の2行のコードは、実行するとエラーが出る。

print(num)
num=2
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-3-45ab67c52851> in <module>()
----> 1 print(num)
      2 num=2

NameError: name 'num' is not defined

理由は、エラーメッセージを読むと分かるように、numという変数が定義されていない(not defined/undefined)のに、その値をprintしようとしたからである。

もちろんnum=2の代入部分を含むコードを実行した後ならエラーはでない。

num=2
print(num)
2

とくにGoogle Colab(Jupyter Notebook)環境では、セルをまたいでコードを実行することがあるので、意図した変数の値がきちんと引き継がれているか注意が必要になる。また変数のスコープという概念にも注意が必要となる(関数を扱う第3章で解説します).

Jupyter Notebook環境では、セルのコードを逐次実行した場合コードセルの左側に表示される括弧[ ]内の整数でコードの実行順を確認することができる。コードやノートが複雑になってくると、正しい順番で実行しないとエラーが出たり、エラーは出ないけれど意図した出力にならないといった事が起こりえるので、注意が必要。慣れないうちは、処理(プログラム)をあまりバラバラのセルに書かず、一つにまとめて書くのがオススメ

良い例

a = 2
f = a**2 + 3*a + 1
print(f)

悪い例

a = 5
f = a**2 + 3*a + 1
print(f)

このようにコードを分けてしまうと、fでは最後にaに代入された値を用いて計算が行われるので、a=5のセルを実行し忘れると、意図した値にならない。(あるいは未定義ならエラーとなる)

1.6. 変数の型

プログラムの中で扱う変数には様々な”型”(type, タイプ)が存する。 代表的なものとしては、

  • float: 浮動小数点数(≒実数の有限桁内の近似)

  • int: 整数

  • str: 文字列 (stringの略)

  • bool: 真偽値 (下で説明します)

が挙げられ、この他にも様々な型が存在している。

たとえば以下のように変数の型はtype()という関数を使うことで調べることができる。

a=2
b=2.0
print( type(a), type(b))

a=2int(整数)型で、b(=2.0)はfloat、つまり浮動小数点(floating point)。

Pythonでは特定の型同士のみに許された特殊な演算等もある。変数の型が調べたくなったときはtype関数を使ってみよう。

1.6.1. プログラムでの実数の取り扱い

整数としての2(つまりint型の2)は理想的な整数2であるのに対して、float型の2.0というのは、
「コンピュータが扱える有限の精度のもとで十分2.0とみなせる値」という意味しか持たない。

変数aに以下の値を代入してprintしてみよう。

a = 2.00000000000000000000055511151231257827021181583404541015625
print(a)

コンピュータで実数値を表現する際、小数点以下の桁数を無限桁考慮するのは、機械にとっても大変なので、ある程度の精度で打ち切ることが必要になる。

Pythonで扱う実数値は、現在の世界標準であるIEEE 754という規格のもとで、十進数に換算して16桁程度の精度(倍精度実数の場合)の近似となっている、とザックリ理解しておけば当面は問題ないでしょう。

たとえば、0.30.1+0.1+0.1は、コンピュータが無限の精度を持っていれば(つまり0.3や0.1のあとに無限に0が続く数を扱うことができれば)等しい数になるべきだが、有限の精度を採用している都合上

print(0.3 - (0.1+0.1+0.1))
-5.551115123125783e-17

というように差をとると極小の値だけずれている事が分かる。

授業で扱う対象の場合は、この有限精度が実用上のトラブルを起こすことは無いはず。 一方で(研究等で)いわゆる数値計算を行う場合は、このようなごく小さな誤差が掛け算によって増幅され無視できない影響を引き起こすことがしばしばあるので、工夫や適切な処理が必要になることもある。

\(\clubsuit\) さらに進んだ注

コンピューターでは、0か1の二値を取るビット(bit)を最小単位として数値など各種の情報を表現して扱います。 たとえば整数値は、ビットを用いた表現と1対1対応させることができます。ビットが2つ使えるとするならば、[00]が1, [01]が2,[10]が3,[11]が4といった具合です。 (もちろん実際の対応関係とは異なり、あくまで一例です)

一方で実数は、いくらでも小さく分割できるため集合としては非可算無限(それぞれの値に、1対1対応する”番号”をつけることができない)となり、これをコンピューターで扱おうとすると、必ず何らかの”近似”が必要になります。 この近似の方法として通常用いられるのが、浮動小数点という考え方でありその標準を定めたものが前述のIEEE754となります。

1.7. 予約語

Pythonには、あらかじめ役割が与えられている言葉(予約語)があり変数名として使う事はできません。

実際にコード用のセルにこれらの語句を入力すると下記のように黒ではなく別の色で表示されます。このような場合は変数に別の名前をつけるようにしましょう。

# 予約語は色で分かる
False, None, True, and, as, assert, break,  
class, continue, def, del, elif, else, except,  
finally, for, from, global, if, import, in, is,  
lambda, nonlocal,not, or, pass, raise, return,  
try, while, with, yield

予約語の役割については登場したその都度説明します。

1.8. ブール(bool)

真偽値(bool,ブール)はTrue(真)とFalse(偽)の二値を取る型です。たとえば

a=2.0; b = 5.0

のとき、

print(a < b)  # aがbより小さいかどうか
print(a == b) # aがbと等しいかどうか プログラムでの等号は=ではなく==です。

これを考えるとなにが嬉しいかというと、ある条件をみたす(みたさない)ときだけ特定の作業をするプログラムを書くことが出来ます。

if a==b: 
    print("aとbが一緒だよ!!やったぜ!!!")
else:
    print("aとbが違うじゃないか!!!")

このような条件分岐の具体例については次の章で見ることにしましょう。