お得なAmazonタイムセールはこちら

【完全版】独学Python入門・変数からオブジェクト・クラス・インスタンス・メソッドなども

独学でプログラミング_Python入門 プログラミング
スポンサーリンク

Pythonのインストール

Pythonのインストールを行います。以下のリンクから移動してインストーラをダウンロードしてください。黄色のアイコンではなく赤枠の中から使用するOSをクリックしてください。今回はWindows 64bitを例にご紹介させて頂きます。

Pythonのダウンロード

python-1

特にこだわりがなければ最新バージョンの「Download Windows x86-64 executable installer」をクリックしてダウンロードをし、インストールを開始してください。(2.x.xxと2で始まるバージョンはこれから勉強される方には推奨されていないバージョンのためご注意ください)

最初の画面で必ず赤枠の「Add Python 3.xx to PATH」にチェックを入れてから「Install Now」をクリックしてください。

python-2

「Close」をクリックして閉じます。

python-3

正常にインストールされているかを確認します。左下の虫眼鏡の欄に「cmd」と入力してコマンドプロンプトを起動してください。

「python –version」と入力してENTERキーを押し、インストールしたPythonのバージョンが表示されればどこからでもPythonを実行できることを表しており、インストール完了です。

書籍によっては「Anaconda」というディストリビューション(必要なソフトウェアの詰め合わせパック)のインストールを薦めてくる場合がありますが、AnacondaのインストールでつまづいてPythonを学ぶ前に挫折する方が少なくありません。僕はこのサイトで初心者の方を対象に説明していきますので、現時点ではAnacondaのインストールは行わずに進めていきたいと思います。

>>目次に戻る

インタラクティブシェル

インタラクティブシェルを使ってみましょうと言われても、いきなりカタカナの用語が出てきてアレルギーを感じる方もおられるかもしれませんが安心してください。

例えば、あなたが「I want apple.」と英語圏の方に伝えると相手はあなたの主張を理解し、あなたにりんごをくれます。しかし、誤記があって「I want appll.」と伝えても相手は何が欲しいのか分かりません。

これがプログラミングの場合、コンピュータが理解できずエラーが発生します。コンピュータはシビアなので「相手はこう言いたいんだろう」など一切気を遣ってはくれません。OKかNGかだけです。

あなたがPythonに「1+1は?」と正しく聞くと「2」と答えてくれますが、あなたの聞き方ではPythonが「11」と答える場合があるのです。ちゃんとこの聞き方で正しいかを手軽に確認するためにインタラクティブシェルを活用します。

それではPythonを起動しましょう。Windows10であれば、左下の虫眼鏡の欄に「python3」と入力すると候補で上がりますのでクリックしてください。もしくはデスクトップにアイコンができていればそれをクリックしてもOKです。

正常に起動すると以下のウィンドウが立ち上がります。

黒い無機質な画面なので慣れない方はかなりのアレルギーを感じる可能性がありますが、大丈夫です。少しずつ慣れていきましょう。日本語以外の英数は必ず半角で打ち込んでください。

まずは 1+1 と入力してENTERキーを押してください。Pythonは計算を実行した結果である2を返してきました。

次は文字列を表示してみましょう。Pythonに「Hello World」という文字列を表示するように命令します。上記を入力してENTERキーを押してください。※「”」は「SHIFTキー」+「2」です。

print("Hello World")

上記を入力してENTERキーを押してください。

次は線を描いてみましょう。インタラクティブシェルに以下の2行を打ち込んでください。

from turtle import *
forward(50)

※1行書き終わったらENTERキーを押して改行してください。

※importの後の「*」はアスタリスクです。右側のテンキー(数字のキー)から押すか「SHIFT」+「:」を押してください

矢印が表示されると思います。

Pythonでプログラミングを行い、描画をすることに成功しました。補足させて頂きます。

from turtle import *

これは、turtleモジュールから全ての関数やオブジェクトをインポートするという意味です。

モジュール?関数?オブジェクト? 用語の意味が分からず嫌になりそうですが、全然理解できなくて構いません。ただ、そのようなものがあるらしいとだけ今はなんとなく思ってもらえれば後からつながります。forward(50)は前に50進むように命令しています。

全て理解しようとするよりも最初は「こう入力するとPythonではこう処理された」と覚えるだけで十分です。プログラミングには慣れるための時間がどうしても必要ですが、次第に理解できます。

インデント

インデントについて今回はご説明します。インデントはPythonでは非常に重要になりますので、ここを理解されないとうまくプログラミングできませんのでご注意ください。

インデントとは先頭にtabやスペースを入れて右へずらすことです。

体験してもらうのが早いのでインタラクティブシェルで以下を実行してみてください。

※3行目と4行目の先頭は「tabキー」を1回(もしくは半角スペースを4回)入力してください。

from turtle import *
for i in range(4):
    right(90)     #先頭にインデント
    forward(50)   #先頭にインデント

※5行目は何も入力せずにENTERキーを押してください

成功すると前回の最後の描画と同じ正方形が描かれます。

前回と異なり同じ処理を繰り返す際に「for文」を使用しました。for文に関する解説は後ほどさせて頂きますが、今回重要なのは「for i in range(4):」の後の2行の先頭をtabで右にずらしたということです。インデントを入れてそろえることでfor文の繰り返しの処理を行う範囲(ブロック)を表しています。

上記の3行目と4行目のインデントをそろえない場合はどうなるでしょうか?

インデントがそろっていないとエラーが発生し、正常にPythonは処理を行うことができませんでした。

ここでは特に難しく考えずに、Pythonでは影響を受けるブロックはインデントでそろえる必要があるということだけ覚えておいてください。

余談ですが、Pythonではインデントをそろえることが重要ということは他の言語ではそろえなくていいのか?というお声が上がってくるかもしれませんが、実はそろえなくても良い場合が多いです。C言語やJavaはインデントで右にずらしてブロックをそろえる必要はなく別の方法でブロックを区切ります。

>>目次に戻る

四則演算

Pythonで四則演算を行うためのルールをご紹介します。

インタラクティブシェルで「2 + 3」を打ち込んでENTERキーを押してください。

計算結果の「5」が返ってきます。

