Python入門 - 目次
PyhonでAI入門 Tensor Flowを使ってみよう 準備編1
AIとは何か
AIとは、Aritificial Intelligenceの略で、人工知能のことです。よく映画とかに出てくるような、ロボットが自分で考えたり喋ったりするようなやつです。そんな未来的で、高度に専門的なAIのプログラミングをするなんで、とても難しそうで、たくさん勉強しないと手が出なさそうですよね。
しかし、実はそんなAIのプログラムを簡単にできるオープンソースのAIライブラリが世の中には存在します。すごいですね。
Tensor Flow
Telsor Flow(テンソルフロー)とは、あのGoogleがオープンソースソフトウェアとして公開している「スケーラブルな機械学習のための、データフローグラフを利用した数値計算ライブラリ」です。
公式サイト(英語):TensorFlow
「スケーラブルな・・・」と言われても、何のことかよくわかりませんね。Tensor FlowはAIを実現するための技術の一種である、「機械学習」「ディープラーニング」「多層ニューラルネットワーク」といった、コンピュータにものを覚えさせる(学習させる)ためのライブラリになります。
「スケーラブル」なというのは、スマホ、PCなど様々なコンピュータのリソースに合わせて、うまいこと処理してくれるというような意味合いです。また、Tensor Flowでは、CPUオンリーで処理するバージョンとCPUとGPUを組み合わせることのできるバージョンばあります。この二種類のバージョンを、ソースコードを変更することなく切り替えることができます。
ちなみにライセンスは「Apache 2.0ライセンス」だそうです。
Tensor Flowの構成
Tensor Flowのライブラリのコア部分はC++でプログラミングされています。このコア部分を簡単に利用できるようにPythonのインターフェースが用意されています。ですので、Pyhonを利用して気軽にTensor Flowを利用できるわけです。
また、コア部分はC++なので、必要があれば、低レベルな処理をゴリゴリとプログラムすることも可能です。
Tensor Flowを使ってみる!
まずは、Tensor Flowをインストールして、チュートリアルを動かしてみたいと思います。そのあと、いろんなことをちょっとずつ試していけたらなーと考えています。
Python入門 - 例外処理
例外処理とは何か?
プログラム初心者の方は、「例外処理」と聞いても、何のための処理なのか、何をする処理なのかよくわからないと思います。そこで、まず例外処理について説明しようと思います。
Pythonには、「プログラムの実行中に何かのエラー(例外)が発生した時」に「うまくエラーに対応した処理をするため」、「エラーの発生をキャッチする仕組み」があります。この仕組みを使ってエラー発生時の処理をすることを「例外処理」と呼びます。
例えば、nothing.txtというファイルが存在しない状態で、次のようなプログラムを実行してみましょう。
サンプルコード
f = open('nothing.txt', 'r')
実行結果
Traceback (most recent call last):
File "*******.py", line 1, in
f = open('nothing.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'nothing.txt'
この「FileNotFoundError」というのは、読んで字のごとく、「ファイルが見つかりませんでした」というエラーです。これは、存在しないnothing.txtを読み込もうとしたがら発生しました。実際にnothing.txtがあるのかないのかは、プログラムをしたタイミングではわかりません。実際にプログラムを実行した時にファイルがあるかどうかが問題だからです。
このような、「プログラム実行時に発生するエラー」に「例外処理」を使って、うまく対応していきます。
例外処理の使い方
さて、それでは例外処理の使い方を説明します。
書式
try:
例外が発生するかもしれない処理
例外が発生するかもしれない処理
・・・
except 例外のタイプ
例外が発生した時の処理
例外が発生した時の処理
・・・
サンプルコード
try:
f = open('nothing.txt', 'r')
print(f.read())
print('read nothing.txt');
f.close()
except FileNotFoundError:
print('error!')
print("=========")
try:
f = open('readme.txt', 'r')
print(f.read())
print('read readme.txt')
f.close()
except FileNotFoundError:
print('error!')
実行結果
error!
=========
1st line
2nd line
last line
read readme.txt
サンプルのように、例外処理をすると、例外が発生してもプログラムが異常終了することはなくなります。また、例外が発生すると、その後の行は実行されず、すぐにexceptに処理が移ります。
また、例外が発生しないと、exceptブロックの処理は実行されません。
複数の例外処理をする
1つのtryブロックと組み合わせられるexceptブロックは1つだけではありません。例外のタイプによって複数exceptブロックをつけることができます。ファイルの中には、以下のデータが入っているとします。
ファイルの中身
10
20
30
fourty
50
サンプルコード
try:
f = open('readme.txt', 'r')
sum = 0
for line in f:
sum += int(line.strip())
print(sum)
print('read readme.txt')
f.close()
except FileNotFoundError:
print('file not found!')
except ValueError:
print("line is not int")
実行結果
10
30
60
line is not int
このサンプルは、ファイルの中身を読み取って数値に変換して足していくプログラムです。途中までは順調に実行できますが、途中に数値に変換できない文字列が含まれています。これを変換しようとすると「ValueError」が発生します。ValueErrorのexceptブロックのみが実行されているのがわかると思います。
ところで、このプログラムには重大な問題があります。それは、tryブロックの途中で例外が発生すると、f.closeが実行されなくなってしまうという問題です。これでは、ファイルが開きっぱなしになってしまいます。
このような状態に対処するために、Pythonにはクリーンアップ処理の仕組みが存在します。
クリーンアップ処理
クリーンアップ処理とはtryブロック内の処理が、エラーが出て終了した場合も、エラーが出ないで終了した場合も、どちらでも必ず実行される処理のことです。終了時に必要なファイルを閉じる処理などを行います。
サンプルコード
import sys
try:
f = open('readme.txt', 'r')
except FileNotFoundError:
print('file not found!')
sys.exit(1)
try:
sum = 0
for line in f:
sum += int(line.strip())
print(sum)
print('read readme.txt')
f.close()
except ValueError:
print("line is not int")
finally:
f.close()
print('clean')
実行結果
10
30
60
line is not int
clean
サンプルのようにfinallyブロックをつけるとクリーンアップ処理を実行できます。
また、ファイルを開けなかった場合の処理を別に分けたのには理由がります。ファイルを開けなかった、つまり「 f 」にオブジェクトが代入されなかったにもかかわらず、f.closeを実行してしまうとエラーになってしまうためです。
Python入門 - ファイル入出力(テキストファイル)
ファイルIO
この記事では、ファイルIO、つまりファイルの読み書きについて解説したいと思います。ファイルの読み書きができれば、プログラム内部のデータをファイルに保存したり、次回プログラムを起動した時にそのデータを読み込んだりできます。
いわゆるセーブ&ロードもできるようになるというわけです。
テキストファイルの読み込み
まずは、自分が作業しているディレクトリ(pyファイルがあるフォルダ)に、readme.txtというテキストファイルを作成しましょう。テキストファルルの中には、次のようば文字列を書いておきます。
1st line
2nd line
last line
テキストファイルの読み込みには、open関数tを利用します。open関数で開いたファイルからread関数でファイルの中身を読み込みます。open関数の第一引数は「ファイル名」、第二引数は「モード」です。モード'r'は、readモードです。ファイルを使い終わったら、「必ず」ファイルを閉じます。ファイルを閉じるにはclose関数を利用します。
サンプルコード
f = open('readme.txt', 'r')
print(f.read())
f.close()
実行結果
1st line
2nd line
last line
また、read関数は、一度にどれだけ読み込むか指定できます。最後まで読み込み終わると、空行「""」を返します。
サンプルコード
f = open('readme.txt', 'r')
print(f.read(5))
print('----------')
print(f.read(10))
print('----------')
print(f.read(20))
print('----------')
print(f.read(10))
f.close()
実行結果
1st l
----------
ine
2nd li
----------
ne
last line
----------
一行ずつ読み込むには、readline関数を使ったり繰り返しを使います。
サンプルコード
f = open('readme.txt', 'r')
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
実行結果
1st line
2nd line
last line
readlineは各行lの最後にある改行文字「¥n」をそのまま残します。そのため、実行結果はファイルの行にある改行とprintの改行で2重に改行されています。
次は繰り返しを使う方法です。
サンプルコード
f = open('readme.txt', 'r')
for s in f:
print(s)
f.close()
実行結果
1st line
2nd line
last line
テキストファイルの書き込み
ファイルにテキストを書き込むには、open関数のモードを'w'(write)にします。'w'はファイルがすでに存在する場合、ファイルを上書きします。ファイルの最後から追記する場合はモードを'a'(append)にします。
また、書き込み用メソッドとしてwriteとwritelinesがあります。writelinesはシーケンスようです。紛らわしいですが、どちらも自動では改行されません。後ろのそのまま連結されていきます。
サンプルコード
f = open('writeme.txt', 'w')
f.write('1st ')
f.write("line\n")
f.writelines(['2nd line\n', 'last line'])
f.close()
f = open('writeme.txt', 'r')
for s in f:
print(s)
f.close()
f = open('writeme.txt', 'w')
f.write('2: 1st line\n')
f.write('2: 2nd line\n')
f.write('2: last line\n')
f.close()
print('-----------')
f = open('writeme.txt', 'r')
for s in f:
print(s)
f.close()
f = open('writeme.txt', 'a')
f.write('3: 1st line\n')
f.write('3: 2nd line\n')
f.write('3: last line\n')
f.close()
print('-----------')
f = open('writeme.txt', 'r')
for s in f:
print(s)
f.close()
実行結果
1st line
2nd line
last line
-----------
2: 1st line
2: 2nd line
2: last line
-----------
2: 1st line
2: 2nd line
2: last line
3: 1st line
3: 2nd line
3: last line
前の入門記事
次の入門記事
Python入門 - 文字列のフォーマット出力
フォーマット出力とは
今までは、print関数を利用して文字列や数字を個別に出力していきました。しかし、文字列を数値を組み合わせて表示したい場面はたくさんあります。例えば、次のような文字列です。
「date 10/2 time 3:30」
そのように、様々でデータを文字列に変換する仕組みをフォーマット出力と言います。データを指定した書式(フォーマット)で出力するからです。
Pythonには、フォーマット出力のための仕組みがいくつかありますが、ここではstr.format()を利用したフォーマット出力について説明します。
str.format
str.formatは文字列に用意された関数です。str.format関数に渡された引数を、様々な書式で文字列に変換します。
まずは、基本的な使い方をみてみましょう。
サンプルコード
month = 10
day = 2
hour = 3
min = 30
print('date {}/{} time {}:{}'.format(month, day, hour, min))
実行結果
date 10/2 time 3:30
「{ }」の中カッコの部分に、formatに渡した引数が 順番に文字列に変換されて入ります。この「{ }」は番号をつけて順番を指定することもできます。
サンプルコード
month = 10
day = 2
hour = 3
min = 30
print('date {2}/{1} time {0}:{3}'.format(month, day, hour, min))
実行結果
date 3/2 time 10:30
フォーマット指定子
str.formatでは、引数として渡したデータを、どのように文字列に変換するかを詳細に指定するdことができます。これは、「フォーマット指定子」を利用します。
サンプルコード
import math
print('pi={0}'.format(math.pi))
print('pi={0:.4}'.format(math.pi))
実行結果
pi=3.141592653589793
pi=3.142
このサンプルコードのように、フォーマット指定子は「: (コロン)」の後ろにしています。フォーマット指定子には、いくつか種類があります。
まずは、幅指定と詰め文字の指定です。
サンプルコード
print('left {0:<10}'.format('format')) #左詰
print('center {0:^10}'.format('format')) #中央寄せ
print('right {0:>10}'.format('format')) #右詰
print('fill {0:->10}'.format('format')) #右詰で「-」で埋める
print('zero fill {0:0>10}'.format('123435')) #右詰で「0」で埋める
実行結果
left format
center format
right format
fill ----format
zero fill 0000012345
次に数値の指定です。
サンプルコード
print("10進数 {0:d}, 16進数 {0:x}, 8進数 {0:o}, 2進数 {0:b}".format(30))
print("小数4桁 {0:.4f}".format(123.456789))
実行結果
10進数 30, 16進数 1e, 8進数 36, 2進数 11110
小数4桁 123.4568
Python入門 - 組み込み関数
組み込み関数とは?
組み込み関数とは、Python本体に直接組み込まれている関数のことです。「組み込まれている」という言い方に馴染みがないかもしれませんが、言い換えると「もともと入っている」くらいの意味です。
逆にいうと、もともとPythonに入っていない関数が何かというと、例えば自分で作った関数とか、他の人が作ってフリーで公開しているライブラリになります。
組み込み関数と勘違いしやすいものに、標準ライブラリがあります。標準ライブラリはPythonをインストールすると、自動的についてくるのでPythonに組み込まれているように感じます。しかし、実際はPython本体とは別のものです。
よく使う組み込み関数の一覧
まずは、リファレンスへのリンクを貼っておきます。
日本語: 2. 組み込み関数 — Python 3.5.2 ドキュメント
組み込み関数といってもたくさんあります。全て知っている必要はないと思いますし、丸暗記するようなものでもありません。必要になったら調べればいいだけですから。
とはいえ、よく使うような組み込み関数は「そういえばそんなのあったな」くらいに覚えておくと便利だと思います。そんなよく使う関数をリストにしてみました。
よくわからない言葉とかもあるかもしれませんが、とりあえず「そんなのあるんだな」でいいと思います。
ただ、iterable(イテラブル)だけよく出てくるので説明します。iterableは構成要素を一つずつ取り出せるオブジェクトのことです。言葉の説明だけだとわかりにくいかもしれませんが、具体的にはシーケンスやセット、マッピングなどのことです。
- abs(x) xの絶対値を返す
- all(iterable) 「iterableの要素が全てtrue」または「iterableが空」のとき、trueを返す
- any(iterable) 「iterableの要素のいずれか一つでもtrue」のとき、trueを返す
- filter(function, iterable) iterableのうち、functionがtrueになるものだけで構成されるiterableを返す
- input(prompt) 標準入力(通常はキーボード)からの入力を受け取る
- isinstance(object, classinfo) objectがclassinfoのインスタンスであればtrueを返す
- issubclass(class, classinfo) classがclassinfoのサブクラスであればtrueを返す
- len(s) sの要素数を返します。sはシーケンス、セット、マッピングのいずれかです
- map(function, iterable) 全てのiterableにfunctionの処理を行った結果で構成される新しいiterableを返す
- max(iterable) max(arg1, arg2, ・・・) 「iterable」「arg1, arg2, ・・・」の中で最大のものを返す
- min(iterable) min(arg1, arg2, ・・・) 「ierable」「arg1, arg2, ・・・」の中で最小のものを返す
- open(file, mode) ファイルを開いて、ファイルを読み込んだり書き込んだりする
- pow(x, y) xのy乗を返す
- print(objects, sep='', end='¥n', file='sys.stdout', flash=False) objects(引数の数は幾つでもOK)をsepで区切ってfileに書き込む。最後にendを書き込む
- reversed(sep) 要素を逆順に取り出すイテレータを返す
- round(number, nDigits) numberを小数点nDigits桁以下を切り捨てた浮動小数を返す。もしnDigitsを省略した場合は、小数点以下を切り捨てた整数を返す。
- sorted(iterable) iterableをソートしたものを返す
- sum(iterable) iterableの合計を返す
Python入門 - 継承と包含 使い方編
継承の使い方
前回の記事で、継承の考え方を説明してきました。
その継承の考え方を、Pythonではどのように実現しているかをみていきましょう。
継承には、スーパークラスとサブクラスの2種類のクラスが登場します。
スーパークラスには、特別な作り方はなく、普通にクラスを作成すれば大丈夫です。
サブクラスでは、どのクラスを継承するかを指定する必要があります。
書式
class サブクラス名(スーパークラス名):
サブクラスのメンバ変数やメソッッド
サブクラスのメンバ変数やメソッッド
・・・
サンプルコード
class Animal:
def __init__(self, name):
self.name = name
def eat(self, food):
print('Animal:' + self.name + ' eat ' + food)
class Bird(Animal):
def fly(self):
print(self.name + ' Flies!')
class Human(Animal):
def useFire(self):
print(self.name + ' Uses fire!')
swallow = Bird('swallow')
swallow.eat('warm')
swallow.fly()
someone = Human('someone')
someone.eat('beef')
someone.useFire()
実行結果
Animal:swallow eat warm
swallow Flies!
Animal:someone eat beef
someone Uses fire!
継承の仕方はとても簡単ですね。サブクラス名の後ろにかっこでスーパークラス名を書くだけです。
BirdとHumanはどちらもAnimalを継承しています。そのため、スーパークラスであるAnimalのメソッドであるeatをBirdのオブジェクトもHumanのオブジェクトも使うことができます。メンバ変数やコンストラクタも同様で、Animalのメンバ変数nameやコンストラクタを利用できます。
また、Birdのflyメソッドのようにサブクラス独自のメソッドやメンバ変数も追加できます。
オーバーライド
前のサンプルでは、スーパークラスのメソッドをそのまま利用しました。
しかし、実際にはスーパークラスのメソッドに、サブクラス独自の改造を加えたい場合もあります。そのようたとき、メソッドの「オーバーライド」をすることができます。スーパークラスのメソッドをサブクラスで「上書き」するということです。オーバーライドするには、「サプクラスでオーバーライドしたいメソッド」を「スーパークラスと同じメソッド名で定義」します。
サンプルコード
class Animal:
def __init__(self, name):
self.name = name
def eat(self, food):
print('Animal:' + self.name + ' eat ' + food)
class Bird(Animal):
def eat(self, food):
print('Bird:' + self.name + ' eat ' + food)
def fly(self):
print(self.name + ' Flies!')
class Human(Animal):
def eat(self, food):
print('Human:' + self.name + ' eat ' + food)
def useFire(self):
print(self.name + ' Uses fire!')
swallow = Bird('swallow')
swallow.eat('warm')
swallow.fly()
someone = Human('someone')
someone.eat('beef')
someone.useFire()
実行結果
Bird:swallow eat warm
swallow Flies!
Human:someone eat beef
someone Uses fire!
継承時の__init__
サブクラスに、「サブクラス独自のメンバ変数を追加したい」とか「最初に設定する値を変更したい」時にどうしたらいいかを説明したいと思います。
やり方は簡単で、スーパークラスのコンストラクタを呼び出したあとで、サブクラスで独自にやりたいことを追加するだけです。
サンプルコード
class Animal:
def __init__(self, name):
self.name = name
def eat(self, food):
print('Animal:' + self.name + ' eat ' + food)
def printName(self):
print('Name: ' + self.name)
class Human(Animal):
def __init__(self, name, age):
Animal.__init__(self, name)
self.name = 'Human:' + name
self.age = age
def eat(self, food):
print('Human:' + self.name + ' eat ' + food)
def useFire(self):
print(self.name + ' Uses fire!')
def printAge(self):
print(self.age)
someone = Human('someone', 20)
someone.printName()
someone.printAge()
実行結果
Name: Human:someone
20
isinstance
プログラミング言語的には、クラスを作るというのは、オリジナルのデータ型を定義することになります。あるオブジェクトが、どのデータ型のものなのかを確認する方法に「isinstance」があります。
たくさんクラスを作っていくと、クラスの種類(データ型の違い)によって処理を分けたりしたい場合も出てくるかもしれません。そういった時に「isinstance」を使います。
サンプルコード
class Animal:
def __init__(self, name):
self.name = name
def eat(self, food):
print('Animal:' + self.name + ' eat ' + food)
def printName(self):
print('Name: ' + self.name)
class Bird(Animal):
def eat(self, food):
print('Bird:' + self.name + ' eat ' + food)
def fly(self):
print(self.name + ' Flies!')
class Human(Animal):
def __init__(self, name, age):
Animal.__init__(self, name)
self.name = 'Human:' + name
self.age = age
def eat(self, food):
print('Human:' + self.name + ' eat ' + food)
def useFire(self):
print(self.name + ' Uses fire!')
def printAge(self):
print(self.age)
someone = Human('someone', 20)
animal = Animal('animal')
bird = Bird('bird')
print(isinstance(someone, Human))
print(isinstance(someone, Animal))
print(isinstance(Animal, Human))
print(isinstance(bird, Animal))
print(isinstance(bird, Human))
print(isinstance(1, int))
print(isinstance(123.45, float))
print(isinstance([1, 2, 3], list))
print(isinstance((1, 2, 3), tuple))
実行結果
True
True
False
True
False
True
True
True
True
someoneはHumanクラスのインスタンスです。さらに、Human is a Animalなので、someoneはAnimalでもあります。birdはAnimalですが、Humanではありません。isinstanceは「is-a」関係をそのまま表現した関数です。
包含の使い方
継承と違い、包含には包含をするための特別な文法というものはありません。単純に、あるクラスを別のクラスのメンバ変数にするだけでOKです。
実のところ、実際のプログラムでは継承よりも包含の方がよく使うと思います。継承か包含か迷うようであれば、包含にしましょう。