乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

python

                 その先、仕事とか、研究にどう使えるの?




さて
プログラミングの基礎はいかがだったでしょうか?

まだ、ここまでの段階だと
プログラミングでどんなことができるかとか

どんなことに役立つのかとか・・
イメージが湧かない方の方が多いのではないかと思います。

なので、実際に仕事で使っているコードも見ながら
プログラミングがどういうものなのかを
改めて体験していただき、その後どうすれば良いか
というところを深く掘り下げて行きたいと思います。

ファイルの読み込み

In [1]:
# 同じ階層に配置してあるファイルの中身を表示する。
with open('sample.py') as _r:
    print(_r.read())
def hello(aa):
    print(aa)

CSVファイルの読み込み

In [2]:
# 結果を格納する変数を用意
res = []
# ファイルの読み込み
with open('sample.csv') as _r:
    for row in _r:
        # 改行を取り除き、カンマで区切って配列にする
        rows = row.replace('\n','').split(',')
        # 結果用の変数に追加
        res.append(rows)

print(res)
[['aaa', 'bbb', 'ccc'], ['ddd', 'eee', 'fff'], ['hhh', 'iii', 'jjj'], ['kkk', 'lll', 'mmm']]
In [3]:
for row in res:
    # タブ区切りで表示
    print('\t'.join(row))
aaa	bbb	ccc
ddd	eee	fff
hhh	iii	jjj
kkk	lll	mmm

webサイトへアクセスして情報取得

In [4]:
import requests

# webサイトへアクセスしてデータを取得
html = requests.get('http://yahoo.co.jp')

# 取得したデータの最初の800文字を表示
print(html.content.decode('utf-8')[0:800])
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。">
<meta name="robots" content="noodp">
<meta name="google-site-verification" content="fsLMOiigp5fIpCDMEVodQnQC7jIY1K3UXW5QkQcBmVs">
<link rel="canonical" href="https://www.yahoo.co.jp/" />
<link rel="alternate" media="only screen and (max-width: 640px)" href="https://m.yahoo.co.jp/">
<link rel="alternate" href="android-app://jp.co.yahoo.android.yjtop/yahooja

機会学習系のライブラリの利用

In [5]:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
In [6]:
# データフレームの作成
df = pd.DataFrame([[3,4],[4,5],[6,9],[2,8]],columns=['a','b'])
# データフレームを描画
df.plot()
Out[6]:
<matplotlib.axes._subplots.AxesSubplot at 0x10eed5f28>
In [7]:
df = pd.DataFrame([[3,4],[4,5],[6,9],[2,8]],columns=['1','2'])
# 散布図を描画
plt.scatter(df['1'],df['2'])
Out[7]:
<matplotlib.collections.PathCollection at 0x1122ec438>

scikit learn

In [8]:
import pandas as pd
# 必要なライブラリのインポート
from sklearn import datasets, model_selection, svm, metrics

# 有名なアヤメのデータの読み込み
iris = datasets.load_iris()
In [9]:
# アヤメのデータをデータフレームに変換する。
iris_data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
# 5行だけ表示
iris_data.head()
Out[9]:
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
05.13.51.40.2
14.93.01.40.2
24.73.21.30.2
34.63.11.50.2
45.03.61.40.2
In [10]:
# ラベルデータの読み込み
iris_label = pd.Series(data=iris.target)
# 5行だけ表示
iris_label.head()
Out[10]:
0    0
1    0
2    0
3    0
4    0
dtype: int64
In [11]:
# アヤメのデータを訓練データ、テストデータ、訓練ラベル、テストラベルに分ける。
train_data, test_data, train_label, test_label = model_selection.train_test_split(iris_data, iris_label)
In [12]:
# 訓練データ
train_data.head()
Out[12]:
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
705.93.24.81.8
1257.23.26.01.8
776.73.05.01.7
255.03.01.60.2
516.43.24.51.5
In [13]:
# 訓練ラベル
train_label.head()
Out[13]:
70     1
125    2
77     1
25     0
51     1
dtype: int64
In [14]:
#  訓練データとテストデータの個数
print(len(train_data), '\t',  len(test_data))
112 	 38
In [15]:
# SVM学習器の定義
clf = svm.SVC()