次に「2 ** 3」と入力してENTERキーを押してください。

2の3乗を計算して8が返ってきました。

Pythonでは次の演算子を使って計算を行います。見やすいように一部全角を使用していますが実際は半角で入力してください。

演算子機能
足し算
引き算
かけ算
/割り算の商
%割り算のあまり
**累乗

小学生の時に習いましたが、足し算とかけ算がある場合はかけ算を先に計算するというルールがありました。Pythonも他の言語も同じなのでしっかりこのルールは守る必要があります。

()「かっこ」がある場合はその中の計算を優先します。

【今回のポイント】
・四則演算は足し算と引き算よりもかけ算と割り算が優先され、()「かっこ」は最優先です。

>>目次に戻る

スクリプトファイル

スクリプトとは簡単なプログラムのことで、スクリプトファイルはその名の通り簡単なプログラムを書いたファイルのことです。

インタラクティブシェルはちょっとテストを行うときには手軽で便利ですが、複雑で長いプログラミングを行うときにはファイルに保存する必要があります。

今回は実際にコンピュータに処理をさせるためのスクリプトファイルを作成してみます。

まずは「メモ帳」を立ち上げて下さい。そして、以下の2行を記述してください。(コピーペーストでもOKです)

print("Hello World")
input()    #実行終了後もウィンドウを保持

本来の処理ではinput()は不要なのですが、このサイトのPython入門ではスクリプトファイルを作成する場合、最後に付けさせて頂きます。その理由はプログラムの実行後に勝手にPythonがウィンドウを閉じてしまい処理の結果が分からないためです。最初はどういう意味だ?と思われるかもしれませんが、とりあえず付けてもらいたいと思います。

「ファイル」→「名前を付けて保存」でファイル名を以下のように「hello_world.py」として「文字コード」を「UTF-8」にしてデスクトップに保存してください。

以下のアイコンのファイルがデスクトップにできますのでダブルクリックして実行してください。

初めてPythonのスクリプトファイルを実行する場合は以下の画面が立ち上がるかもしれませんが、「常にこのアプリを使って.pyファイルを開く」にチェックを入れて「Python」を選択してOKをクリックして下さい。

以下の表示がされると成功です。

うまく実行できない場合は以下を確認してください。

・全て半角英数で記入していますか?
・print の「”」は2個正しくついていますか?
・ご自分の手入力をされてうまくいかない場合はメモ帳に上記をコピーペーストして試してください。
・保存時は拡張子を「.py」にしていますか?
・最後にinput()をつけていますか?うまく実行していても終了後にPythonがウィンドウを高速で閉じるため実行できていないように見えるだけかもしれません。

>>目次に戻る

変数

変数とはプログラムでデータを保存するための入れ物のことです。Pythonをはじめプログラミングでは変数に名前を付けます。以下の例では「a」という変数を作って「1」を入れることを表しています。

a = 1    #1

aが1だということは理解しやすいと思います。ではこれはどうでしょうか?

a = a + 1    #2

初めてプログラミングをされた方は「なんだこれは?」と思われたかもしれません。数学ではありえない式です。方程式では「=(イコール)」の左辺と右辺が天秤のように等しいはずですが左右のバランスが崩れています。

プログラミングで#2はaという変数に1を足すという意味です。

#1のように変数に数値を入れることを代入と呼びます。それでは変数を利用して計算をしてみましょう。

a = 1
a = a + 1
b = 2
c = a + b

cの結果を予想してみましょう。実際にインタラクティブシェルで計算してみます。

cは4が代入されていました。変数の計算は数値だけではありません。文字列の足し算をしてみます。文字列は前後を「’」(シングルクォーテーション)か「”」(ダブルクォーテーション)ではさみます。「’」はSHIFT + 7、「”」はSHIFT + 2です。

数値と文字列の足し算を行いましたが、1つ覚えてもらいたいことがあります。同じ数であっても数値か文字列かで処理の結果が異なります。

【文字列と数値の足し算の比較】
※数値として計算

単純に 1+2=3 と数の計算ですね。

※文字列として計算

文字列の1と2を前後に接続して「12」の文字列になりました。数値として足すのとは異なりますので注意が必要です。

ここで1つ実験を行ってみましょう。数値と文字列を足すとどうなるのでしょうか?

データの種類(データ型)が異なるので数値と文字列は足せないとエラーが発生しました。

Pythonで使用する主なデータ型は以下になります。

データ型機能
str文字列
int整数
float浮動小数点
bool真偽
datetime日付
list配列
ltupleタプル
dictionary辞書

最初は文字列と整数だけ覚えておけば大丈夫です。

>>目次に戻る

データ型変換

前回、データ型が異なる数値と文字列を足すことはできないとご紹介しましたが、関数を使用して一方を変換してもう片方のデータ型に合わせることで計算することができます。

※まずエラーが出ることをおさらい
文字列は「”」か「’」で前後をはさむ必要がありました。

a = "apple"    #文字列
b = 5          #数値
c = a + b      #エラー発生

※インタラクティブシェルの結果

※文字列に合わせる場合
str(数値)という関数を使用すると数値を文字列に変換できます。

a = "apple"     #文字列
b = 5           #数値
c = a + str(b)  #文字列

※インタラクティブシェルの結果

「apple5」という文字列ができました。

※数値に合わせる場合
int(文字列)という関数を使用することで文字列を数値に変換できます。

a = 1            #数値
b = "5"          #文字列
c = a + int(b)   #数値

※インタラクティブシェルの結果

「6」という数値ができました。

データ型が異なる場合は、同じデータ型に合わせることで計算できるということをしっかりと理解して次に進みましょう。

【まとめ】
・str(数値)を使用すると数値を文字列に変換できる
・int(文字列)を使用すると文字列を数値に変換できる

>>目次に戻る

命名規則

命名規則とは変数や後から出てくる関数、クラスなどの名前の付け方です。「apple」よりも「apple weight」の方が変数の意味が分かりやすいですが変数名は1つにつなげる必要があります。ここでは複数の単語を1つに組み合わせて表記する方法の中からキャメルケーススネークケースをご紹介します。

