プログラムは基本的に上から下に順番に実行されるけど、「もし〇〇だったら、この処理をする」「この処理を10回繰り返す」のように、処理の流れ(制御)を変えることができます。これを制御構文といいます。
<if> もし〜なら (条件分岐)例えば、エアコンの新機能を作るとする。室内を最適な温度に保ちたいわけだけど、いちいち温度設定をしたり、冷房と暖房を切り替えたりするがめんどくさい!ていう悩みを解決してみよう。
プログラムを日本語で表現してみよう 新しいプログラムを書き始めるときに、いきなりpythonのプログラムを書き始めるのもいいんだけど、複雑なプログラムを書くときはあんまりおすすめしない。例えば英語で手紙を書くときに、まず何を伝えたいかを日本語で頭の中で整理してから英語に直すと、文章を書いている間に余計なことを考えたりしなくてすむから、結果的に効率がいい、なんてことがある。 今回作りがいコードはこんな感じ
もし 外の気温が 25度以上だったら
「冷房オン」とprint
そうじゃなくて 外の気温が 10度以下だったら
「暖房オン」とprint
どっちでもなかったとき
「電源オフ」とprint
ここにif文のコード例を挿入
if = 「もし〜なら」ifを使った条件分岐の書き方はこんな感じ
if 条件:
条件に合致する場合に実行したい処理
pythonコードとインデント 2行目の処理の部分の左側にある空白の部分を、「インデント」といって、入力するときはスペースキーではなくtabキーで入力できる。 pythonの大きな特徴として、決まったとおりにインデントしないと、エラーになったり、想定通りに動かないという特徴がある(言語によっては動く言語もある) このif文の場合、「条件」に合致したときに実行したい処理はどの処理なのかを、インデントをすることで示しているわけ。たとえばこういう書き方をすると、三行目の処理は条件に関係なく実行される
if 条件:
条件に合致する場合に実行したい処理
条件に関係なく実行される処理
今回の場合、この「条件」のところに「外の気温が 25度以上だったら」が入るわけだけどその部分をどう書くかが問題。「25」という指定された数字と、実際の外の気温を比較する必要がある。
算数・数学でいうところの第なり(>)とか小なり(<)のプログラミング版の書き方。
| 比較演算子 | 意味 |
|---|---|
| == | 等しい (イコールふたつ!) |
| != | 等しくない |
| > | より大きい |
| < | より小さい・未満 |
| >= | 以上 |
| <= | 以下 |
これをpythonコードに落とし込んでみよう 仮に、外の気温=Outside_tempを、18度とします。
outside_temp = 18
#外の気温が25度以上だったら「冷房オン」とprint
if outside_temp >= 25:
print("冷房")
※ コードの中の # で始まる行は「コメント」といって、プログラムには関係のない行として無視されます。どんな処理をしているかのメモを残したりするときに使います。
elif と else複雑な条件分岐を書くときは、条件が2以上になる。今回の条件は
①外の気温が25度以上
②外の気温が10度以下
③ ①②以外(10度より高く、25度未満)
の3つ
elif は、条件分岐のなかにいくつでも追加できる。2つめ、3つ目の条件を追加するときに追加するやつ
else は、その上にあるどの条件にも合致しないときに実行する処理を書くときにつかうやつ。他の2つと違ってこの場合は条件を書く必要がない
elif elseを使うバージョンの条件分岐の書き方はこんな感じ。
if 条件①:
条件①に合致する場合に実行したい処理
elif 条件②
条件②に合致する場合に実行したい処理
elif 条件③
条件③に合致する場合に実行したい処理
・・・
else:
今までのどの条件に合致しなかったときに実行したい処理
これを使って、エアコンプログラムを完成させてみよう
outside_temp = 18
# 外の気温が25度以上だったら「冷房オン」とprint
if outside_temp >= 25:
print("冷房オン")
# 外の気温が10度以下だったら「暖房オン」とprint
else outside_temp <= 10:
print("暖房オン")
# そのどちらでもなかったときに「電源オフ」とprint
else:
print("電源オフ")
<for> 回数指定の繰り返しコードを書くときのとても重要な考え方として、「コードをわかりやすく、短くまとめる」というのがある。 真夏の体育館での校長先生の話を考えてみよう。5分ですむ話を、1時間も2時間もされたら、たまったもんじゃないよね。でも大体校長先生の話とかって「挨拶をしようね」「礼儀正しくしようね」ってだけの内容無事が多い(気がするw) プログラミングをしていくうえで、「おんなじことを何回も繰り返し実行したい」っていうシーンは結構ある。例えば
1つ目のLINEの例を考えてみよう。
たとえばクラスが100人いたときに、コードはこんな感じ(実際にはlineを送る処理はもっと複雑だけど)
print("LINEを送信")
print("LINEを送信")
print("LINEを送信")
print("LINEを送信")
print("LINEを送信")
print("LINEを送信")
print("LINEを送信")
print("LINEを送信")
・・・
# これを100人分繰り返す
こんな感じで、回数が決まっている(今回は100回)繰り返しのは、pythonではこう書きます。
for i in range(繰り返し回数):
繰り返し実行したい処理
これをもとに、さっきのLINE送信プログラムを書いてみると
for i in range(100):
print("LINEを送信")
このコードを動かしてみよう
for i in range(10):
print(i)
実行結果↓
0
1
2
3
...(省略)
10
range(10)とすると、0から9までの数字データのかたまり(配列といいます)が入って、for文といっしょに使うことで、処理中にその塊に入っているデータに順番にアクセスしていく感じ。0から9だから、全部で10回の繰り返しになる、てこと。iという文字に、繰り返しごとにデータが順番に入っていく感じ。ここの文字は別にiである必要はなくて、自由に名前をつけられる。 配列には他にも「リスト」などの種類があって、こっちは数字だけじゃなくて文字も扱える。 配列を使った繰り返しの例はこんな感じ
teacher_list = ["リッキー", "オッキー", "ガッキー"]
for teacher in teacher_list:
print(i + "かっこいい")
実行結果↓
リッキーかっこいい
オッキーかっこいい
ガッキーかっこいい
<while> 条件指定の繰り返しfor文は回数指定の繰り返しだけど、例えばこんなとき、何回繰り返すことになるかわかんないよね ・気温が30度以上である限りスプリンクラーを巻き続ける ・「おわり」と指示するまで仕事をやめないロボット ・「君がッ 泣くまで 殴るのをやめないッ」 これらは回数じゃなくて条件によって繰り返すかどうかを制御する必要がある。 while文の繰り返しの書き方はこんな感じ
while 繰り返すときの条件:
繰り返したい処理
試しに、「君がッ 泣くまで 殴るのをやめないッ」を、pythonで実装してみよう。 inputという特殊な関数を使って、ユーザーが文字を入力して、「ぴえん」という文字を入力したときだけ処理が終了して許してもらえるというプログラム。
dio = ""
while dio != "ぴえん":
print("オラ!")
dio = input("dio:")
print("ゆるしてやろう")
ここでもインデントが重要で、インデントされている2つの処理が繰り返し実行される処理、インデントされていない print(“ゆるしてやろう”) の部分は、繰り返し=while文が終了したあとに実行されることがわかる。
<details markdown=”1>
試しにこのコードを実行してみよう。
ricky = "かっこいい"
print(ricky == "かっこいい")
実行結果
True
True : 正しい
pythonも認めざるを得ないかっこよさ。
冗談はさておき、これは ricky という変数と "かっこいい" という文字データは同じ という条件が「正しい」ので、Trueという結果が帰ってきている感じ。
逆に
ricky = "かっこいい"
print(ricky == "ブサイク")
コレを実行してみると
False
という結果がでます。(False=フォルス:間違い)
今まで出てきたif文やwhile文は、「条件」が「TrueかFalseか」を判定しているわけ。例えば
if ricky == "イケメン":
print("わかるー")
というif文は、ricky == "イケメンという条件がTrueのときに「わかるー」とprintする、という感じになる。ちなみに、パソコン内部的にはTrueは1、Falseは0として扱われるので、最初に出てきた「パソコンは0と1だけでデータを処理している」っていう話とつながってきたりする。試しにこのコードを実行すると、「おんなじ!」と出力される。
if (True == 1):
print("おんなじ!")
</details>
ゲームが起動中にずーっと同じ処理を繰り返したい場合などによく使われる手法で、無限ループというのがある。たとえばこんなコード(実行する場合は、必ず近くに詳しい人がいるときにやってください。やりすぎるとパソコンに余計な負担をかけてしまうことがあります。)
while True:
print("リッキーかっこいい")
無限にリッキーかっこいいとprintするという非常に正しいコードになってる。 ループを抜けたい場合はCtrl + C で終了できる。
プログラムを書いていくうえで、おんなじ処理を何回も実行したいときがあって、その一つの解決方法がforやwhile何だけど、もう一つのやり方がこの関数。
関数の基本の考え方は、何度も使いそうな処理を一箇所にまとめておいて、使いたいときに処理を呼び出すというやり方。
以下のコードは、for文などの繰り返しと違うところは、回数や条件を指定できない代わりに、引数というシステムを使うと、同じ処理を繰り返すだけではなく、同じ「ような」処理を繰り返し行うことができる。書き方の説明の前に、実際に関数をつかって書かれたコードを見てみよう、
以下の2つのコードは、どちらも正方形の面積を求めるプログラム何だけど、違いを見てみよう。
def square():
hen_length = 5
menseki = hen_length ** 2
return menseki
print(square())
print(square())
print(square())
このコードを実行すると、こんな感じで、print(square())を実行するたびに一辺の長さが5の正方形の面積を求めることができるぜ!なんて便利な関数なんだ!
25
25
25
続いて、引数を使うパターンがこっち
def square(hen):
menseki = hen ** 2
return menseki
print(square(5))
print(square(6))
print(square(7))
実行すると、それぞれ1辺が5,6,7の正方形の面積をprintしていることがわかる。これで、同じ処理を、条件を変えて実行することができるようになったわけだ
処理をするのに必要で、関数に与えるデータのことを引数、処理した結果返ってくるデータを 戻り値(返り値と言ったりもする) という。
データの流れを図で追ってみるとこんな感じ。