# 訓練データで学習
clf.fit(train_data, train_label)

# テストデータで予測
pre = clf.predict(test_data)

print(type(pre))
print(pre)
<class 'numpy.ndarray'>
[0 0 1 1 0 2 1 0 2 1 2 0 2 2 0 1 0 0 2 1 0 0 0 2 0 2 2 2 1 0 2 0 1 2 2 1 0
 1]
In [16]:
# 正答率
ac_score = metrics.accuracy_score(test_label, pre)
print(ac_score)
0.947368421053

最後に

プログラムを作る上で重要になるのが

「目的」です。

プログラミングの重要な部分は
プログラムに何をさせるかということです。

プログラムは手段であり、目的を達成するために
労力を下げるためのものになります。

プログラムを作る労力が目的を達成する時間を
上回っていたらプログラムを作る必要性はなくなります。

まずは目的を明確にして、ものすごく労力のかかる作業であれば
これをプログラムに落とし込む、ということを考えましょう。

すでに同じ機能を有するプログラムが存在していたら
実はプログラムを作る必要性というのは低いです。

こういうのを車輪の再発明といい、すでに有るものを再度作ろうと
試みるのは、無駄なことが多いです。

pythonでは大量のライブラリがあり
ほとんどの機能はそれで実現できると思います。

なので、プログラムを作る際に無駄なことをしないように、
下調べをしておくのも作業時間を減らす良い方法になります。

あくまでもプログラミングは目的を達成するための手段でしかありません。

恐らく仕事で使えるのは、「問題を解決する能力」の方だと思います。

プログラミングを続けると、
自然とこの「問題を解決する能力」が高まります。

この先は恐らくエラーが多発し、それを回避するために、
いろいろ調べたり、人に聞いたりしながら、コードを修正してゆくこととなるでしょう。

そういった経験の積み重ねが、研究や仕事をこなすための能力を高めてくれることでしょう。

この講座を学習したことが、みなさまの能力向上に一役買って頂けてると
とても幸いです。

pythonの基礎編は以上になりますが、この後は応用編や、
他の言語やミドルウェアや、クラウドサービスの使い方などの
講座も続けていきますので、ぜひそちらもチェックしてみてください。

                 39.基礎演習3




それではこれまでに学習した内容を踏まえて、
演習を行っていきましょう。

少し難しめに作ってありますので、
動画を止めながらゆっくり考えて解いてみてください。

第一問:

整数1から100までの和を求めるプログラムを作成してみましょう。

In [ ]:
 

第二問:

フィボナッチ数(0,1,1,2,3,5,8,13・・・)のように
最初の二項は 0, 1 で、以後どの項もその直前の2つの項の和
になるような数のフィボナッチ数と言います。

このフィボナッチ数を求める関数を作成しましょう。

3桁のフィボナッチ数までを表示させる関数にしましょう。

In [ ]:
 

第三問:

前項で取り扱ったrandomライブラリの関数を使って
英小文字のaからzか、数値0から9までの文字だけを使った
32桁の文字列を作成するプログラムを作ろう。

random.randint(最小値、最大値)でランダムな整数値が返せる。

In [ ]:
 

第四問:

aabacdcda

この文字列の「文字別」で集計してみよう。

In [ ]:
 

第五問:

「景子の夫」、「千鳥」、「メンタリスト」
この3つの文字列のうち、1つをランダムで返す関数を作って見ましょう。

In [ ]:
 

すぐに答えが出ない人は、動画を止めて考えてみましょう。

コツとしては何を入力したら、どう計算されて、どう出力されるのか
それを考えながら書いてみましょう。

答えはこの下に





回答

第一問:

整数1から100までの和を求めるプログラムを作成してみましょう。

In [1]:
res = 0
# range(1,101)で1から100まで
for i in range(1,101):
    # += で加算
    res += i
print(res)
5050
In [2]:
# 上記を内包表記で書くと
print(sum([i for i in range(1,101)]))
5050

第二問:

フィボナッチ数(0,1,1,2,3,5,8,13・・・)のように
最初の二項は 0, 1 で、以後どの項もその直前の2つの項の和
になるような数のフィボナッチ数と言います。