【キャメルケースの例】
PlayStation、AmazonPrime、GoogleDrive など2つの単語を組み合わせる際に単語の先頭を大文字にします。これがamazonprimeだったら読みにくいですね。キャメルケースにも種類があります。

amazonPrime(ロワーキャメルケース)
AmazonPrime(アッパーキャメルケース)

【スネークケースの例】
play_station、amazon_prime、google_driveのように「_」(アンダースコア、別名アンダーバーとも呼びますが同じ)でつなげます。
※「SHIFTキー」+「ひらがなの”ろ”が印刷されているキー」を同時に押します。

前回は変数に「a」を使用しました。とりあえずテストなどで使用するのは良いのですが、実際のプログラミングでは「a」などを変数名に使用するのは実は良くありません。理由は他の人がそのプログラムを見た時にこの変数が何を表しているかが分からないからです。

a = 36  ・・・「何の数字だ?」

taro_age = 36・・・「太郎の年齢か」

このように他の人が分かりやすいプログラムを作成することがプログラマーの技量の1つと言えます。

【まとめ】
・キャメルケースは単語の先頭を大文字にしてつなげる
・スネークケースは単語の間をアンダースコアでつなげる

>>目次に戻る

比較演算子

比較演算子とはAとBが条件を満たしているかを確認するための記号です。漢字だと難しく感じますが内容は簡単です。以下に比較演算子の一例をまとめました。

比較演算子意味
A == BAとBは一致する
A != BAとBは一致しない
A < BAはBより小さい
A <= BAはB以下
A > BAはBより大きい
A >= BAはB以上

以前の回で「a = a +1」という表現は数学の方程式ではなく代入を表現しているとご紹介しましたが、方程式のイコールになるのが「==」になります。上記の表で演算子の右と左の判定結果が成り立つ場合はTrue、成り立たない場合はFalseという2択の結果が返ってきます。

インタラクティブシェルで確認してみましょう。taro_ageに25を代入してtaro_ageと25を比較、taro_ageと30を比較した結果です。

taro_age = 25
taro_age == 25    #True
taro_age == 30    #False

※インタラクティブシェルの結果

このように複雑な比較も可能です。

taro_age = 25
20 < taro_age < 30  #True
27 < taro_age < 30  #False

以前の回で変数のデータ型として数値と文字列があるとご紹介しました。それに対してTrueとFlaseの2択しか結果を持たないデータ型をbool型と呼びます。

【まとめ】
・右と左の関係が条件を満たしているかを確認するために比較演算子を使用し、条件を満たしている場合はTrue、そうでない場合はFalseを返す(bool型のデータ)

>>目次に戻る

if文

if文とは前回ご説明した比較演算子を使用して処理を分岐する場合に使用されます。if文の書き方は以下の通りです。

if 条件A:
    処理A
else:
    処理B

条件Aを満たすときは処理Aを実行し、それ以外の場合は処理Bを実行します。
※読み方はif「イフ」とelse「エルス」です。
※条件Aと「else」の右側には「:(コロン)」を付けます
※処理ブロックは右にずらします(インデント)

使用例を見てみてみましょう。

taro_age = 25
if taro_age == 25:
  print("taro is 25 years old")
else:
  print("taro is not 25 years old")

#右が切れたら左にスワイプしてください

※インタラクティブシェルの結果

条件を満たしていたため、「taro is 25 years old」を表示しました。

書き方は若干異なりますが、JavaもC言語などの他の言語でもif文は使用される重要な構文になりますのでしっかりと理解をお願いします。

>>目次に戻る

elif文

elif文は前回ご紹介したif文の分岐を増やすために使われます。elifの読み方は「エルイフ」です。使用するためのルールは以下の通りです。

if 条件A:
  処理A
elif 条件B:
  処理B
else:
  処理C

※条件Aを満たすときには処理A、条件Bを満たすときは処理B、条件Aと条件Bのどちらにも当てはまらない時には処理Cを実行します。

※処理A、処理B、処理Cはいずれか1つを実行します。例えば条件Aを満たしていたので処理Aを実行する場合は以降の処理Bや処理Cは実行されません。もしも、条件Aと条件Bの両方を満たす場合は前に置かれている条件Aが優先されます。

※elif文による条件は以下のようにいくつでも用意できます。

elif 条件B:
  処理B
elif 条件c:
  処理c
  ・
  ・
  ・
else:
  処理D

elif文を使用してテストをしてみましょう。

taro_height = 170
if taro_height >= 180:
  print("LL")
elif taro_height >= 170:
  print("L")
else:
  print("M")

※インタラクティブシェルの結果

taro_heightの数値を判定して適切な処理を行うことができました。次は処理ブロックのインデントの重要性を体験してもらうために処理を1行ずつ追加します。

taro_height = 170
if taro_height >= 180:
  print("LL")
  print("over 180")
elif taro_height >= 170:
  print("L")
  print("over 170")
else:
  print("M")
  print("under 170")

※インタラクティブシェルの結果

ちなみにif文の中にもif文を書くことができます。

height = 170
weight = 60
if height >= 180:
  if taro_weight >= 90:
    print("over weight")
  else:
    print("good")    
elif height >= 170:
  if weight >= 80:
    print("over weight")
  else:
    print("good") 
else:
  if weight >= 72:
    print("over weight")
  else:
    print("good") 

#右が切れたら左にスワイプしてください

とても読みづらくなってしまいました。このようにif文の中にif文が入っていることをネストと呼びます。if文の中にif文があり、さらにif文があってという状態をネストが深いという言い方をします。深くなるほど理解しづらいプログラムになりますので注意してください。次回、見やすくするための方法をご紹介します。

ちなみにネストとは入れ子、ロシアのマトリョーシカのような構造の意味になります。

>>目次に戻る

論理演算子

論理演算子について今回はご説明します。論理演算子はブール演算子とも呼ばれます。言葉だけ聞くと難しそうですが、and, or, notの3つのことです。以下の表に機能をまとめます。

論理演算子意味
 A and BAとBの両方が成立する
 A or BAかBの少なくとも片方が成立する
 not AAは成立しない

その条件が成立するとTrueが返ってきます。これらを使用してテストをしてみましょう。

※andの使用例

height = 170
if height >= 170 and height <= 180:
    print("170以上180以下")

