条件によって態度を変える都合のいいプログラム

Python
Photo by Nick Page on Unsplash

前回はデータ型と関数、例外処理を見てきました。

今回は年齢プログラムをさらに拡張させるために、
関数の補足説明と条件分岐について学んでいきます。

次回は繰り返し処理について説明します。

関数は定義してはじめて使える状態になる

セルを分けて記述しているが、同じセル内で関数を定義してもよい


本記事ではまず関数の補足説明をします。

前回は関数を自動販売機のようなものと例えましたが、
実際に関数を使用する場合、この説明だけでは分かりづらいかと思います。
関数を使う目安は以下のような場面です。

  1. こんな処理ができたらいいのにな、と思ったとき
  2. 同じような処理が必要になったとき(関数の再利用

まずは1.の「こんな処理できたらいいのにな」と思ったときの話です。
これは例えば、消費税抜きの商品に対して
「消費税込みの金額はいくらだろうか」と思ったとします。

こういう場合は、あなたが考えたオリジナルの処理を関数として、
以下のように定義する(つくる)ことで実現できます。

def 関数名(入力):
  何らかの処理 # インデントする
  return 出力
JUVET
JUVET

インデントが何か分からない場合は、前回の記事を参考にしてください!


関数名は好きに決めていただいてかまいません。
ここで行いたいことは、
ある商品の消費税抜きの金額を入力すると、
その商品の消費税込みのお値段が返ってくるオリジナルの関数を作成することです。

以下に tax という関数名で定義したオリジナルの関数を書きました。
amount は金額を指しています。

def tax(amount):
  return amount * 1.1


まずは基本用語をおさえましょう。
これまで、自動販売機の例でもそうでしたが、
入力出力ということばを使ってきました。

しかし、これからはそれぞれを引数(ひきすう)
戻り値(もどりち)とよぶことにします。

新しく登場した用語を使って、あらためて説明しますと、
上記の関数では、引数が amount(金額)で、
戻り値がその消費税(10%)込みのお値段になっています。

JUVET
JUVET

引数は ( )の中に、戻り値は return の後に書きます!


ちなみに上記のコードを実行しても、実は何も起こりません。
これは関数を定義したに過ぎないからです。
つまり、「関数を定義する」とは関数をただ作るだけであって、
実行はまだ行われません

このオリジナル関数を実行するためには、いま定義した関数を呼び出す必要があります。
以下のようにコードとして書くことで、はじめて使えるようになるということです。

# まずは関数を定義します
def tax(amount):
  return amount * 1.1
# tax関数の引数に金額(39,990円)を渡すと、
# 消費税込みの値段が戻り値として返ってくるので
# その値段を変数resultに代入します
result = tax(39990)

print("消費税(10%)込みのお値段: ", result)


関数の定義については以上です。
ちなみに上記の関数定義コード内にある amount は
その関数内で便宜的に使用する変数で、今回は amount でしたが、
他の変数名に変更していただいても問題なく動作します。

また、さらに上の方で「何らかの処理」と書きましたが、
今回のコードではそれが見当たりませんね。
これは単純な処理の場合には、
「何らかの処理」をそのまま出力した方がコードがスッキリするためです。

あえて、「何らかの処理」を記述する場合には以下のようになるでしょう。

# 「何らかの処理」を記述したコード例
# しかし、このような単純な処理の場合、
# 変数を無駄に用意するだけの結果となります
def tax(amount):
  output = amount * 1.1 # 消費税込みをoutputに代入
  return output


さて、これまで見てきたように、
関数を使うときは、本来なら定義してからでないといけないのです。

しかし、これまでに登場した関数(print( ), input( ), int( ))は最初から使えました。
定義したわけでもないのになぜ使えたのでしょう。

車輪の再発明はしなくてよい

車輪の再発明はしなくてよい(Photo by Waldemar Brandt on Unsplash


これまでに登場してきたprint( )関数などが
はじめから使用できた理由についてお話します。

実は Python は誰でも最初から便利で強力な機能が使えるように、
あらかじめ定義された、多くの関数を用意してくれています。

ここでいう便利とは
print( )関数のように、出力する場面で必ずお世話になる機能であったり、
int( )関数の整数への変換する機能のことだったりします。
そして、強力とは
無駄がないシンプルな構造を意味し、
突き詰めて言えば、エラーが発生しにくいという利点を持ち合わせているのが特徴です。

このように準備いらずで、
はじめから使える関数は組み込み関数とよばれます。

やはり自分で関数を定義すると
エラーの温床となる可能性が高くなります。
しかし、組み込み関数を使えばそういった過ちを減らすことができるのです。

また組み込み関数は過去から現在にかけて、
多くの人が知恵を絞ってできた優れたコード集で構成されているため、
わざわざ一から作成しなくでも、十分に機能するプログラムが書けるということです。
つまり、できあいのものを使ってコードを組むのがふつうで、
車輪の再発明は不要だということです。

ですので、先のほうで関数を定義する方法は学びましたが、
基本的には「組み込み関数でこの機能を補えないだろうか」
と考えたうえで、コードを組む方がはるかに良い結果が得られます。

せっかくなので、組み込み関数を実際に使ってみましょう。

3つの組み込み関数を使う

組み込み関数の例(bool( )関数)

組み込み関数の種類は実にたくさんありますので、
ここでは3つだけ紹介します。

  1. type( ) : 引数のデータ型を返す
  2. str( ) : 引数を文字列データ型に変換する
  3. bool( ) : 引数の真偽判定を行う
JUVET
JUVET

データ型がよく分からない場合には、こちらの記事を参考にしてください!


1. type( )関数

まずは type( )関数について、
これは以下のように、引数のデータ型を把握したいときに使います。

# 引数は文字列なのでtype()関数は「str」を返す
type('Hello')
出力: str
# 引数は整数なのでtype()関数は「int」を返す
type(100)
出力: int


プログラムを書いていて、そのデータが持つ型が何なのか、
分からなくなるときが出てくるかと思います。
そんなときは type( )関数を使って、データ型を可視化しましょう。


2. str( )関数

str( )関数は、引数のデータ型を文字列に変換したいときに使います。

# 引数のデータ型は整数だが、str()関数により文字列「'100'」に変換される
str(100)
出力: '100'
# この例では、type()関数の中でstr()関数を使っている

# まずは上記コードのように、整数100をstr()関数に渡し、
# その結果('100')をさらにtype()関数に渡すという流れ
type(str(100))
出力: str

場合によっては、
文字列データ型しか扱えない状況に遭遇するときが出てくるでしょう。
そんなときは str( )関数でデータ型を文字列に変換しましょう。


3. bool( )関数

まずは boolデータ型について説明します。
この英単語は boolean(真偽値)の省略形で、
何らかの判定を行いたいときに使用するものです。

判定というのはたとえば、
ある試験に合格した場合には真(オーケー)、
不合格の場合は偽(ダメ)というような判断のことです。

プログラムを例にすると、
ある文字列が存在する場合は真(True)を、
存在しない場合は偽(False)を返すといった判定のことを指します。

boolデータ型:データの中身は真または偽(True もしくは False)


前回登場したデータ型に加え、こちらの boolデータ型も重要ですので、
ここで覚えるようにしてください。
年齢プログラムの改良でもまた登場します。

次は bool( )関数の説明です。
この関数は、引数のデータに値が存在する場合には True を、
ない場合は False を返します。

# 引数として渡したデータ(文字列)が存在するため、Trueを返す
bool("Hello")
出力: True
# 引数として渡したデータ(文字列)が存在しない
# 渡したデータは空(カラ)であるため、Falseを返す
bool("")
出力: False


上記の例ではbool( )関数を使って文字列が存在するかどうか判定しています。
最初のコードには文字列(”Hello”)があるため、True が出力されます。
一方、次のコードでは文字列が空(クオーテーションがあるだけで文字がない)
であるため False が返されています。

このように bool( )関数は、
引数のデータ型の中身が存在するかどうか確認したいときに使うとよいでしょう。

ここでは3つの組み込み関数を紹介しましたが、
他にもたくさんあるので、
新しいものを使用するときはその都度、紹介していこうと思います。

ひとまず組み込み関数はこのへんにして、条件分岐に移りましょう。

条件分岐とは分かれ道のようなもの

Photo by James Wheeler from Pexels


今回の年齢プログラムでは条件分岐を使います。

条件分岐とは上記の写真のように、道が途中で分かれていて、
複数の選択肢がありうること指します。

これをプログラミングに置き換えると、
これまでのプログラムのように一通りの処理があるわけではなく、
プログラム上で枝分かれする地点があり、
条件によっては、進むルート(処理)が変わるという都合のいい仕組みを指します。

たとえば、
前回作成した年齢プログラムであれば、
入力された年齢が19以下であれば、「お酒は20歳から。」と出力し、
20以上であれば、「お酒には気をつけましょう。」と表示する。
このように条件に応じて処理を変える都合のいいプログラムがあるので、
その詳細を見ていきます。

設定する条件は何でもいいです。
ご希望の条件を記述する方法を学んでいきましょう。

条件分岐は以下の構文で実現できます。

if 条件:
    条件が成り立つ場合(True)の処理
else:
    条件が成り立たない(False)場合の処理

※この if else 構文は説明のために書いたものです。
大事なのは、はじめに書いた if(イフ)文です。

まずは最初の一文にご注目ください。
やはりプログラム構文なので半角入力で「if」と記述されています。
そして、半角スペースがあって、その次に「条件」と書かれています。

JUVET
JUVET

「if 条件」で「もし条件が成り立つならば」と解釈します!


この「条件」のところに所望の条件を書き、
その内容が True(成り立つ)の場合はインデントされた処理が実行されます

先の例でいえば、「年齢が19歳以下(ならば)」という条件を書き、
年齢が19歳以下である場合には、「お酒は20歳から。」を出力するということです。
以下はそのプログラム例です。

# 年齢は変数ageに代入されていると想定します
age = 18

# 「<=」は「以下」を表す記号
if age <= 19:
  print("お酒は20歳から。")


このプログラムを実行しますと以下の図のような出力が得られます。

if文最後のコロンとその下の行のインデントを忘れないように


このプログラムではひとまず変数 age を用意し、18という値を代入しています。
そして、if 文では「変数 age が19以下ならば」という条件を書いています。

ここで、「以下」を表す記号(≦)はプログラムでは「<=」と書くことに注意しましょう。
こういった条件で使用する記号を比較演算子といいます。

念のため、数学の復習も兼ねて説明していきます。
「以下」はその数字も含むので、もし変数 age が19の場合であっても、
上記 if 文の条件は成り立ち、
インデントされた処理( print(“お酒は20歳から。”) )が実行されます。

逆に変数 age が19より大きい(つまり19は含まない)場合は、
上記の if 文の条件は成り立たないため、
インデントされた処理は実行されず、何も出力されません。
試しに変数 age に20を代入してプログラムを実行してみましょう。

age = 20

if age <= 19:
  print("お酒は20歳から。") # 条件が成り立たず、この処理は実行されない


このように if 文を使うことで、
条件が成立した場合の処理を実現できることがわかりました。

しかし、上記の if 文のみでは、
条件が成り立たない(年齢が19以下でない)場合には、
何も出力されないため、
プログラムがきちんと実行されたのかよく分かりませんね。

そこで、条件が成り立たない場合の処理も併せて記述しておくことが考えられます。
if 文と考え方は同じで、
インデント以下に(if 文で成立しなかった場合の)処理を書くだけです。

# 年齢は20歳と想定します
age = 20

if age <= 19:
  print("お酒は20歳から。")
else:
  print("お酒には気をつけましょう。") # if文の条件が成立しない場合に実行される処理


条件が成立しない場合の処理を定義したいときには、
上記のように 「else: 」を使い、
インデント以下に処理を書きましょう。
※ if 条件: と else: 文自体はインデントしないように気をつけましょう。

JUVET
JUVET

ルール5: 条件分岐ではインデントを行う


この else というキーワードは 「if 条件」以外のすべての場合のことを指しています。
つまり、
「年齢が19以下」以外の場合はすべてelse 部分の処理が実行されるということです。

これで条件分岐の説明は終わりですが、
実はこの条件分岐こそ、プログラムの中核、、
とまではいかなくても片輪くらいの位置にはいます。
次回説明するループと組み合わせることで、プログラムの幅が一気に広ります。

次は、前回の年齢プログラムと今回の条件分岐を組み合わせてみます。

年齢プログラムを改良する

try except 構文と if else 構文のインデントは忘れずに行う
JUVET
JUVET

年齢プログラムについては前回の記事で説明しています!


前回の年齢プログラムでは try except 構文を使いました。
そこに、今回学んだ if else 構文を組み合わせていきます。

以下のプログラムを書いてみましょう。

age = input('あなたの年齢を教えてください。')

try:
  age = int(age)
  if age <= 19:
    print("お酒は20歳から。")
  else:
    print("お酒には気をつけましょう。")

except ValueError:
  print('数字のみを入力してください。')


プログラムの説明はこれまでの内容を理解できていれば問題ないかと思います。
気をつけてほしいのはインデントです。

上記プログラムでは try 以下のインデントに if else が書かれています。
そして、さらにその if else 構文における処理部分も
インデントされていることが見て取れるかと思います。

このように、
try 構文中のインデントの中に条件分岐(if else 構文)があるからといって、
if 文以下のインデントはしなくていいということにはならないのです。
それぞれのインデントを適切に行い、プログラムを書く必要があります。

今回は以上です。
次回は、条件分岐やインデントで発生しうるエラーについての補足説明をします。

まとめ

ここでは関数の定義や組み込み関数について学びました。
関数は自分で定義するのもいいけれど、
できれば組み込み関数を使って、プログラムを作成したほうがよいのでした。

また3つの組み込み関数を使って、その便利な機能も見てきました。

さらに条件によって、
処理を変える都合のいいプログラムも確認しました。
このへんの話は次回、もう少し掘り下げていきます。

今回出てきたルールは以下の通りです。

ルール5: 条件分岐ではインデントを行う


次回は条件分岐の補足と繰り返し処理(ループ)について説明します。



【P.S.】
今後もあなたのお役に立てるような記事を作成していきますので、
@AI_JUVETをフォローしていただけると大変励みになります🙂

コメント

タイトルとURLをコピーしました