このフィボナッチ数を求める関数を作成しましょう。

3桁までのフィボナッチ数を表示させる関数にしましょう。

In [3]:
def fib():
    # まずはじめに変数を2つ用意する
    a = b = 1
    while True:
        print(b)
        # フィボナッチ数は直前の2つの項の和
        a, b = b, a+b
        # 3桁を超えたら抜ける
        if b>999:
            break
In [4]:
# 上記関数の実行
fib()
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987

第三問:

前項で取り扱ったrandomライブラリの関数を使って
英小文字のaからzか、数値0から9までの文字だけを使った
32桁の文字列を作成するプログラムを作ろう。

random.randint(最小値、最大値)でランダムな整数値が返せる。

In [5]:
import random

# 36個の英数字を用意する
words = 'abcdefghijklmnopqrstuvwxyz0123456789'

# 上記の中からランダムで返すのを32回繰り返して配列を作る
# その配列を join で連結して文字列に変換する
print(''.join([words[random.randint(0,35)] for i in range(32)]))
lfkj6bv913np7cq8fxzjjpfjv2u8qv0q

第四問:

aabacdcda

この文字列の「文字別」で集計してみよう。

In [6]:
# まずは集計対象の文字を用意
word = 'aabacdcda'

# 結果を格納するための辞書を用意
result_dict = {}
for w in word:
    # 文字があれば +1 なければ1で辞書に格納する
    if w in result_dict:
        result_dict[w]+=1
    else:
        result_dict[w]=1
print(result_dict)
{'b': 1, 'c': 2, 'a': 4, 'd': 2}

第五問:

「景子の夫」、「千鳥」、「メンタリスト」
この3つの文字列のうち、1つをランダムで返す関数を作って見ましょう。

In [7]:
import random

# 配列を用意する
daigo = ['景子の夫','千鳥','メンタリスト']

# 関数を作る
def random_daigo(daigo):
    # ランダムで整数値を返し、インデックスで上記配列の要素を返す。
    return daigo[random.randint(0,2)]

# 関数の実行
print(random_daigo(daigo))
千鳥

randomライブラリには直接1つの要素をランダムで返すという関数があります。

random.choice(配列)

In [8]:
import random

daigo = ['景子の夫','千鳥','メンタリスト']

def random_daigo(daigo):
    return random.choice(daigo)

print(random_daigo(daigo))
千鳥

さて、演習はいかがだったでしょうか?
あなたのwishは達成されましたか?

プログラミングができるようになると
そのwishを叶えることができるかもしれませんね。

プログラミングは
まずは真似してコードを書くこと、写経、が上達の鍵になります。
書いて書いて書きまくりましょう。

できなかったところは演習を復習してみてくださいね。

                 38.ライブラリの利用



プログラム言語には、他の人が作ったプログラムを利用したり、
自分が作ったプログラムを利用できるようにする便利な機能が備わっています。

それがライブラリです。

pythonでは仕事や研究などですぐに使えるライブラリが
数多く備わっており、機械学習や統計分析なども
ライブラリを用いて簡単に行うことができるようになっています。

ライブラリを使うのはすごくシンプルです。

ライブラリの読み込み方

import ライブラリ名

from パッケージ名 import ライブラリ名

それではライブラリを使っていきましょう。

ランダム値を作り出すrandomライブラリを読み込みします。

In [1]:
import random

ランダムの整数を生成する関数randint()の呼び出し。

random.randint(最小値 , 最大値)

In [2]:
random.randint(1,10)
Out[2]:
10
In [3]:
# ランダムのメソッドを10回呼び出す
for i in range(10):
    print(random.randint(1,10))
9
5
3
8
2
9
2
1
4
7

ライブラリは特定の処理を関数化しているものが多いです。

なおライブラリのことを別の呼び方で「モジュール」とも言います。

モジュールを読み込む、とかの表現が有ったら、
他のプログラムを読み込んでいると思って大丈夫です。

pythonの主なライブラリ

os ライブラリ

PCのファイルやディレクトリなどの操作ができる