#右が切れたら左にスワイプしてください

※インタラクティブシェルの結果

※orの使用例

height = 168
if height <= 170 or height >= 180:
    print("170以下もしくは180以上")

#右が切れたら左にスワイプしてください

※インタラクティブシェルの結果

※notの使用例

height = 170
if not height >= 180:
    print("180以上ではない")

※インタラクティブシェルの結果

and, or, notの使い方を理解してもらえたでしょうか?これらを使用すると分岐の条件をすっきりとまとめることができます。

前回、if文の中にif文を書くネストが深いプログラムはとても見にくいとお伝えしました。おさらいするためにそのプログラムを再度取り上げます。

height = 170
weight = 60
if height >= 180:
  if weight >= 90:
    print("over weight")
  else:
    print("good")    
elif height >= 170:
  if weight >= 80:
    print("over weight")
  else:
    print("good") 
else:
  if weight >= 72:
    print("over weight")
  else:
    print("good") 

#右が切れたら左にスワイプしてください

※このプログラムはごちゃごちゃしていますが処理の内容を整理すると以下の通りです。

①heightが180以上+weightが90以上
②heightが170以上+weightが80以上
③heightが170未満+weightが72以上
④上記の①~③を満たすときに「over weight」を表示し、それ以外は「good」を表示する

①~③の分岐点で「+」に該当するのが論理演算子のandです。andを使用すると以下のようにプログラムを作り替えることができます。

height = 170
weight = 60
if height >= 180 and weight >= 90:
  print("over weight")   
elif height >= 170 and weight >= 80:
  print("over weight")
elif height < 170 and weight >= 72:
  print("over weight")
else:
  print("good") 

#右が切れたら左にスワイプしてください

プログラミングのスキルが高い人ほど他の方が理解しやすいすっきりしたプログラムを書くことができます。「if文の中にif文を書いてしまったけど、すっきりと書く方法はないかな?」と考える癖をつけるときっと上達が早くなります。

>>目次に戻る

input

ユーザーが入力したデータを取得してみましょう。以下の関数でデータを取得できます。

変数 = input()

以下を入力してください(コピーでも構いません)

name = input("名前を入力:")
print(name)

input()  #終了後もウィンドウ保持

「input_test01.py」というファイル名でとりあえずデスクトップ(もしくはご希望のフォルダ)に保存し、ダブルクリックして実行してください。うまくいかない場合は先述の環境変数PATHが正しく設定されているかを確認してください。)

「name」という変数にユーザーが入力した「太郎」が代入されてprintで表示することができました。ここで重要なポイントがあります。input()で取得したデータは文字列で代入されることを覚えておいてください。

先ほどの例をちょっと改良してみます。

myoji = input("苗字を入力:")
name = input("名前を入力:")
print(myoji + name)

input()

#右が切れたら左にスワイプしてください

苗字と名前を別に文字列で取得して足し合わせて表示することができました。

先ほどinput()で取得するデータは文字列だと説明しましたが、次はユーザーが入力したデータを数値に変換して足し算するプログラムを試してみましょう。

num1 = input("数字1を入力:")
num2 = input("数字2を入力:")
print(int(num1) + int(num2))

input()

#右が切れたら左にスワイプしてください

今回はユーザーが入力したデータを文字列のまま足し合わせたり、int(文字列)で数値に変換して処理してみました。徐々に本格的なプログラミングを行っていきましょう。

>>目次に戻る

BMIを計算(復習)

ここまでの復習もかねてBMIを求めてみます。ソースコード(プログラム)をご紹介しますので最初はエディタにそのまま打ち込むかコピーペーストしてとりあえず1度実行をしてから内容を理解してください。

※プログラムの仕様
・ユーザーに身長[m]と体重[kg]を入力させる
・BMI = 体重 ÷ 身長の2乗
・BMIは18.5未満が「やせぎみ」、18.5~25未満を「標準」、25以上で「肥満」と表示させる
・float(文字列)を使用すると小数が扱えるデータ型に変換します

エディタを開き、コピーペーストしてデスクトップに保存し実行してください。

ht = input("身長[m]=")
wt = input("体重[kg]=")
bmi = float(wt) / (float(ht) ** 2)

print(bmi)

if bmi < 18.5:
    print("やせぎみ")
elif bmi >= 18.5 and bmi < 25:
    print("標準")
else :
    print("肥満")
    
input()  #実行後にウィンドウを保持するため

#右が切れたら左にスワイプしてください

実行結果は以下の通りです。

ユーザーのデータ入力、数値の計算、if文による分岐が使用されています。最初は難しい部分もあるかと思いますが何度もエディタに自分の手で打ち込んでソースコードをしっかりと理解してください。

>>目次に戻る

配列

配列(リスト)とは複数のデータを一覧で管理するデータ型です。

配列は[](角かっこ)で囲み、1つ1つの要素を「,(カンマ)」で区切ります。
上記の例の場合はaに1から4までの数値を配列で定義しました。「#」の行に数値を書いていますがこれは配列の番号(インデックス)を表しています。

#       0  1  2  3 インデックス
list = [1, 2, 3, 4]  
print(list[2])       

インデックスは0番目から始まるので注意してください。上記の例ではインデックスと数値は以下のようになっています。
・a[0] = 1
・a[1] = 2
・a[2] = 3
・a[3] = 4

インタラクティブシェルで確認してみましょう。

配列は数値だけではなく文字列も扱うことができます

#         0       1       2
list = ['太郎', '次郎', '三郎']
print(list[1])

【まとめ】
・配列(リスト)は数値だけでなく文字列も入れることができる
・インデックスは0から始まる(1からではありません)

>>目次に戻る

for文

for文は同じブロックの処理を繰り返し実行する場合に使用されます。プログラミング言語によって表記の方法は若干異なりますが、for文は様々な言語で使用されています。

書き方をご紹介します。

for i in 配列:   # iは何でも良い
    処理         #インデント要
    処理         #インデント要

#実際の使用例
#定義したインデックスの0から最後までの値をiに代入して繰り返す
#     0  1  2 3 #インデックス
list = [1, 3, 4, 5]
for i in list:
    print(i)

