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」を提出してください.