In [4]:
import os
# 自分のPCのディレクトリのファイルやフォルダをリスト化する
print(os.listdir('/'))
['.DocumentRevisions-V100', '.file', '.fseventsd', '.PKInstallSandboxManager', '.Spotlight-V100', '.Trashes', '.vol', 'anaconda', 'Applications', 'bin', 'cores', 'dev', 'etc', 'home', 'installer.failurerequests', 'Library', 'Live2D_Cache', 'net', 'Network', 'opt', 'private', 'sbin', 'System', 'tmp', 'Users', 'usr', 'var', 'Volumes']

listdir 引数にディレクトリを指定するとそのディレクトリ内の
ファイルやフォルダがリスト値で返されます。

自分のPCのファイルやディレクトリを探したり、
ファイルの一覧を使って、特定のファイルを読み込みしたり、
操作するようなプログラムを書くのに役立ちます。

time ライブラリ

プログラム内での時間に関わる操作を行うライブラリ

In [5]:
import time
# 2秒間プログラムを止める
time.sleep(2)
print(2)
time.sleep(1)
print(1)
2
1

自作のライブラリの使い方

pythonファイルを作成すれば、自作のライブラリの読み込みができます。

importできるライブラリの拡張子は .py になります。

まずは簡単なpythonの実行ファイルを作りましょう。

このノートブックが置いてある
フォルダの中にpythonファイルを作っていきます。

sample.py

def hello(aa):
    print(aa)

pythonファイルを作成したら
ライブラリとして読み込み、メソッドなどが使えるようになります。

In [6]:
# 自作ライブラリの読み込み
import sample

# メソッドの呼び出し
sample.hello('hello')
hello

ライブラリは無数にあり、
anacondaでインストールした際には400種類くらいの
ライブラリが使えるようになっています。

そのライブラリの名称とかぶるとややこしいため
インストール済みのライブラリをみてみます。

macの場合はノートブック上で

! pip list

これでコマンドが実行できて、表示できます。

windowsの場合はコマンドプロンプトなどで
! をとって実行してみてください。