#右が切れたら左にスワイプしてください

ここでなぜ「i」を使用したのか?と思われた方もおられるかもしれません。諸説はあるのですが、理由はPythonだけではなく様々なプログラミング言語で暗黙の了解で繰り返しループの変数は「i」が良く使われるからです。複数のループがある場合は、次は「j」、「k」が使用されます。「i」を使用するとプログラミングに慣れている方はループの変数のことだと分かってもらえますので、こだわりがなければ「i」を使用することをおすすめします。

for文を使ったテストをしてみます。

list = ['太郎', '次郎', '三郎']
for i in list:
    print(i)

ここまでの説明で「for文など使用せずにコピーペーストをして書けばいい」と思われた方もおられるかもしれません。

print('太郎')
print('次郎')
print('三郎')

これは良くない書き方の代表例になります。その理由はメンテナンス性が悪いからです。人が100人になった場合、名前が変更になった場合、他にもプログラムが大規模になって1人ではなく数人でプログラムを作成する必要が生じて、あっちこっちでこの人達の名前を多用する必要が出た場合などにこのような書き方をするとトラブルの元になります。

繰り返しの処理はコピーペーストは使用しない、変更になる可能性がある部分は配列などの変数を使用して「太郎」など固定しないようにしましょう。

>>目次に戻る

breakとcontinue

前回、繰り返し動作を行うときに使用するfor文をご紹介しましたが、ある条件で繰り返しを中断したい場合にはbreak、ある条件の時のみスキップして再開したい場合にはcontinueを使用します。

【breakの使用例】

list = [0, 1, 2, 3, 4, 5]
for i in list:	#0~5の配列を準備
    if i == 3:  #iが3であれば
        break   #中断
    print(i)    #iを表示する

input()   #終了後もウィンドウを保持

「i == 0」からスタートし「i == 3」でbreakによって全ての処理を中断します

【continueの使用例】

list = [0, 1, 2, 3, 4, 5]
for i in list:    #0~5の配列を準備
    if i == 3:    #iが3であれば
        continue  #スキップして再開
    print(i)      #iを表示する

input()    #終了後もウィンドウを保持

#右が切れたら左にスワイプしてください

「i == 3」の時だけprintをスキップしていますね。continueは以後の処理をスキップはしますが繰り返し処理は継続されます。

while文

while文もfor文と同じで繰り返しを行う構文です。使い方は以下の通りです。

while 条件:
    処理

while文とfor文は繰り返しを行うことは共通ですが記述方法が異なります。while文とfor文を使用して0から3までを表示するソースコードを作成して比較してみます。

i = 0            #iに0を代入
while i <= 3:    #iが3以下の時に繰り返す
    print(i)     #iの値を表示する
    i = i + 1    #iを+1する

input()    #終了してもウィンドウを保持

#右が切れたら左にスワイプしてください
list = [0, 1, 2, 3]
for i in list:
    print(i)        

input()    #終了後もウィンドウ保持

実行結果は以下のように同じです。

最初に使い方をご紹介しましたがwhile文は条件がずっとTrueであれば永遠に繰り返しを行うことが可能です(無限ループ)

while True:       #条件をTrue固定
    print("無限ループ")

その名の通り無限に処理を繰り返し、ウィンドウの下まで行っても止まりません。右上の「×」を押して閉じてください。このwhile文の無限ループは様々なところで使用されますので覚えておいてください。

ご説明が遅くなってしまったのですが、ソースコードに「これは何をしています」「これは誰がいつ変更しました」などのコメントができると便利です。Pythonは「#」を入力するとその行の右側は処理されずに無視されます。

#これはコメントです
while True:            
    print("無限ループ")  #修正

>>目次に戻る

組込み関数

組込み関数とはPythonが標準で初めから持っている関数です。今まで出てきた以下のような関数(処理)は組込み関数の一部です。

print()
input()
int("文字列")
str(数値)
float("文字列")

「y = 2x」という数学の関数を例にすると関数に与えるxによって結果であるyが変化します。プログラミングでこのxに相当する関数に与える変数を引数、yに相当する関数で計算された結果を戻り値と呼びます。引数や戻り値という用語は他のプログラミング言語でも使用されるのでしっかり理解しておきましょう。

今回、初めて使用するmax関数でご説明します。

max(配列)   #最も大きいものを返す

インタラクティブシェルで動作を確認してみましょう。

list = [1, 2, 3, 4]
max(list)

「4」を返してきました。この例の場合は「list」が引数、「4」が戻り値になります。

>>目次に戻る

関数の自作

関数の自作を今回行ってみましょう。まずは関数の定義の方法です。

def 関数名(引数):  #引数は複数可
    処理A           
    処理B           
    return a      #戻り値を返す

実際に自作してみましょう。RIZAPという有名なスポーツジムがありますが、そこに行くと体重を1割減量できるとします。

#自作関数 rizapという関数を作る
def rizap(wt):        
    return wt * 0.9   #引数*0.9

#実際の処理
weight = 70           
result = rizap(weight)  #関数に引数を渡す
print(result)           #結果を表示

input()        #終了後もウィンドウを保持

#右が切れたら左にスワイプしてください

引数として与えた変数を0.9倍する関数を自作できました。

この自作した関数はint(文字列)やmax関数などの組込み関数と同じように使用することが可能です。

ちょっとステップアップした関数を自作してみます。if文で分岐をさせます。組込み関数の中にmin関数という引数を比較して小さい方を返す関数が用意されてはいますが、今回2つの引数を取得して小さい方を戻り値で返す関数を自作します。

# miniという関数を自作します
def mini(num1,num2):  #2つ引数を取得
    if num1 < num2: 
        return num1   #戻り値はnum1
    else:            
        return num2   #戻り値はnum2

result = mini(2,3)    #関数に引数を渡す
print(result)

input()     #実行終了後もウィンドウを保持

#右が切れたら左にスワイプしてください

小さい方の「2」を戻り値として取得し表示することができました。ソースコードに2カ所「return」がありますがどちらかのreturnを実行すると関数は終了します。

>>目次に戻る

import文とfrom文

今回はちょっと難しいので理解しづらい場合は後からまた理解してもらっても大丈夫です。

