Turtleグラフィックス④ データ型と関数

Image from Gyazo

データ型と関数

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)

Image from Gyazo

関数

関数には,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()を定義してみましょう. 引数には,始点の座標xy,頂点数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)

Image from Gyazo

drawPolygon(-100, 173, 6)

Image from Gyazo

課題

図を参考に円に内接する任意の正多角形を描く関数drawInscribedPolygonを定義してください(外側の円は描画しなくてもよい).このとき,頂点数vertexを関数の引数として設定してください.また,頂点数を増やすと,どんな図形になるか確認しましょう.

# 余弦と正弦の算出方法
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

Image from Gyazo

課題を完成させたらスクリプトを保存し,「chapter5.py」を提出してください.

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.