In [7]:
! pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
adal (0.4.5)
alabaster (0.7.10)
alembic (0.9.6)
anaconda-client (1.6.3)
anaconda-navigator (1.6.2)
anaconda-project (0.6.0)
appnope (0.1.0)
appscript (1.0.1)
argcomplete (1.0.0)
asn1crypto (0.22.0)
astroid (1.4.9)
astropy (1.3.2)
azure (2.0.0rc6)
azure-batch (1.0.0)
azure-common (1.1.6)
azure-datalake-store (0.0.12)
azure-graphrbac (0.30.0)
azure-keyvault (0.3.5)
azure-mgmt (0.30.0rc6)
azure-mgmt-authorization (0.30.0)
azure-mgmt-batch (1.0.0)
azure-mgmt-cdn (0.30.3)
azure-mgmt-cognitiveservices (1.0.0)
azure-mgmt-compute (0.30.0rc6)
azure-mgmt-containerregistry (0.2.1)
azure-mgmt-datalake-analytics (0.1.6)
azure-mgmt-datalake-nspkg (2.0.0)
azure-mgmt-datalake-store (0.1.6)
azure-mgmt-devtestlabs (2.0.0)
azure-mgmt-dns (1.0.1)
azure-mgmt-documentdb (0.1.3)
azure-mgmt-iothub (0.2.2)
azure-mgmt-keyvault (0.30.0rc6)
azure-mgmt-logic (1.0.0)
azure-mgmt-monitor (0.2.1)
azure-mgmt-network (0.30.0rc6)
azure-mgmt-nspkg (2.0.0)
azure-mgmt-rdbms (0.1.0)
azure-mgmt-redis (1.0.0)
azure-mgmt-resource (0.30.0rc6)
azure-mgmt-scheduler (1.0.0)
azure-mgmt-sql (0.5.3)
azure-mgmt-storage (0.30.0rc6)
azure-mgmt-trafficmanager (0.30.0)
azure-mgmt-web (0.32.0)
azure-nspkg (2.0.0)
azure-servicebus (0.20.3)
azure-servicefabric (5.6.130)
azure-servicemanagement-legacy (0.20.4)
azure-storage (0.20.3)
Babel (2.4.0)
backports.shutil-get-terminal-size (1.0.0)
bcolz (0.12.1)
beautifulsoup4 (4.6.0)
bitarray (0.8.1)
blaze (0.10.1)
bleach (1.5.0)
bokeh (0.12.5)
boto (2.46.1)
Bottleneck (1.2.1)
bs4 (0.0.1)
certifi (2017.4.17)
cffi (1.10.0)
chardet (3.0.4)
charts (0.4.6)
chest (0.2.3)
click (6.7)
cloudpickle (0.2.2)
clyent (1.2.2)
colorama (0.3.9)
conda (4.5.11)
conda-build (3.0.19)
conda-verify (2.0.0)
configobj (5.0.6)
contextlib2 (0.5.5)
coverage (4.4.2)
cryptography (1.9)
cssselect (1.0.1)
cycler (0.10.0)
cyordereddict (1.0.0)
Cython (0.27.2)
cytoolz (0.8.2)
dask (0.14.3)
datashape (0.5.4)
decorator (4.0.11)
dill (0.2.6)
distributed (1.16.3)
Django (1.10.6)
django-bootstrap3 (8.2.2)
django-crispy-forms (1.6.1)
django-debug-toolbar (1.8)
django-pure-pagination (0.3.0)
django-registration-redux (1.5)
django-storages (1.6.3)
django-torina-blog (0.5)
docutils (0.13.1)
dynd (0.7.3.dev1)
empyrical (0.3.2)
entrypoints (0.2.2)
et-xmlfile (1.0.1)
fastcache (1.0.2)
fbprophet (0.2.1)
filelock (2.0.7)
Flask (0.12.2)
Flask-Cors (3.0.2)
future (0.16.0)
gevent (1.2.1)
glob2 (0.5)
greenlet (0.4.12)
h5py (2.7.0)
HeapDict (1.0.0)
html5lib (0.999999999)
idna (2.5)
imagesize (0.7.1)
intervaltree (2.1.0)
ipykernel (4.6.1)
ipython (5.3.0)
ipython-genutils (0.2.0)
ipywidgets (6.0.0)
isodate (0.5.4)
isort (4.2.5)
itsdangerous (0.24)
Janome (0.3.5)
jdcal (1.3)
jedi (0.10.2)
Jinja2 (2.9.6)
jsonschema (2.6.0)
jupyter (1.0.0)
jupyter-client (5.0.1)
jupyter-console (5.1.0)
jupyter-core (4.3.0)
keyring (10.4.0)
lazy-object-proxy (1.2.2)
line-bot-sdk (1.0.2)
llvmlite (0.18.0)
locket (0.2.0)
Logbook (1.1.0)
lru-dict (1.1.6)
lxml (3.7.3)
Mako (1.0.7)
MarkupSafe (0.23)
matplotlib (2.0.2)
mistune (0.7.4)
mpmath (0.19)
msgpack-python (0.4.8)
msrest (0.4.11)
msrestazure (0.4.11)
multipledispatch (0.4.9)
navigator-updater (0.1.0)
nb-anacondacloud (1.4.0)
nb-conda (2.2.0)
nb-conda-kernels (2.1.0)
nbconvert (5.1.1)
nbformat (4.4.0)
nbpresent (3.0.2)
networkx (1.11)
nltk (3.2.4)
nose (1.3.7)
notebook (5.0.0)
numba (0.33.0)
numexpr (2.6.4)
numpy (1.12.1)
numpydoc (0.6.0)
oauthlib (2.0.2)
odo (0.5.0)
olefile (0.44)
opencv-python (3.4.5.20)
openpyxl (2.4.7)
packaging (16.8)
pandas (0.20.1)
pandas-datareader (0.5.0)
pandas-highcharts (0.5.2)
pandocfilters (1.4.1)
partd (0.3.8)
pathlib2 (2.2.1)
patsy (0.4.1)
pep8 (1.7.0)
pexpect (4.2.1)
pickleshare (0.7.4)
Pillow (4.1.1)
pip (9.0.1)
pkginfo (1.4.1)
plotly (2.3.0)
ply (3.10)
prompt-toolkit (1.0.14)
psutil (5.2.2)
psycopg2 (2.7.1)
ptyprocess (0.5.1)
py (1.4.33)
py-d3 (0.2.7)
PyAlgoTrade (0.18)
pyasn1 (0.2.3)
pycosat (0.6.3)
pycparser (2.18)
pycrypto (2.6.1)
pycurl (7.43.0)
pyflakes (1.5.0)
Pygments (2.2.0)
PyJWT (1.5.2)
pylint (1.6.4)
pyodbc (4.0.16)
pyOpenSSL (17.0.0)
pyparsing (2.1.4)
pystan (2.17.0.0)
pytest (3.0.7)
python-dateutil (2.6.0)
python-editor (1.0.3)
python-highcharts (0.4.1)
pytz (2017.2)
PyWavelets (0.5.2)
PyYAML (3.12)
pyzmq (16.0.2)
QtAwesome (0.4.4)
qtconsole (4.3.0)
QtPy (1.2.1)
redis (2.10.5)
requests (2.18.1)
requests-file (1.4.2)
requests-ftp (0.3.1)
requests-oauthlib (0.8.0)
rope-py3k (0.9.4.post1)
scikit-image (0.13.0)
scikit-learn (0.18.1)
scipy (0.19.0)
seaborn (0.7.1)
selenium (3.0.2)
setuptools (27.2.0)
simplegeneric (0.8.1)
singledispatch (3.4.0.3)
six (1.10.0)
snowballstemmer (1.2.1)
sockjs-tornado (1.0.3)
sortedcollections (0.5.3)
sortedcontainers (1.5.7)
Sphinx (1.5.6)
sphinx-rtd-theme (0.2.4)
spyder (3.1.4)
SQLAlchemy (1.1.9)
sqlparse (0.2.3)
statsmodels (0.8.0)
sympy (1.0)
tables (3.4.2)
tblib (1.3.2)
terminado (0.6)
testpath (0.3)
toolz (0.8.2)
tornado (4.5.1)
traitlets (4.3.2)
unicodecsv (0.14.1)
urllib3 (1.21.1)
wcwidth (0.1.7)
webencodings (0.5)
Werkzeug (0.12.2)
wheel (0.29.0)
widgetsnbextension (2.0.0)
wrapt (1.10.10)
xlrd (1.0.0)
XlsxWriter (0.9.6)
xlwings (0.10.4)
xlwt (1.2.0)
zict (0.1.2)
zipline (1.1.1)
You are using pip version 9.0.1, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