import文はモジュールを取り込むために使用します。モジュールとは難しい処理をするための関数の詰め合わせパックのイメージです。printやmax関数などは最初から使用できますが、高機能な処理を実現する関数は「これを使います」という宣言をする必要があります。from文と組み合わせて使用することもありますがまずはimport文からご説明します。

import モジュール名

上記の記述でモジュール(関数詰め合わせ)を読み込むことができます。インタラクティブシェルでmathモジュールをインポートして使用してみます。mathモジュールはラジアン変換関数やsin、cosを計算する関数などの詰め合わせパックです。

#mathモジュールをimport
import math        
math.radians(180)  #ラジアンに変換

まずはmathモジュールをimportしないで試します。

mathは定義されていないとエラーが発生します。次は最初にimport文でmathを宣言します。

180°をラジアンに変換できました。ラジアンは三角関数で出てきましたが、もしも「ラジアンって何?」と思われた方は深く考えずにmathモジュールをインポートしたら難しい計算を実行できたとだけお考え下さい。

次はfrom文をご紹介します。from文の記述の仕方は以下の通りです。

from モジュール名 import 関数名

from文もインタラクティブシェルでテストしてみましょう。

#ラジアン変換関数のみインポート
from math import radians
radians(180)  

先ほどのimport文だけの時と同様にラジアンに変換できました。ただ、こちらはラジアン変換関数を使用時に「math.」を省略することができます。すなわち、from文も使用して宣言した場合は関数使用時にモジュール名を記述する必要がありません。(モジュール名のmath.をつけてもエラーにはなりません)

今回はラジアン変換関数のみをインポートしましたが「*」を使用するとラジアン変換関数だけでなくmathモジュールの全ての関数をインポートできます。

from モジュール名 import  関数名
from    math     import radians
from    math     import    *  

import文とfrom文はちょっと難易度が高いですが、最初はimport文を使用すると難しい処理ができ、from文を使用すると記述する量が減る(モジュール名が省略できる)くらいに考えてもらえると良いかと思います。

>>目次に戻る

辞書型

辞書型のデータについてご紹介します。

まずは配列を1度復習したいと思います。

#        0  1   2   3   4
list = [10, 11, 12, 13, 14]

list[0] = 10
list[1] = 11
list[2] = 12
list[3] = 13
list[4] = 14

配列はインデックスでデータを呼び出していましたが、辞書型はキーワードでアクセスするという特徴を持っています。そして辞書型は組込み関数(dict関数)を使用する方法自分で宣言する方法の2種類があります。

キーワードからデータにアクセスするテストをしてみます。

キーワード  r    g    b     y   
データ    RED GREEN BLUE YELLOW
#組込み関数を使用して定義
color = dict(
    r = 'RED', 
    g = 'GREEN',
    b = 'BLUE',
    y = 'YELLOW'
)

print(color['b'])    #'b'のキーワード

input()

#右が切れたら左にスワイプしてください
#自分で宣言する場合
color = {
    'r' : 'RED', 
    'g' : 'GREEN',
    'b' : 'BLUE',
    'y' : 'YELLOW'
}

print(color['b'])    #'b'のキーワード

input()

#右が切れたら左にスワイプしてください

どちらも以下のようにBLUEが表示されます。

次に配列でも行ったようにfor文を使用してキーワードと値を表示してみます。辞書型はdict関数を使用して作ります。

#組込み関数を使用して定義
color = dict(
    r = 'RED', 
    g = 'GREEN',
    b = 'BLUE',
    y = 'YELLOW'
)

for i in color:
    print(i)
    print(color[i])

input()

キーワードと値をfor文で表示することができました。

辞書型はキーワードでアクセスする配列のように考えてもらえると理解しやすいかと思います。

>>目次に戻る

タプル

タプルは変更ができない配列です。タプルは1つ1つの要素を「,(カンマ)」で区切ることは配列(リスト)と同じですが()= 丸かっこ で囲みます。

#       0  1  2  3  インデックス
list = (1, 2, 3, 4)
print(list[2])  

インデックスからアクセスしてデータを呼び出す動きは配列と同じです。

では最初にタプルは変更ができない配列とご紹介しましたが、実際に配列とタプルのデータの書き換えを行って動きを比較したいと思います。

まず配列(リスト)の書き換えです。

list = [1, 2, 3, 4]
list[2] = 5     #list[2]を5にする
print(list)     #listを表示

書き換えることに成功しました。

次はタプルの書き換えを図ってみます。

list = (1, 2, 3, 4)
list[2] = 5     #a[2]を5にする
print(list)

a[2]のデータにアクセスして書き換えを図るとエラーが発生しました。

変数を宣言してデータを代入したら変更ができないというタプルの特性は絶対に変更してはいけないような重大な変数の管理などに使用されます。

>>目次に戻る

set

setは重複を省く配列のことです。setは集合とも呼びます。インタラクティブシェルでテストしてみます。

list = set([1,2,3,1])  #重複を省く
print(list)

重複部分が省かれて以下のような配列を表示します。

setには集合演算と呼ばれる個性的な演算ができます。

list1 = set([1, 2, 3])
list2 = set([2, 3, 4])

#和集合  合算する
print (list1 | list2)
#={1, 2, 3, 4}

#差集合 list1からlist2の要素削除
print (list1 - list2)
#={1}

#積集合 list1とlist2の共通を残す
print (list1 & list2)
#={2, 3}

#排他集合 両方にある要素を削除
print (list1 ^ list2)
#={1, 4}

setのような重複を省く配列は多くのプログラミング言語でも用意されていますのでsetのイメージをつかんでください。

None

Noneとはその名の通り何もないことを表すデータ型です。Noneは「0」とは違います。変数に「0」を入れると数値型の0が入ってしまいますし、「’0’」を入れると文字列型の0が入ってしまいますね。

変数という入れ物を用意したものの「0」すら入っていない空っぽの状態です。

実際にインタラクティブシェルで確認してみます。

以下はaという変数を定義していない状態で「aの中身は何か?」と確認したのでaという変数は定義されていないとエラーになりました。

こちらはaを定義してNoneを代入した状態です。「aの中身は何か?」と確認してもエラーにはならず空っぽですと返ってきました。

