Pythonロボティクスコース レッスン 17 *
テーマ.4-4 かみつきワニゲームの制作
乱数機能を学んでロボットにランダムな動きを加えよう
チャプター1
このレッスンで学ぶこと
このレッスンでは、リストを操作する各種メソッドと乱数を発生する機能について学びます。また、リストと乱数を使って、センサー(赤外線フォトリフレクタ)に指を近づけるとコンピュータ内部でくじを引き、はずれを引くとワニ型ロボットがかみつく動作をするロシアンルーレット風ゲームを作成します。
チャプター2
新しいPython文法の学習
始めに、今回のレッスンで初めて扱うPythonの文法について学習しましょう。
2. 1 リストを操作するメソッド
プログラムを書く際には、データをまとめて扱いたいということが良くあります。データを1つにまとめる方法としては、既に学習した、リスト や 辞書 が考えられます。Pythonでは、リストや辞書の要素を操作するための便利なメソッドがいくつか用意されていますので、見ていきましょう。
■ 要素の追加を行うメソッド
リストに対して要素を追加するメソッドは以下の3つがあります。
.append(x)
: リストの末尾に要素x
を1つ追加します。.insert(i, x)
: リストの任意の場所i
に要素x
を1つ追加します。.extend(xs)
: リストの後ろにリストxs
を連結します。
■ .append(x)
メソッド
.append(x)
メソッドは引数を1つとり、受け取った値をリストの末尾に追加します。
【 サンプルコード 2-1-1 】
xs = [] # 空のリストを作成
xs.append(1) # 1 を末尾に追加
print(xs) # [1]と表示される
xs.append(2) # 2 を末尾に追加
print(xs) # [1, 2]と表示される
xs.append(3) # 3 を末尾に追加
print(xs) # [1, 2, 3]と表示される
(実行結果)
[1] [1, 2] [1, 2, 3]
■ .insert(i, x)
メソッド
.insert(i, x)
メソッドは引数を2つとり、1つ目の引数で値を追加したい場所を指定できます。
【 サンプルコード 2-1-2 】
xs = [ '_0', '_1', '_2' ]
xs.insert(0, 0) # 値を追加したい場所は 0番目,追加する値は0
print(xs) # ターミナルに[0, '_0', '_1', '_2'] と表示される
xs.insert(3, 2) # 値を追加したい場所は 3番目,追加する値は2
print(xs) # [0, '_0', '_1', 2, '_2'] と表示される
(実行結果)
[0, '_0', '_1', '_2'] [0, '_0', '_1', 2, '_2']
これらの結果より、もともとその位置にあった値の1つ手前に、値が追加されることがわかります。
■ .extend(xs)
メソッド
.extend(xs)
メソッドは .append(x)
メソッドと似ていますが、値をリストの末尾に追加するのではなく、リストを末尾に連結します。
【 サンプルコード 2-1-3 】
xs = [ 0, 1, 2 ]
ys = [ 3, 4, 5 ]
xs.extend(ys) # ys を xs の末尾に連結
print(xs) # [0, 1, 2, 3, 4, 5] と表示される
(実行結果)
[0, 1, 2, 3, 4, 5]
■ 要素の削除を行うメソッド
次リストに対して要素を削除するメソッドは以下の3つがあります。
.pop(i)
: リストの任意の場所i
から要素を1つ削除します。 (もし指定が無い場合、末尾から1つ削除します。).remove(i)
: リストの要素からi
に等しい最初の要素を1つ削除します。 (削除するものが存在しない場合エラーが発生します。).clear()
: リストの全ての要素を削除します。
■ .pop(i)
メソッド
.pop(i)
メソッドは引数を1つとり、受け取った値をインデックスとして、要素の削除を行います:
【 サンプルコード 2-2-1 】
xs = [ 0, 1, 2, 3, 4 ]
xs.pop() # xs の末尾の要素を削除
print(xs) # [0, 1, 2, 3] と表示される
xs.pop(2) # xs の 2番目の要素を削除
print(xs) # [0, 1, 3] と表示される
(実行結果) ※左から「0番目」「1番目」・・・と数える
[0, 1, 2, 3] [0, 1, 3]
■ .remove(i)
メソッド
.remove(i)
メソッドは引数を1つとり、受け取った値をリストから探し出し、最初の1つを削除します。
【 サンプルコード 2-2-2 】
xs = [ 0, 1, 0, 2, 0 ]
xs.remove(0) # xs から 0 を探して削除
print(xs) # [1, 0, 2, 0] と表示される
(実行結果)
[1, 0, 2, 0]
■ .clear()
メソッド
.clear()
メソッドは、リストから全ての要素を削除します。
【 サンプルコード 2-2-3 】
xs = [ 0, 1, 2, 3, 4 ] # どんなに大きいリストを作ろうが…
xs.clear() # 全て削除することができる
print(xs) # [] (空のリスト) が表示される
(実行結果)
[]
2. 2 リストとジェネレータ
Studuino:Bitのような小型コンピュータでプログラミングを行うとき、メモリ容量 というものに注意する必要があります。
メモリとは、コンピュータがなんらかの作業を行うときに使用する机のようなもので、メモリ容量が大きいほど机が広く、同時に扱える作業の量が多くなります。メモリ容量は高性能なコンピュータであるほど大きくなります。
例えば、Studuino:Bit上でものすごく大きいサイズのリストを作成すると、メモリ容量が不足していることを示すエラーが発生します。
【 サンプルコード 2-3-1 】
xs = [] # 1,000,000個ぐらい要素を持つリストを作成する
for i in range(1000000):
xs.append(i)
このプログラムを実行すると、以下のように、MemoryError: memory allocation failed, allocating XXX bytes
と表示されます。
(実行結果)
Traceback (most recent call last): File "<stdin>", line 6, in <module> MemoryError: memory allocation failed, allocating 4194304 bytes
このようなメモリ不足への対処として、Pythonにおいては「値が必要になったときに、必要な部分だけを計算する」仕組みがあります、これを ジェネレータ と呼びます。
よく用いるジェネレータが、for文を使った反復処理で何度も取り扱ってきたrange()
関数です。これは、順番に数字を生成してくれるジェネレータです。
例えば、以下のプログラムを実行してみてください。
【 サンプルコード 2-3-2 】
gs = range(1000000) # 1,000,000個もの要素を計算できるジェネレータ
print(gs[999999]) # 1,000,000個目を確認 (この1つだけを計算している)
(実行結果)
999999
もしそのままリストを作成した場合、1,000,000個もの要素を持つリストは、【 サンプルコード 2-3-1 】でエラーが発生したように、Studuino:bitでは扱うことができません。ですがこのように、ジェネレータであればそれが可能になります。
range()関数は、引数を3つ取ることができ、それぞれ次のような機能を持ちます。
range(N)
:0
~N - 1
までの数値を生成できるジェネレータを作成する。range(start, stop)
:start
~stop - 1
までの数値を生成できるジェネレータを作成する。
例)range(1, 10)
⇒1
~9
までの数値を生成できるジェネレータとなる。range(start, stop, step)
:start
~stop - 1
までの数値を、step
刻みで生成できるジェネレータを作成する。
例)range(1, 10, 2)
⇒1
~9
までの数値を、2
刻みで生成できる (1
,3
,5
… ) ジェネレータとなる。
なお、Lesson 4-1で「定数」という考え方を学習しましたが、ジェネレータは 書き換えが不可能 という意味で、定数と同じ役割をもつ考えることもできます。
【 サンプルコード 2-3-3 】
gs = range(5)
gs[4] = 0 # 代入による書き換えはできない!
(実行結果)
Traceback (most recent call last): File "<stdin>", line 4, in <module> TypeError: 'range' object doesn't support item assignment
もし、ジェネレータから読み書きが可能な通常のリストを作成したい場合、list(~)
関数を用います。
【 サンプルコード 2-3-4 】
gs = range(5)
xs = list(gs)
xs[4] = 0 # xsは通常のリストなので、代入による書き換えができる
2. 3 ランダムさを取り扱う
プログラムを作成していると、ランダムに何かを行いたいということがあります。例えば、くじ引きゲームをStuduino:bitで作成する場合、用意したくじの中からランダムに引くといった処理が必要になります。
Pythonでは、random
モジュールを使用することで、さまざまなランダムさを取り扱うことができます。代表的なものは下記の通りです。
random.random()
:0
以上,1
未満の 実数 をランダムに生成します。random.randint(a, b)
:a
以上,b
以下の 整数 をランダムに生成します。random.uniform(a, b)
:a
以上,b
以下の 実数 をランダムに生成します。random.choice(xs)
: リストxs
を引数にとり、ランダムに1つ要素を選んで返します。
■ random()
関数
random()
関数は、ランダムに数値を生成する最も基本的な関数です。0~1の範囲でランダムな浮動小数点数を生成します。
【 サンプルコード 2-4-1 】
import random
for i in range(5):
print(random.random())
(実行結果の例)
※実行する度に結果が変わることを確認しましょう。
0.7111824 0.4089468 0.09752237 0.8465231 0.8841982
■ random.randint(a, b)
関数
random.randint(a, b)
関数は、ランダムに数値を生成する範囲を決めることができ、なおかつその数値を整数に限定します。
【 サンプルコード 2-4-2 】
import random
for i in range(5):
print(random.randint(1, 10))
(実行結果の例)
※実行する度に結果が変わることを確認しましょう。
4 4 6 3 2
■ random.uniform(a, b)
関数
random.uniform(a, b)
関数は、random.randint(a, b)
関数の実数(浮動小数点数)版です。
【 サンプルコード 2-4-3 】
import random
for i in range(5):
print(random.uniform(1, 10))
(実行結果の例)
※実行する度に結果が変わることを確認しましょう。
2.791369 1.38526 2.406701 9.532597 6.098391
■ random.choice(xs)
関数
random.choice(xs)
関数は、文字列やリスト、タプルなどシーケンスなデータxs
からランダムに1つの要素を返します。くじ引きゲームなどを作成する際に使いやすい関数と言えるでしょう。
【 サンプルコード 2-4-4 】
from random import choice
# 大吉,吉,小吉,凶とおみくじをリストで用意
fortune = ['Great Fortune', 'Fortune', 'Small Fortune', 'Curse']
for i in range(5):
print(choice(fortune)) # ランダムにおみくじを引く
(実行結果の例)
※実行する度に結果が変わることを確認しましょう。
Curse Small Fortune Fortune Great Fortune Curse
チャプター3
ワニ型ロボットの組み立て
組立説明書を開き、手順に沿ってワニ型ロボットを組み立てましょう。
3. 1 組み立てに必要なパーツ
- Studuino:bit×1
- ロボット拡張ユニット×1
- 電池ボックス×1
- サーボモーター×1
- 赤外線フォトリフレクタ×1
- センサー接続コード(3芯15cm)×1
- ブロック基本四角(黒)×1
- ブロック三角(グレー)×4
- ブロック三角(赤)×4
- ブロックハーフA(グレー)×2
- ブロックハーフC(白)×4
- ブロックハーフD(白)×6
- ステー×4
【 アーテックブロックの形状 】
【 ワニ型ロボットの組み立て説明書 】
チャプター4
かみつきワニゲームのプログラム作成
かみつきワニゲームは、次の機能を組み合わせて作成します。
- ボタンAを押すとゲームを開始する機能
- くじを用意して、はずれを決める機能
- センサー(赤外線フォトリフレクタ)が反応すると、くじを引く機能
- はずれを引いたときにワニ型ロボットがかみつく機能
- はずれを引かなかったときに音で知らせる機能
また、各機能のプログラムは次の流れで順番に実行します。
【 かみつきワニゲームのプログラムの処理の流れ 】
プログラムの見通しを良くするため、各機能はできるだけ関数にまとめて実行します。次の手順に沿って順番に実装し、かみつきワニゲームのプログラムを完成させましょう。
4. 1 くじを用意してはずれを決める機能の作成
はじめに、くじとなる数字のリストを用意します。このリスト中からいくつかの数字をはずれのくじとして選び、別のリストに保存します。センサーが反応するたびにこのくじを引き、引いたくじの数字がはずれくじのリストに含まれていれば、ワニ型ロボットがかみつく動作をします。このはずれくじの数字を決めるコードを書き、関数にまとめましょう。
■ くじの数とはずれくじの数を決める
はずれの引きやすさは、全体のくじの数とはずれくじの数で決まります。今回は一度引いたくじは元に戻さない(リストから除く)方法でプログラムを作成するため、後で引くほど、はずれくじを引く確率が高くなります。
それぞれの数を決めて次の変数に保存しましょう。
lotteries_num = 30 # くじは英語で「lottery」といいます。くじは複数あるため、複数形の「lotteries」としています。
lost_lotteries_num = 3 # はずれたくじは英語で「lost lottery」といいます。こちらも複数あるため複数形で変数名をつけています。
■ はずれのくじを選ぶ関数を作成する
新たに関数を定義します。list()関数
とrange()関数
の組み合わせで、決めたくじの数と同じ長さをもつ数字のリストを作成します。また、はずれくじを保存するための空のリストも用意します。このリストにランダムに選んだ数字を追加していきます。
追加【4~6行目】
lotteries_num = 30
lost_lotteries_num = 3
def choice_lost_lotteries():
lotteries = list(range(1,lotteries_num+1)) #1~lotteries_numまでの数が入ったリストを作成します。
lost_lotteries = []
はずれくじをランダムに選ぶためにrandomモジュール
のchoice() 関数
を使います。はずれくじの数だけ繰り返しchoice()関数
でリストlotteries
からランダムに1つ数字を選びます。選ばれた数字は一時的に変数に保存し、append()メソッド
でリストlost_lotteries
に追加し、remove()メソッド
でリストlotteries
からその要素を削除します。
追加【1行目、9~13行目】
import random
lotteries_num = 30
lost_lotteries_num = 3
def choice_lost_lotteries():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = []
for i in range(lost_lotteries_num):
num = random.choice(lotteries)
lost_lotteries.append(num)
lotteries.remove(num)
return lost_lotteries
これで、「くじを用意して、はずれを決める機能」が完成しました。
4. 2 センサーが反応するとくじを引く機能の作成
指を近づけたことは、ワニ型ロボットに取り付けた赤外線フォトリフレクタで感知します。まずは、指を近づけたときの赤外線フォトリフレクタの値から確認していきましょう。
■ 赤外線フォトリフレクタのしきい値を決める
次のコードを追加して、赤外線フォトリフレクタの値を調べます。
変更・追加【1行目、3行目、8行目、10行目~13行目】
from pyatcrobo2.parts import IRPhotoReflector
import random
import time
lotteries_num = 30
lost_lotteries_num = 3
ir = IRPhotoReflector('P0')
while True:
value = ir.get_value()
print(value)
time.sleep_ms(1000)
def choice_lost_lotteries():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = []
for i in range(lost_lotteries_num):
num = random.choice(lotteries)
lost_lotteries.append(num)
lotteries.remove(num)
return lost_lotteries
上のプログラムを実行し、ワニ型ロボットの口を開けた状態で、赤外線フォトリフレクタの表面から少し離した所に指を固定して、ターミナル上に表示された値を確認します。
(ターミナルの表示例)
830 882 887 897 874
この値を参考にして、指が近づいた と判断できる赤外線フォトリフレクタの しきい値 を決めましょう。また、次から以下の4行のコードは使わないため、削除しておきます。
while True:
value = ir.get_value()
print(value)
time.sleep_ms(1000)
■ ゲーム開始後に指が近づいたことを感知するとくじを引く関数を作成する
決めたしきい値は変数に保存して使います。くじを引く処理は、新たに関数を定義してその中にコードをまとめます。この関数はゲーム開始時に実行します。ゲーム開始直後にlist()
関数とrange()
関数の組み合わせでくじを作成します。また、用意したchoice_lost_lotteries()
関数ではじれくじのリストを作成します。その後は無限ループで赤外線フォトリフレクタの値を繰り返し取得し、しきい値を超えた場合は、random
モジュールのchoice()
関数でリストlotteries
からランダムに1つ数字を選び、変数に保存します。
追加【9行目、20~27行目】
from pyatcrobo2.parts import IRPhotoReflector
import random
import time
lotteries_num = 30
lost_lotteries_num = 3
ir = IRPhotoReflector('P0')
ir_threshold = 800 #しきい値は英語でthreshold(スレッショルド)といいます。
def choice_lost_lotteries():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = []
for i in range(lost_lotteries_num):
num = random.choice(lotteries)
lost_lotteries.append(num)
lotteries.remove(num)
return lost_lotteries
def play_game():
lotteries = list(range(1,lotteries_num+1)) # choice_lost_lotteries()関数のlotteriesとは違う変数として扱われます。
lost_lotteries = choice_lost_lotteries()
while True:
value = ir.get_value()
if value > ir_threshold:
num = random.choice(lotteries)
4. 3 はずれを引くとかみつく機能の作成
続けて、引いたくじ(数字)がはずれの場合はワニ型ロボットがかみつく動作を行い、はずれでない場合は音で知らせる機能を作成します。
■ かみつく動作と音で知らせる関数の作成
かみつく動作の関数では、ブザーから低い音を鳴らしながら次の動きを3回繰り返します。
音ではずれでないことを知らせる関数には短く高い音を鳴らす処理と次のくじを引くまでの間にすこし時間をあけるために1秒間処理を停止するコードをまとめます。
追加【1~2行目、12行目、14~21行目、23~25行目】
from pystubit.board import buzzer
from pyatcrobo2.parts import IRPhotoReflector, Servomotor
import random
import time
lotteries_num = 30
lost_lotteries_num = 3
ir = IRPhotoReflector('P0')
ir_threshold = 800
servo = Servomotor('P13')
def bite(): # かみつく動作の関数
buzzer.on('C4')
for i in range(3):
servo.set_angle(100)
time.sleep_ms(200)
servo.set_angle(135)
time.sleep_ms(200)
buzzer.off()
def sound_of_safe(): # 音ではずれでないこと知らせる関数
buzzer.on('C7',duration=200)
time.sleep_ms(1000)
def choice_lost_lotteries():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = []
for i in range(lost_lotteries_num):
num = random.choice(lotteries)
lost_lotteries.append(num)
lotteries.remove(num)
return lost_lotteries
def play_game():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = choice_lost_lotteries()
while True:
value = ir.get_value()
if value > ir_threshold:
num = random.choice(lotteries)
■ かみつく動作と音で知らせる関数の作成
引いたくじ(数字)がはずれかどうかを判定して、上で用意した2つの関数bite()
とsound_of_safe()
を実行します。かみつく動作を行ったあとは、無限ループを抜けて一度ゲームを終了します。はずれ以外を引いた場合は、くじのリストlotteries
からそのくじ(数字)をremove()
メソッドで削除します。
追加【44~49行目】
from pystubit.board import buzzer
from pyatcrobo2.parts import IRPhotoReflector,Servomotor
import random
import time
lotteries_num = 30
lost_lotteries_num = 3
ir = IRPhotoReflector('P0')
ir_threshold = 800
servo = Servomotor('P13')
def bite():
buzzer.on('C4')
for i in range(3):
servo.set_angle(100)
time.sleep_ms(200)
servo.set_angle(135)
time.sleep_ms(200)
buzzer.off()
def sound_of_safe():
buzzer.on('C7',duration=200)
time.sleep_ms(1000)
def choice_lost_lotteries():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = []
for i in range(lost_lotteries_num):
num = random.choice(lotteries)
lost_lotteries.append(num)
lotteries.remove(num)
return lost_lotteries
def play_game():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = choice_lost_lotteries()
while True:
value = ir.get_value()
if value > ir_threshold:
num = random.choice(lotteries)
if num in lost_lotteries:
bite()
break
else:
sound_of_safe()
lotteries.remove(num)
4. 4 残りの機能の作成とプログラム全体の流れのまとめ
最後にゲーム開始音を鳴らす関数とワニ型ロボットを初期状態にリセットする関数を用意し、無限ループで始めに確認した全体のプログラムの流れにもとづいて順番に各関数を実行するコードを追加してプログラムを完成させましょう。
【かみつきワニゲームのプログラムの処理の流れ】
【 サンプルコード 4-5-1 】
変更・追加【1行目、27~30行目、32~33行目、60~66行目】
from pystubit.board import buzzer,button_a
from pyatcrobo2.parts import IRPhotoReflector,Servomotor
import random
import time
lotteries_num = 30
lost_lotteries_num = 3
ir = IRPhotoReflector('P0')
ir_threshold = 800
servo = Servomotor('P13')
def bite():
buzzer.on('C4')
for i in range(3):
servo.set_angle(100)
time.sleep_ms(200)
servo.set_angle(135)
time.sleep_ms(200)
buzzer.off()
def sound_of_safe():
buzzer.on('C7',duration=200)
time.sleep_ms(1000)
def sound_of_start(): # ゲーム開始音を鳴らす関数
buzzer.on('C6',duration=200)
buzzer.on('D6',duration=200)
buzzer.on('E6',duration=200)
def reset(): # ワニ型ロボットを初期状態にリセットする関数
servo.set_angle(135) # 口を開けた状態にする
def choice_lost_lotteries():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = []
for i in range(lost_lotteries_num):
num = random.choice(lotteries)
lost_lotteries.append(num)
lotteries.remove(num)
return lost_lotteries
def play_game():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = choice_lost_lotteries()
while True:
value = ir.get_value()
if value > ir_threshold:
num = random.choice(lotteries)
if num in lost_lotteries:
bite()
break
else:
sound_of_safe()
lotteries.remove(num)
# 以下が全体のプログラムの流れを制御するコード
reset()
while True:
if button_a.was_pressed():
sound_of_start()
play_game()
time.sleep_ms(1000)
reset()
チャプター5
課題:はずれを引く確率を常に一定にしたプログラムへの変更
上で完成したプログラムはくじを引くたびに、はずれを引く確率が上がるようになっていました。ここでは課題として、常に一定の確率ではずれを引くようにプログラムを変更してみましょう。
<ヒント>
下の絵を参考にして、確率を一定にするための条件をよく考えましょう。
5. 1 プログラムの作成例
【 サンプルコード 4-5-1 】では、57行目のlotteries.remove(num)
で、一度引いたくじの数字をリストlotteries
から除外していましたが、ここでは引いたくじは除外せず、元に戻すことになるので、この1行のコードを削除するだけで、はずれの確率を常に一定にすることができます。
削除【57行目】
from pystubit.board import buzzer,button_a
from pyatcrobo2.parts import IRPhotoReflector,Servomotor
import random
import time
lotteries_num = 30
lost_lotteries_num = 3
ir = IRPhotoReflector('P0')
ir_threshold = 800
servo = Servomotor('P13')
def bite():
buzzer.on('C4')
for i in range(3):
servo.set_angle(100)
time.sleep_ms(200)
servo.set_angle(135)
time.sleep_ms(200)
buzzer.off()
def sound_of_safe():
buzzer.on('C7',duration=200)
time.sleep_ms(1000)
def sound_of_start():
buzzer.on('C6',duration=200)
buzzer.on('D6',duration=200)
buzzer.on('E6',duration=200)
def reset():
servo.set_angle(135)
def choice_lost_lotteries():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = []
for i in range(lost_lotteries_num):
num = random.choice(lotteries)
lost_lotteries.append(num)
lotteries.remove(num)
return lost_lotteries
def play_game():
lotteries = list(range(1,lotteries_num+1))
lost_lotteries = choice_lost_lotteries()
while True:
value = ir.get_value()
if value > ir_threshold:
num = random.choice(lotteries)
if num in lost_lotteries:
bite()
break
else:
sound_of_safe()
reset()while True:
if button_a.was_pressed():
sound_of_start()
play_game()
time.sleep_ms(1000)
reset()
チャプター6
おわりに
6. 1 このレッスンのまとめ
このレッスンでは新たに次のことを学習しました。
- メソッドを使ったリストの要素の操作
追加:append(), insert(), extend()
削除:pop(), remove(), clear() - list()関数とrange()関数を組み合わせた数字リストの作成
- メモリの使用量を抑えられるジェネレータ
- 乱数を扱うrandomモジュールとその関数
random(), randint(), uniform(), choice()
また、学習した乱数機能を応用してくじ引きの仕組みをつくり、はずれを引くとワニ型ロボットがかみつくゲームを制作しました。
6. 2 次のレッスンについて
次のレッスンからは、より高度なプログラム制御を行うためのPythonの文法を重点的に学習していきます。