ライブラリの名称は、この名称と一緒でなければ大丈夫なので、
検索で引っかかったら、その名前は変えましょう。

自分の名前や、会社の名前とか、ニックネームとかを用いれば
ここら辺はカバーされるかと思います。

ライブラリの利用はプログラムでは当たり前のこととなっており、
自分でプログラムを書かずに、すでに使えるプログラムは
ライブラリから呼び出した方が賢明です。

どんなライブラリが使えるのか、
全てを紹介することはできませんので、基本編はここまで。

応用編ではよく使われるライブラリの使い方を
個別にやっていきたいと思っています

                 37.例外処理

今までの講義では何度かエラーの表示が出ていたかと思います。

例えば

In [1]:
# リスト型を定義
aqq = [1,2,3]
# インデックスで値を抽出
print(aqq[31])
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-1-4d1059cfba83> in <module>()
      2 aqq = [1,2,3]
      3 # インデックスで値を抽出
----> 4 print(aqq[31])

IndexError: list index out of range

リスト型のインデックスの範囲外の値を指定すると

list index out of range

エラーが発生します、リストの範囲外というエラー出力です。

こういったエラーが発生すると、
そこでプログラムは終了してしまいます。
なのでエラーを発生させないようにするか、
エラーが発生した場合の対処をする必要があります。

エラーの発生を抑えるのは困難なので、
エラーを回避する記述をすることで
プログラムを終了させないようにします。

それが例外処理になります。

pythonの例外処理の書き方

try:
    処理
except:
    例外時の処理

pythonでの例外処理は、
エラーが発生しそうな箇所を
try - exceptという文言で囲みます。