Noneが何の役に立つのか?と思われる方もおられるかと思いますが、うまく変数が定義されていないのか?変数の中身が初期化されてしまったのか?などの切り分けを行うことができます。

他のプログラミング言語で使用されるNull(空文字)と似ている部分もあるのですが、Noneは完全なる空でNullは長さが0の文字列という違いがあります。最初はNullというものに似ているらしいけど、厳密には違うらしいと覚えてもらえればと思います。

>>目次に戻る

オブジェクト

オブジェクトとは何ですか?と10人のプログラマーに質問するとおそらく多様な回答が返ってくるほど抽象的でぼんやりした概念だと僕は思っています。オブジェクトとは?を追求することは「人は死んだらどこに行くのか?」を哲学的に考えるくらい大変だというのが個人的な意見です。

例えば「お金とは何ですか?」と数人に聞くとします。
・この世で1番大事なものだ
・大事ではあるが愛の方が大事だ
・お金は遣うためのもの
・お金は怖いものだ

様々な回答が返ってきますが、「お金はお店の商品と交換することができる」という性質は全ての人がそうだと意見が一致しますね。今回はオブジェクトのそのような間違いない部分だけご説明させて頂きます。

・太郎は人間です。
・太郎は身長170cm、体重60kg、35歳

上記の例でいくと太郎さんは身長170cm、体重60kg、35歳というデータ(プロパティ)を持つ物体ですね。物体は英語でオブジェクト、つまり太郎さんは身長、体重、年齢のデータを持つオブジェクトです。これをPythonのプログラミングのルールに則って表現すると以下のようになります。

#太郎は人間です
taro = Human()

#太郎は以下の情報を持っています
taro.name = 'taro'
taro.ht = 170
taro.wt = 60
taro.age = 35

初めて見られる方も上記のコードはなんとなくイメージしやすいかと思います。まずはtaroというオブジェクトの名前はtaro.name = ‘taro’で定義するのかくらいに思ってもらえればと思います。

オブジェクトについては次回のクラスインスタンスと合わせてさらに説明させて頂きます。

>>目次に戻る

クラスとインスタンス

クラスとインスタンスについて今回はご説明します。

ライザップという有名なスポーツジムで例えたいと思います。ライザップでは入会申込書が用意されています。この未記入の入会申込書がクラスのイメージです。項目は決まっていますが具体的な数値や文字列は入っていません。空っぽの入会申込書からはどんなお客様かイメージできません。

入会申込書
氏名name
身長ht
体重wt
年齢age

太郎さんが入会申込書に記入しました。

入会申込書
氏名nametaro
身長ht170
体重wt60
年齢age35

記入された入会申込書からは太郎さんがイメージできるようになりました。このように具体的な数値や文字列などのデータを持ったクラスがインスタンスです。

実際にソースコードで確認してみます。

#クラスの定義  
#人は名前,身長,体重,年齢のプロパティを持つ
class Human:
    name = ''     #文字列
    ht = 0.0  #浮動小数点
    wt = 0.0  #浮動小数点
    age = 0       #数値
    
#インスタンス化
taro = Human()
taro.name = 'taro'
taro.ht = 170
taro.wt = 60
taro.age = 35

print(taro.age)
print(taro.ht)
print(taro.wt)

input()    #実行後にウィンドウを保持

#右が切れたら左にスワイプしてください

ソースコードを見てインスタンス化の部分は前回のオブジェクトの回の太郎のデータじゃないかと思われた方もおられるかと思います。実はそうです。インスタンスの別名がオブジェクトになります。

>>目次に戻る

メソッド

メソッドとはオブジェクトに行う処理のことです。

前回、ライザップに入会した太郎さんを例にメソッドをご説明したいと思います。

おさらいですが、未記入の入会申込書がクラス、太郎さんが自分のデータ(プロパティ)を記入して具体的になったものがインスタンス(オブジェクト)でした。

太郎さんはどのくらい減量したいかによってコースを選択します。太郎さんは標準コースを選びました。

コースメソッド
軽め5%減wt * 0.95
標準10%減wt * 0.9
ハード20%減wt * 0.8

関数を自作する回で体重の1割を減量する「rizap」という関数を作成しましたが、同様のメソッドをソースコードに追加してテストしてみます。

#Humanクラスを定義
class Human:
    name = ''       #文字列
    ht = 0.0    #浮動小数点
    wt = 0.0    #浮動小数点
    age = 0         #数値

#メソッドを定義
    def rizap(self):
        return self.wt * 0.9

#インスタンス化    
taro = Human()
taro.name = 'taro'
taro.ht = 170.0
taro.wt = 60.0
taro.age = 35
after_wt = taro.rizap()

print(taro.age)
print(taro.ht)
print(taro.wt)
print(after_wt)

input()    #実行後にウィンドウを保持

#右が切れたら左にスワイプしてください

selfというキーワードが新しく出てきましたが、次回またご説明させて頂きます。

メソッドは関数と一緒じゃないかと思われた方もおられるかと思います。最初混乱しそうであればメソッドと関数は同じようなものと思われて大丈夫です。

ただ、明確な違いがあります。メソッドは宣言を行ったクラスのみしか処理を行うことができません。今回の例でいうと人(Humanクラス)のみしかrizap関数で処理を行うことができませんので、別で定義したお金の変数を0.9倍したいと思ってもrizapというメソッドを使用することはできず、何に対してでも処理を行える関数と性質が異なりますので注意が必要です。

>>目次に戻る

self

selfはちょっと難しいのですが今回はイメージだけでもつかんでもらえればと思います。

クラスに属する関数(すなわちメソッド)を定義するとき第1引数にselfを渡すというルールがあります。言葉だけ見ると意味が分かりませんね。

BMIを計算するソースコードを作成しました。結果は同じですが、関数とメソッドで記述の違いを比較するとselfの役割が見えてきます。

こちらは関数です。

#関数を定義
def bmi(wt, ht):
    return wt / (ht ** 2)

taro_ht = 1.7
taro_wt = 60.0

#関数を実行して結果を表示
print(bmi(taro_wt, taro_ht))  #※1

input()    #実行後にウィンドウを保持

