Turtleグラフィックス④ データ型と関数
データ型と関数
Turtleグラフィックスを利用して, データ型 と 関数 の仕組みに関して学習しましょう. データ型とは,変数に記録されたデータの型のことです. リテラルはユーザ側が表現することが可能なデータのことですが, データ型はプログラム側がデータを区別するために用いる仕組みと考えると良いでしょう. また,関数は特定の処理に名前を付けて呼び出すための機能のことです. 関数を用いることで,煩雑なコードをすっきりとまとめて表現することが可能になります.
準備
Muエディタを起動したら,Python3 モードを選択しましょう. ツールバーにある「保存」をクリックして,「chapter5.py」という名前でスクリプトを保存します. また,Turtleグラフィックスのライブラリ(モジュール)をインポートしておきましょう.
# Turtleグラフィックスのライブラリをインポート
from turtle import *
データ型
データ型
Pythonのデータ型を次の表にまとめます. 数値リテラルは,整数ならint型,小数ならfloat型となります. また,文字列リテラルはstr型,TrueとFalseの真理値はbool型になります.
データ型 | 説明 | 例 |
---|---|---|
int | 整数 | 10, -1 |
float | 小数 | -0.1, 3.14 |
str | 文字列 | “abc”, “あいう” |
bool | 真理値 | True, False |
type()
を用いて,データ型を確認してみましょう.
print(type(10)) # -> int
print(type(0.1)) # -> float
print(type("abc")) # -> str
print(type(True)) # -> bool
例題1
次の変数のデータ型を確認しなさい.
x = "100"
y = "3.14"
z = "True"
キーボードからの入力
input()
を用いることで,ユーザがキーボードから入力した値を受け取ることができます.
例として,消費税の計算を考えてみましょう(税率は10%とする).
ユーザから入力された金額を1.1倍して税込金額を計算します.
次のコードはエラーとなってしまいますが,その理由を考えてみてください.
# 消費税の計算
price = input("金額を入力してください >>") # 100を入力
price = price * 1.1 # -> エラーになる
print(price)
エラーになる理由は,input()
で入力された数値は,str型
として変数に保持されるからです.
str型
に対して乗算(*
)を適用することはできません.
このような場合は,データ型を変換します.
int型に変換するにはint()
,float型に変換するにはfloat()
,str型に変換するにはstr()
を用います.
# 消費税の計算
price = input("金額を入力してください >>") # 100を入力
price = int(price) # str型からint型へ変換
price = price * 1.1 # -> 小数が表示されてしまう
print(price) # -> 110.00000000000001
int型に変換することでエラーは解決できます. しかし,出力結果が小数(float型)になってしまっています.
例題2
上記の消費税の計算結果を整数で表示してください.
キーボード入力を活用した描画
キーボード入力を活用してTurtleグラフィックスを描画してみましょう.
ユーザが入力した半径(radius
)に合わせて円を描画します.
円を描画するにはcircle(radius)
を用います.
speed(0)
radius = input("半径を入力してください >>")
radius = int(radius)
circle(radius)
関数
関数には,Pythonに組み込まれている関数と,ユーザが定義する関数の2種類があります.
前者はこれまでに使用してきたprint()
やinput()
などが該当します.
後者はユーザが関数に名前を付けて定義します.
関数は,引数 や 返り値(戻り値) と組み合わせて定義することができます.
例として円の面積を計算する関数calcArea
を考えてみましょう.
円の面積を求めるには円周率が必要なため,numpyモジュール をインポートしておきます.
円周率はnp.pi
で参照することができます.
# numpyモジュールをインポート
import numpy as np
# 円周率
print(np.pi) # -> 3.141592653589793
関数定義
関数を定義するにはdef
を用います.
実行する処理の部分は,for文やif文と同様にインデント(字下げ)が必要なことに注意してください.
def 関数名():
関数を呼び出したときに実行する処理
半径3の円の面積を計算するcalcArea()
を定義します.
実行する処理の内部でprint()
を実行し,計算結果を表示しています.
関数を呼び出し実行するには,定義した関数名calcArea()
を用います.
# 関数を定義
def calcArea():
radius = 3 # 半径は3
area = radius ** 2 * np.pi # 半径*半径*円周率
print(area)
# 関数の呼び出し
calcArea() # -> 28.274333882308138
引数を利用した関数定義
上記の関数では,異なる半径の円の面積を計算するには,関数自体を修正しなくてはいけません. このような場合は,引数(ひきすう) を用います. 関数名の後ろの括弧の中に記述された変数が引数です. 関数を呼び出すときに,引数に渡した値が,関数の中で用いられます. 複数の引数を設定する場合は,変数をカンマで区切って記述することが可能です.
def 関数名(引数1, 引数2, …):
関数を呼び出したときに実行する処理
ここでは,円の半径radius
を引数として設定し,関数を呼び出すときに5
を引数の値として渡しています.
# 関数を定義
def calcArea(radius):
area = radius ** 2 * np.pi
print(area)
# 関数の呼び出し
calcArea(5) # -> 78.53981633974483
返り値を利用した関数定義
上記の関数では,計算された結果をprint()
で表示していますが,呼び出し元で利用することができません.
このような場合は,返り値(戻り値) を用います.
処理の最後にreturn
で指定された値が返り値です.
返り値は呼び出し元で計算結果として受け取ることが可能です.
def 関数名(引数1, 引数2, …):
関数を呼び出したときに実行する処理
return 返り値
ここでは,半径3の円の面積と,半径5の円の面積を返り値として受け取り,この合計を呼び出し元で出力しています.
# 関数を定義
def calcArea(radius):
area = radius ** 2 * np.pi
return area
# 関数の呼び出し
area3 = calcArea(3) # -> 28.274333882308138
area5 = calcArea(5) # -> 78.53981633974483
print(area3 + area5) # -> 106.81415022205297
関数を活用した描画
頂点数を指定して任意の多角形を描く関数drawPolygon()
を定義してみましょう.
引数には,始点の座標x
とy
,頂点数vertex
を指定します.
また,多角形の1辺の長さは200とします.
def drawPolygon(x, y, vertex):
penup()
goto(x, y) # 始点の座標はx,y
pendown()
sum = 180 * (vertex - 2) # 内角の和
angle = sum / vertex # 頂点の角度
for i in range(vertex):
forward(200)
right(180 - angle)
drawPolygon(-100, 100, 4)
drawPolygon(-100, 173, 6)
課題
図を参考に円に内接する任意の正多角形を描く関数drawInscribedPolygon
を定義してください(外側の円は描画しなくてもよい).このとき,頂点数vertex
を関数の引数として設定してください.また,頂点数を増やすと,どんな図形になるか確認しましょう.
- キーボードから頂点数を入力(関数に引数として渡す)
- 円の半径は300ピクセル(円の中心は
(0,0)
) - X座標は余弦
cos()
.Y座標は正弦sin()
で求める - タートルの移動には
goto()
を利用する
# 余弦と正弦の算出方法
print(np.cos(np.radians(45))) # 余弦 -> 0.7
print(np.sin(np.radians(45))) # 正弦 -> 0.7
print(np.cos(np.radians(90))) # 余弦 -> 0.0
print(np.sin(np.radians(90))) # 正弦 -> 1.0
課題を完成させたらスクリプトを保存し,「chapter5.py」を提出してください.