exception というのは例外という意味の英語です。
ぜひ覚えておいてください。

In [2]:
try:
    aqq = [1,2,3]
    # ここでエラーが発生する
    print(aqq[31])
except:
    # エラー発生時にはこちらが呼ばれる
    print('error')
error

エラーが発生した場合の処理を
exceptのブロックに書きます。

エラーが発生しても何も処理をしない場合は
何も書かないと構文エラーになってしまうので
pass と書いておきます。

In [3]:
try:
    aqq = [1,2,3]
    print(aqq[31])
except:
    # 何も処理を書か無いとエラーになる
  File "<ipython-input-3-c85aeb4f8051>", line 5
    # 何も処理を書か無いとエラーになる
                      ^
SyntaxError: unexpected EOF while parsing
In [4]:
try:
    aqq = [1,2,3]
    print(aqq[31])
except:
    # 処理が定まらない時はpassと書いておく
    pass

上記ではエラーが発生したことは確認できますが
何が起こっているのかは分からないです。

なのであらかじめエラーが想定できる場合は
エラーが発生した場合の処理を複数書くことができます。

try:
    処理
except エラー名:
    例外時の処理

In [5]:
try:
    aqq = [1,2,3]
    # ここでIndexエラーが発生する
    print(aqq[31])
except IndexError:
    # ここでIndexエラーをキャッチする
    print('index error')
except Exception:
    print('exception')
index error

except の後にエラー名を書くことで、
該当するエラーが発生した場合の処理を
書き分けることができます。

Indexエラーが発生すると分かっていれば
IndexErrorの部分の処理が実行されることになります。
Exception はすべてのエラーを拾います。

pythonのエラーの種類

ZeroDivisionError

数値を0で割ると発生

In [6]:
1/0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-6-05c9758a9c21> in <module>()
----> 1 1/0

ZeroDivisionError: division by zero

NameError

存在しない変数やメソッドを参照しようとすると発生

In [7]:
print(asokokoks)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-ed0c4fbe8f44> in <module>()
----> 1 print(asokokoks)

NameError: name 'asokokoks' is not defined

そもそもこれは文法間違いであるので、
try-exceptでは
あまり用いられない使い方です。

KeyError

辞書型のキーがない場合などに発生

In [8]:
d ={1:2,3:4}
print(d[5])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-8-bfd75dce33c0> in <module>()
      1 d ={1:2,3:4}
----> 2 print(d[5])

KeyError: 5

他にもたくさんのエラーが存在します。

pythonの組み込みエラーを表示します。

In [9]:
[i for i in dir(__builtins__) if 'Error' in i]
Out[9]:
['ArithmeticError',
 'AssertionError',
 'AttributeError',
 'BlockingIOError',
 'BrokenPipeError',
 'BufferError',
 'ChildProcessError',
 'ConnectionAbortedError',
 'ConnectionError',
 'ConnectionRefusedError',
 'ConnectionResetError',
 'EOFError',
 'EnvironmentError',
 'FileExistsError',
 'FileNotFoundError',
 'FloatingPointError',
 'IOError',
 'ImportError',
 'IndentationError',
 'IndexError',
 'InterruptedError',
 'IsADirectoryError',
 'KeyError',
 'LookupError',
 'MemoryError',
 'NameError',
 'NotADirectoryError',
 'NotImplementedError',
 'OSError',
 'OverflowError',
 'PermissionError',
 'ProcessLookupError',
 'RecursionError',
 'ReferenceError',
 'RuntimeError',
 'SyntaxError',
 'SystemError',
 'TabError',
 'TimeoutError',
 'TypeError',
 'UnboundLocalError',
 'UnicodeDecodeError',
 'UnicodeEncodeError',
 'UnicodeError',
 'UnicodeTranslateError',
 'ValueError',
 'ZeroDivisionError']

特に発生するエラーがわからない場合は
とりあえずtry - exceptで囲んでおいて、のちに
エラー内容に合わせて処理を追加してゆく、
というのが良いでしょう。

エラーの開始、例外処理はプログラムでは必須になるテクニックなので
必ず覚えておいてください。

                 36.クラスについて

前回はオブジェクト指向についての概念を説明しました。