| 機能 | 役割 |
| 引数 | 関数にわたすデータ |
| 戻り値 | 関数から返ってくるデータ |
ユーザーが入力した文字に対して、「◯◯さん、おはよう!」という文字を返してprintする関数を作ってみよう。
ユーザーが入力したときに、その文字をプログラムの中で使えるようにする、input関数問のがある。使い方はこんな感じ。
moji = input("入力した文字:")
print(moji)
これを実行すると、「入力した文字:」という文字が出た状態でプログラムが止まるので、そのあとに好きな文字を入力してエンターを押す。すると、変数mojiに入力した文字が入ってprintされる。これを利用して、関数を作成してみよう。
| 関数名 | goodmorning |
| 引数 | goodmorning |
| 戻り値 | nameに「さん、おはよう!」を足したもの。 |
name = input("お名前は?:")
def goodmorning(name):
return name + "さん、おはよう!"
goodmorning(name)
挨拶bot①を改良して、時間によって挨拶の内容を変えるプログラムを作ってみよう
<ヒント①>
input関数を使って時間を入力して取得できるようにしても、こんなかんじのエラーがでる。input関数を使って返ってくるデータは常に「文字」なので、数字に変換して上げる必要がある。
int(数字に変更したい文字)
<ヒント②> 時間によって挨拶の内容を変える = 「もし」時間が◯時から◯時の間だったら・・・
name = input("お名前は?:")
hour = int(input("時間(24h)は?:"))
def goodmorning():
if hour >= 5 and hour < 10:
greeting = "おはよう"
elif hour >= 10 and hour < 18:
greeting = "こんにちは"
else:
greeting = "こんばんは"
return name + f"さん、{greeting}!"
<br>
goodmorning(name, hour)
さてさて これまでpythonの基礎文法をざっとやってみたわけだけど、これがどう役に立つのかってところだ。 pythonでできることはほんとにいろいろあって、例えばwebサイトを作ったり、スマホアプリを作ったり、ロボットを動かしたりってことができるんだけど、それぞれを実現するためには、pythonの基礎文法に加えて、それぞれの専門分野を少しづつでも勉強していく必要があるんだけど、今回の講義ではゲーム制作をやっていくよ。 pythonの大きな特徴として、「これが実現したい!」というときに、そのために使える便利な道具(「ライブラリ」)がたくさん用意されていることがあげられる。今回はレトロ2Dゲームを作るのに便利な pyxel(ピクセル) というライブラリを使ってみよう。
pyxelのコードは、大きく以下の3つの関数で構成されている。
例えば、四角い図形が右にスーっと移動するプログラムを書くとしよう。すると、プログラムの流れとしては
てかんじになる。pyxelで図形の位置を示すのに x座標・y座標 を使って表すよ。右方向に四角が進むということは、x座標が増えていくということになる。
早速やってみよう
まずは最も基本的な図形である四角形を表示してみよう。 全体のコードはこんな感じ
import pyxel
# pyxelを初期化:画面のサイズを200x200ピクセルに設定
pyxel.init(200, 200)
# 四角に関する情報を定義
rect_info = {
"x": 10,
"y": 10,
"w": 100,
"h": 100,
"col": 7
}
# update関数:四角を移動する処理をする
def update():
pass
# draw関数:四角を描画する
def draw():
# 背景色を黒にする
pyxel.cls(0)
# 四角を描画
pyxel.rect(rect_info["x"], rect_info["y"], rect_info["w"], rect_info["h"], rect_info["col"])
pyxel.run(update, draw)
pyxel.rect(x, y, w, h, col): 四角形を描画します。
x, y: 左上の座標w, h: 幅と高さcol: 色(0〜15の数字で指定)さて、このままだと四角い図形がドーンとでて終わりになるので、四角を動かしてみよう。update関数に動かす処理を書くんだったけど、四角のx座標を1大きくする処理を書いてみよう
import pyxel
# pyxelを初期化:画面のサイズを200x200ピクセルに設定
pyxel.init(200, 200)
# 四角に関する情報を定義
rect_info = {
"x": 10,
"y": 10,
"w": 100,
"h": 100,
"col": 7
}
# update関数:四角を移動する処理をする
def update():
rect_info["x"] = rect_info["x"] + 1
# draw関数:四角を描画する
def draw():
# 背景色を黒にする
pyxel.cls(0)
# 四角を描画
pyxel.rect(rect_info["x"], rect_info["y"], rect_info["w"], rect_info["h"], rect_info["col"])
pyxel.run(update, draw)
次回以降細かい使い方の説明はしていくのでよしとしよう。 とりあえず、今のコードのいろんなところをいじってみよう。