#右が切れたら左にスワイプしてください

こちらはメソッドです。

#Humanクラスを定義
class Human:
    ht = 0.0    
    wt = 0.0

#クラスの中にメソッドを定義
    def bmi(self):
        return(self.wt) / (self.ht ** 2)

#インスタンス化    
taro = Human()
taro.ht = 1.7
taro.wt = 60.0

#メソッドを実行して結果を表示
print(taro.bmi())    # ※2

input()    #実行後にウィンドウを保持

#右が切れたら左にスワイプしてください

実行結果はどちらもこのようになります。

上記ソースコードの※1と※2を見比べてみてください。

#関数を実行して結果を表示
print(bmi(taro_wt, taro_ht)) #※1

#メソッドを実行して結果を表示
print(taro.bmi())    # ※2

#右が切れたら左にスワイプしてください

関数は引数としてtaro_wtとtaro_htの2つの引数を渡していますね。それに対してメソッドは引数がありませんがちゃんと計算できています。これはなぜでしょうか?関数とメソッドの定義を見比べてみましょう。

#関数を定義
def bmi(wt, ht):
    return wt / (ht ** 2)

#クラスの中にメソッドを定義
def bmi(self):
    return (self.wt) / (self.ht ** 2)

#右が切れたら左にスワイプしてください

関数はwtとhtという2つの引数を要求していますが、メソッドはtaro.wtやtaro.htというプロパティを含んでいるtaroというオブジェクト(インスタンス)をまるごとメソッドに引き渡しています。自分自身をまるごとメソッドに引き渡しているためselfが使用されます。

もう1つテストをしてみます。BMIの値によって表示を変えたいと思います。

#Humanクラスを定義
class Human:
    ht = 0.0    
    wt = 0.0

#クラスの中にメソッドを定義
    def bmi(self, level):    #※4
        if level > ((self.wt) / (self.ht ** 2)):
            print ('問題なし')
        else:
            print('肥満')

#インスタンス化    
taro = Human()
taro.ht = 1.7
taro.wt = 60.0

ft_level = 25.0   #25以上は肥満の基準

#メソッドを実行して結果を表示
taro.bmi(ft_level)    # ※3

input()      #実行後にウィンドウを保持

#右が切れたら左にスワイプしてください

※3で記述している引数はft_levelが1つですがこの回の最初にご説明した通り、第1引数としてtaro(self)が引き渡されるので※4で定義しているメソッドの定義からも分かるようにft_levelは2番目の引数になります。

selfはちょっと難しい考え方ですがPythonを使いこなすうえでは必要になるため少しずつ理解してもらえればと思います。

>>目次に戻る

テキストファイルの読み書き

今回はテキストファイル(メモ帳)を開いて文章を書き込んだり読み込むテストを行ってみます。

#テキストファイルに書き込んで保存
file = open('ファイル名.txt', 'w')

#テキストファイルから読み込み
file = open('ファイル名.txt', 'r')

#右が切れたら左にスワイプしてください

まずはエディタを使用して以下のソースコードを書き込み実行してください。

#テキストファイルに書き込み
file = open('test.txt', 'w')
file.write('メモに書き込むテスト')
flie.close()

#右が切れたら左にスワイプしてください

このソースコードを保存した場所に「test.txt」というテキストファイルが作成され、開くと以下のように記述されています。

次にメモ帳の文章を読み込むテストを行ってみましょう。先ほど生成した「test.txt」に書き込んだ文章を「get_str」という変数に代入して出力してみます。以下のソースコードをエディタで書き込み、先ほど生成された「test.txt」と同じフォルダにこのファイルを保存して実行してください。

#テキストファイルから読み込み
file = open('test.txt', 'r')
get_str = file.read()
print(get_str)
file.close()

input()    #実行後もウィンドウを保持

#右が切れたら左にスワイプしてください

今回はPythonを使用してテキストファイル(メモ帳)開いて文章を書き込んだり、ファイルの文章を読み込むことに成功しました。生成するファイルの拡張子を「.py」や「.doc (.docx)」にするとどうでしょうか?ソフトウェアの状況によっては失敗するかもしれませんがいろいろとテストしてもらうとより理解を深めてもらえるかと思います。

>>目次に戻る

CSVファイルの読み書き

CSVファイルとは「Comma Separated Value」の略でExcelにとても似ているファイルです。Excelとの違いはCSVの方が他のソフトでも編集ができる(互換性が高い)ことが多いのが特徴です。今回はCSVファイルを読み書きするスクリプトファイルを作成します。

実際にCSVファイルを生成して書き込んでましょう。

import csv

file = open('csv_w_01.csv', 'w')

num = [1, 2, 3]
name = ['太郎', '次郎', '三郎']

writer = csv.writer(file, lineterminator='\n')  #改行
writer.writerow(num)
writer = csv.writer(file, lineterminator='\n')  #改行
writer.writerow(name)

file.close()

#右が切れたら左にスワイプしてください

以下のようにfor文にまとめることもできます。

import csv

file = open('csv_w_01.csv', 'w')

num = [1, 2, 3]
name = ['太郎', '次郎', '三郎']
list = [num, name]

for i in list:
    writer = csv.writer(file, lineterminator='\n')  #改行
    writer.writerow(i)

file.close()

#右が切れたら左にスワイプしてください

スクリプトファイルを保存している場所に「csv_w_01.csv」というファイルが生成されますので開いてみましょう。配列の数値や文字列が記入されています。

次にCSVファイルのデータを読み込んでみましょう。先ほど生成した「csv_w_01.csv」のデータを読み込みます。以下のスクリプトファイルを作成して「csv_w_01.csv」と同じ場所に保存してください。

import csv
 
file = open('csv_w_01.csv', 'r')
data = csv.reader(file)
for i in data:
    for k in i:
        print(k, end =',') #データの後にカンマを付ける
    print()
file.close()

input()     #終了後もウィンドウを保持

CSVファイルの読み込みに成功しました。名簿リストなどをCSVファイルに入力して読み込んだりできるようになりましたね。定義する配列を変更したり、読み込む範囲を限定するにはどうしたらいいかをいろいろとテストして理解を深めてください。

>>目次に戻る