オブジェクト指向の概念を学んだら、次は実際にpythonで
そのオブジェクトとなるクラスを作って見ましょう。

クラスの作り方:

class クラス名():
    def __init__(self,):
        処理

クラスの呼び出し方

変数名 = クラス名()

簡単なクラスを作ってみましょう。

In [1]:
class class_a():
    def __init__(self,):
        print('初期化')
        self.ac = 'aaa'

インスタンスとインスタンス化

インスタンスとは、クラスを実体化したものです。
クラスのデータやメソッドを使うためには
「インスタンス」と呼ばれるものを生成する必要があります。

クラスを呼び出して変数に格納します。

この事を「インスタンス化」
作った変数のことを「インスタンス」とも言います。

In [2]:
a = class_a()
初期化

ここでinitという関数の部分は
「コンストラクタ」と呼ばれるものになり、
クラスを生成する際に
一番初めに呼ばれる処理になります。

クラス呼び出して変数に格納した際に
init が呼ばれてその中の処理が実行されます。

このinitの処理の中では
引数に self という変数名がありますが
selfという変数は自分自身を指すもので、
クラスではこの引数は必須で
書かないとエラーになってしまいます。

initの処理の中ではself.ac という変数に値として 
aaa を代入しています。

これでこのクラスの中にacという変数を確保して、
値を代入したことになります。

クラスを生成した後に呼び出す部分で
この変数が使えるようになります。

クラスの変数やメソッドの呼び出し方

クラス変数名.メソッド名

In [3]:
aa = class_a()
print(aa.ac)
初期化
aaa

クラスの変数を追加して見ましょう。

In [4]:
aa.b = 2
print(aa.b)
2

クラスの中に変数 b が確保され、2という値が代入され
この変数を使いまわすことができるようになります。

このクラスに定義した変数のことを「アトリビュート」と呼んでいます。

クラスではコンストラクタとは別に関数も定義でき、
このクラス内に定義した関数のことをメソッドと呼んでいます。

メソッドを追加して見ましょう。

In [5]:
class class_a():
    def __init__(self,):
        print('初期化')
        self.ac = 'aaa'

    def anaa(self, ):
        print(1)
In [6]:
# クラスを呼び出して変数に格納
aa = class_a()
# クラスのメソッドを呼び出す。
aa.anaa()
初期化
1

このようにクラスとは複数のメソッドや変数を持つもの
オブジェクトということになります。

メソッドやアトリビュートは
そのクラスの中からしか呼び出すことができません。
クラスで定義した ac という変数はそのままでは使用できません。

In [7]:
print(ac)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-2faad1a56ed6> in <module>()
----> 1 print(ac)

NameError: name 'ac' is not defined

必ずクラス変数とともに使う事が必要になります。

In [8]:
print(aa.ac)
aaa

クラスはどのような時に使うのでしょうか?
それはプログラムの中で大きな処理をひとまとめにしたり
別のプログラムで使いまわしたいときなどに役立ちます。

一旦一つのプログラムとしてクラス化しておいて
別のプログラムでそれを使いまわすという使い方が一般的です。

クラスの継承

またクラスには継承という概念もあります。

まずは継承するものとされるものとして
親子のクラスを作り、その中にメソッドを作っておきます。

In [9]:
class oya():
    def oyano_method(self):
        print('oyano')

# 継承するクラスを引数に指定する
class ko(oya):
    def kono_method(self):
        print('kono')

この場合 子のクラスの方は引数として
親クラスを指定しておきます。

そうすることで子のクラスを生成すると、
親クラスのメソッドが使えるようになります。

In [10]:
# 子クラスを呼び出す。
k = ko()

# 子クラスで継承した親クラスが呼べる
k.kono_method()
k.oyano_method()
kono
oyano

このように子のクラスには無かった
親クラスのメソッドが呼び出せるようになります。

これは今までにあるクラスを派生させて、
新しいクラスを作りたい場合などに
用いることができる便利な機能です。

クラスの概念や、仕組みは覚えるまでは大変ですが、
覚えればプログラミングの幅が大きく広がるものとなりますので
ゆっくりと確実に覚えるようにしていってください

このページのトップヘ