Python(応用編)演習問題

1日目

「1日目:関数について」演習問題

【問1】

可変長の数値の引数を受け取り、その合計を返す関数を作成してみましょう
関数は以下のような関数を作成します

def sum_number(*args):
   処理

【問2】

可変数の位置引数とキーワード引数の両方を受け取り、それらをすべて出力する関数を作成してみましょう
関数は以下のような関数を作成します

def print_all_arguments(*args, **kwargs):
   処理
実行結果(例)
位置引数:
1
2
3
キーワード引数:
name: Bob
age: 25
country: Canada

「1日目:関数について」解答例

【問1】

def sum_number(*args):
  s = 0
  for i in args:
    s += i
  return s

total=sum_number(1,2,3,4,5)
print(total)
tl = [1,2,3,4,5,6,7,8,9,10]
print(sum_number(*tl))
実行結果
15
55

【問2】

def print_all_arguments(*args, **kwargs):
  """
  可変数の位置引数とキーワード引数の両方を受け取り、それらをすべて出力する関数。
  """
  print("位置引数:")
  for arg in args:
    print(arg)
  print("キーワード引数:")
  for key, value in kwargs.items():
    print(f"{key}: {value}")

# 位置引数とキーワード引数の両方を渡して関数を呼び出します
print_all_arguments(1, 2, 3, name="Bob", age=25, country="Canada")

Python 応用編 1日目へ戻る

2日目

「2日目:Pythonでのクラスについて」演習問題

【問1】

Circleクラスを作成し円周、面積を計算するメソッドを実装し、(1)、(2)を作成してみましょう
Circleクラス:
 半径
 面積を計算するメソッド
 円周を計算するメソッド
 ※円周率は3.14とする
(1) Circleクラスからインスタンスを作成する
(2) 半径から円の面積、円周を計算し表示する

実行結果
半径を入力してください:4.5
円の面積:63.585
円周の長さ:28.26

「2日目:Pythonでのクラスについて」解答例

【問1】

class Circle:
  def __init__(self, radius):
    self.radius = radius
  def area(self):
    return 3.14 * self.radius ** 2
  def round(self):
    return 3.14 * self.radius * 2

radius = float(input("半径を入力してください:"))
c1 = Circle(radius)
print("円の面積:" + str(c1.area()))
print("円周の長さ:" + str(c1.round()))

Python 応用編 2日目へ戻る

「2日目:クラスの継承と派生」演習問題

【問1】

次の要件を満たすプログラムを作成してみましょう
Personクラス:
 名前(文字列)
 性別(文字):’m’→男性、’f’→女性を表す
 年齢(整数)
 表示するためのメソッド(Introduction)を用意:名前、性別、年齢を表示
Patientクラス:(Personクラスからの派生クラスとして作成する)
 身長(cm)
 体重(kg)
 表示するためのメソッド(Introduction)を用意:名前、性別、年齢、身長、体重を表示
 適正体重(BMI)より大きいか小さいかを表示するメソッドを作成する
 ※ 適正体重(BMI)=体重(kg) ÷ (身長(m)× 身長(m))
(1)Patientクラスからインスタンスを作成し指定した名前、性別、年齢、身長、体重を表示する
(2)適正体重(BMI)が25より大きければ「肥満です」、小さければ「肥満ではありません」と表示する

実行結果
私の名前はTaroです。
年齢は21です。
性別は男性です。
身長は175.5cmです。
体重は65.7kgです。
肥満ではありません。

「2日目:クラスの継承と派生」解答例

【問1】

class Person:
  def __init__(self,name,age,gender):
    self.name = name
    self.age = age
    self.gender = gender

  def getGender(self):
    if self.gender == 'm':
      return '男性'
    elif self.gender == 'f':
      return '女性'
    else:
      return 'その他'

  def introduction(self):
    print("私の名前は" + self.name + "です。")
    print("年齢は" + str(self.age) + "です。")
    print("性別は" + self.getGender() + "です。")

class Patient(Person):
  def __init__(self,name,age,gender,height,weight):
    super().__init__(name,age,gender)
    self.height = height
    self.weight = weight

  def introduction(self):
    super().introduction()
    print("身長は" + str(self.height) + "cmです。")
    print("体重は" + str(self.weight) + "kgです。")

  def isOverWeight(self):
    bmi = self.weight / (self.height / 100) ** 2
    if bmi >25:
      return True
    else:
      return False

p = Patient("Taro",21,'m',175.5,65.7)
p.introduction()
if p.isOverWeight() == True:
  print("肥満です。")
else:
  print("肥満ではありません。")

Python 応用編 2日目へ戻る

3日目

「3日目:例外を捉える」演習問題

【問1】

次のプログラムを実行すると下のような出力結果が得られます
このプログラムをtry-except文を使い書き換えてみましょう

   def add(x, y):
    return x + y

   mylist = [1,2,3,4,5]
   s1 = add(mylist[0],mylist[5])
   s2 = add(mylist[0],mylist[4])
   print(s1)
   print(s2)

【問2】

標準入力から任意の整数を入力し9が入力されたら終了するプログラムをtry-exceptを使用して作成してください

実行結果
任意の整数を入力してください(9:終了):1
1
任意の整数を入力してください(9:終了):d
整数を入力してくださいinvalid literal for int() with base 10: 'd'
任意の整数を入力してください(9:終了):6
6
任意の整数を入力してください(9:終了):9
終了します

「3日目:例外を捉える」解答例

【問1】

def add(x, y):
    return x + y

mylist = [1,2,3,4,5]

try:
    s1 = add(mylist[0],mylist[5])
    s2 = add(mylist[0],mylist[4])
    print(s1)
    print(s2)
except Exception as e:
    print("エラーが発生しました: " + str(e))
実行結果
エラーが発生しました: list index out of range

【問2】

while True:
  try:
    x = int(input("任意の整数を入力してください(9:終了):"))
    if x == 9:
      print("終了します")
      break

    print(x)
  except ValueError as e:
    print("整数を入力してください"+str(e))

Python 応用編 3日目へ戻る

4日目

「4日目:テキストファイルの読み書き」演習問題

【問1】

リストに含まれる文字列を1行ずつファイルに出力してみましょう
リストは次の通り定義します
s1 = [“Tokyo”,”Osaka”,”Nagoya”]

出力結果(ファイルの中身のダンプ)
Tokyo
Osaka
Nagoya

【問2】

【問1】で出力したファイルから1行ずつよみこみ、リストを生成し表示してみましょう

実行結果
['Tokyo', 'Osaka', 'Nagoya']

「4日目:テキストファイルの読み書き」解答例

【問1】

s1 = ["Tokyo","Osaka","Nagoya"]
with open("./test2.txt","w",encoding="utf-8") as fo:
  for s in s1:
    fo.write(s+"\n")

【問2】

l = []
with open("./test2.txt","r",encoding="utf-8") as fo:
  for line in fo:
    l.append(line.strip())
print(l)

Python 応用編 4日目へ戻る

「4日目:CSVファイルの読み書き」演習問題

【問1】

以下のような出力ファイルになるようにCSVファイルへ出力してみましょう

実行結果(出力ファイルのダンプ)
coffee,350,2
tea,300,4
water,0,5
milk,200,1
juice,150,2

【問2】

【問1】で作成したファイルを読み込み、各行をリストに追加し、作成できたリストを出力するプログラムを作成してみましょう

実行結果
  [['coffee', '350', '2'], ['tea', '300', '4'], ['water', '0', '5'], ['milk', '200', '1'], ['juice', '150', '2']]

「4日目:CSVファイルの読み書き」解答例

【問1】

import csv

header = ["menu","単価","数量"]
menulist = [
       ("coffee",350,2),
       ("tea",300,4),
       ("water",0,5),
       ("milk",200,1),
       ("juice",150,2),
]
with open("./test4.csv","w",encoding="utf-8",newline='') as fo:
       csvwriter = csv.writer(fo)
       csvwriter.writerows(menulist)

【問2】

import csv

l = []
with open("./test4.csv","r",encoding="utf-8",newline='') as fo:
  csvreader = csv.reader(fo)
  for row in csvreader :
    l.append(row)

print(l)

Python 応用編 4日目へ戻る

「4日目:JSONファイルの読み書き」演習問題

【問1】

menu、価格、数量をキーに持つ辞書をまとめリストに格納した上で、menulist.jsonというJSONファイルを出力してみましょう

出力結果
[
  {
    "menu": "coffee",
    "単価": 350,
    "数量": 2
  },
  {
    "menu": "tea",
    "単価": 300,
    "数量": 4
  },
  {
    "menu": "water",
    "単価": 0,
    "数量": 5
  },
  {
    "menu": "milk",
    "単価": 200,
    "数量": 1
  },
  {
    "menu": "juice",
    "単価": 150,
    "数量": 2
  }
]

【問2】

【問1】で作成したmenulist.jsonファイルを読み込み、以下のように出力してみましょう

実行結果
coffee:単価350円
販売数量:2 小計:700円
***************
tea:単価300円
販売数量:4 小計:1200円
***************
water:単価0円
販売数量:5 小計:0円
***************
milk:単価200円
販売数量:1 小計:200円
***************
juice:単価150円
販売数量:2 小計:300円
***************

「4日目:JSONファイルの読み書き」解答例

【問1】

import json

menulist = [
    {"menu":"coffee","単価":350,"数量":2},
    {"menu":"tea","単価":300,"数量":4},
    {"menu":"water","単価":0,"数量":5},
    {"menu":"milk","単価":200,"数量":1},
    {"menu":"juice","単価":150,"数量":2}
]
with open("./menulist.json","w",encoding="utf-8") as fo:
    json.dump(menulist,fo,ensure_ascii=False,indent=2)

【問2】

import json

l = []
with open("./menulist.json","r",encoding="utf-8") as fo:
    l = json.load(fo)
    for item in l:
        print(item['menu']+":"+"単価" + str(item['単価']) + "")
        print("販売数量:"+ str(item['数量']),end=" ")
        print("小計:"+str(item['単価']*item['数量'])+"")
        print("***"*5)

Python 応用編 4日目へ戻る

5日目

「5日目:Numpy配列」演習問題

以下の手順に従って、演習を行いましょう

【問1】

以下のデータを持つCSVファイルを作成し、ファイルを読み込み、Numpyの配列を生成してみましょう
※ある教室での、国語、算数、社会の得点を表すデータ

国語,算数,社会
46,49,57
33,29,76
15,11,52
17,38,39
40,74,63
71,90,98
84,74,100
66,77,100
72,30,54
33,35,46
82,90,12
62,6,87
14,76,51
69,16,89
95,68,1
37,14,71
3,98,11
96,97,94
45,23,38
52,44,65
88,68,22
実行結果
[[ 46.  49.  57.]
 [ 33.  29.  76.]
 [ 15.  11.  52.]
 [ 17.  38.  39.]
 [ 40.  74.  63.]
 [ 71.  90.  98.]
 [ 84.  74. 100.]
 [ 66.  77. 100.]
 [ 72.  30.  54.]
 [ 33.  35.  46.]
 [ 82.  90.  12.]
 [ 62.   6.  87.]
 [ 14.  76.  51.]
 [ 69.  16.  89.]
 [ 95.  68.   1.]
 [ 37.  14.  71.]
 [  3.  98.  11.]
 [ 96.  97.  94.]
 [ 45.  23.  38.]
 [ 52.  44.  65.]
 [ 88.  68.  22.]]
   <class 'numpy.ndarray'>

【問2】

【問1】で取得した配列から、shape,ndim,dtype,sizeを取得し表示してみましょう

実行結果
(21, 3)
float64
2
63

【問3】

【問1】で取得したNumpyの配列の特定の要素を取得してみましょう
・国語の列の値を取得する
・算数列の値が60以上の行を取得する

実行結果
[46. 33. 15. 17. 40. 71. 84. 66. 72. 33. 82. 62. 14. 69. 95. 37.  3. 96.45. 52. 88.]
[[ 40.  74.  63.]
 [ 71.  90.  98.]
 [ 84.  74. 100.]
 [ 66.  77. 100.]
 [ 82.  90.  12.]
 [ 14.  76.  51.]
 [ 95.  68.   1.]
 [  3.  98.  11.]
 [ 96.  97.  94.]
 [ 88.  68.  22.]]

【問4】

【問1】で取得したNumpyの配列の統計量を求めてみましょう
・各項目の平均値、最小値、最大値を取得する(axis=0とする)

実行結果
[53.33333333 52.71428571 58.38095238]
[ 96.  98. 100.]
[3. 6. 1.]

「5日目:Numpy配列」解答例

【問1】

# CSVファイルの生成
import csv

l = [
    (46,49,57),
    (33,29,76),
    (15,11,52),
    (17,38,39),
    (40,74,63),
    (71,90,98),
    (84,74,100),
    (66,77,100),
    (72,30,54),
    (33,35,46),
    (82,90,12),
    (62,6,87),
    (14,76,51),
    (69,16,89),
    (95,68,1),
    (37,14,71),
    (3,98,11),
    (96,97,94),
    (45,23,38),
    (52,44,65),
    (88,68,22),
]

with open("kadai.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["国語","算数","社会"])
    writer.writerows(l)

import numpy as np

data = np.loadtxt('./kadai.csv', delimiter=',',skiprows=1)
print(data)

【問2】

print(type(data))
print(data.shape)
print(data.dtype)
print(data.ndim)
print(data.size)

【問3】

print(data[:,0])
print(data[ data[:,1]>60])

【問4】

mean = np.mean(data,axis=0)
print(mean)
max = np.max(data,axis=0)
print(max)
min = np.min(data,axis=0)
print(min)

Python 応用編 5日目へ戻る

6日目

「6日目:DataFrameについて」演習問題

以下の手順に従って、演習を行いましょう
・導入
次のプログラムを実行しkadai7.csvというファイルを作成します
データは地域(area)、性別(gender)、年齢(age)、身長(height)、体重(weight)を持っているデータです

   import pandas as pd
   import numpy as np

   area_list = ["北海道", "東北", "関東", "中部", "近畿", "中国", "四国", "九州・沖縄"]
   gender_list = ["", ""]

   df = pd.DataFrame({'area': np.random.choice(area_list, 30),
                   'gender': np.random.choice(gender_list, 30),
                   'age': np.random.randint(18,80,30),
                   'height': np.random.randint(150,200,30),
                   'weight': np.random.randint(40,100,30)
                   })

   df.head()
   df.to_csv('kadai7.csv')

【問1】

導入で作成したkadai7.csvを読み込み、先頭から5行分表示してみましょう

【問2】

導入で作成したkadai7.csvを読み込み、年齢(age)の最大値と最小値を取得してみましょう

【問3】

導入で作成したkadai7.csvを読み込み、体重(weight)が一番多いインデックスと地域名を取得してみましょう

【問4】

導入で作成したkadai7.csvを読み込み、身長(height)の平均値を計算してみましょう

「6日目:DataFrameについて」解答例

・導入
kadai7.csv

【問1】

import pandas as pd
df = pd.read_csv("kadai7.csv",encoding="utf-8")
df.head(5)

【問2】

print(df['age'].min())
print(df['age'].max())

【問3】

index = df['weight'].idxmax()
print(index)
print(df.loc[index,'area'])

【問4】

print(df['height'].mean())

Python 応用編 6日目へ戻る

7日目

「7日目:棒グラフを表示」演習問題

【問1】

枠線の色や棒の太さ、棒の位置、横軸のラベルなどの引数を渡して、それぞれ変更してみましょう

「7日目:円グラフを表示」演習問題

【問1】

その他の引数も渡して、それぞれ変更してみましょう

「7日目:凡例の表示」演習問題

以下の手順に従って、演習を行いましょう

【問1】

Python 応用編 6回目の演習問題で生成したkadai7.csvを読み込みます
生成方法はPython 応用編 6日目の演習問題を参照してください

【問2】

areaごとのageの平均値を計算し、ageの円グラフで表示してみましょう

【問3】

areaごとの身長の平均値を計算し、棒グラフで表示してみましょう

「7日目:凡例の表示」解答例

【問1】

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib

df = pd.read_csv("kadai7.csv")
group_list = df.groupby('area')
# height, weight, ageの平均を計算
mean_values = group_list[['height', 'weight', 'age']].mean()
print(mean_values)
print(mean_values.index)
print(mean_values.columns)
実行結果
           height     weight        age
area                                   
中国     176.000000  93.000000  68.666667
中部     166.000000  58.500000  39.250000
九州・沖縄  193.000000  62.000000  65.000000
北海道    183.666667  78.166667  47.666667
四国     167.250000  67.500000  36.250000
東北     170.000000  60.800000  49.600000
近畿     186.000000  69.666667  60.333333
関東     174.250000  77.000000  28.000000
Index(['中国', '中部', '九州・沖縄', '北海道', '四国', '東北', '近畿', '関東'], dtype='object', name='area')
Index(['height', 'weight', 'age'], dtype='object')

【問2】

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib

df = pd.read_csv("kadai7.csv")
group_list = df.groupby('area')
# height, weight, ageの平均を計算
mean_values = group_list[['height', 'weight', 'age']].mean()

age_list = mean_values['age']
print(age_list)
plt.pie(age_list,labels=mean_values.index,autopct='%.1f%%')
plt.title('地域別平均年齢比')
plt.show()

【問3】

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib

df = pd.read_csv("kadai7.csv")
group_list = df.groupby('area')
# height, weight, ageの平均を計算
mean_values = group_list[['height', 'weight', 'age']].mean()

height_list = mean_values['height']
print(height_list)
plt.bar(height_list.index,height_list)
plt.title('地域別平均身長')
plt.show()

Python 応用編 7日目へ戻る

コメント

この記事へのコメントはありません。

関連記事

C言語 応用編 ~5日目~

Python 補足②

Python 基本編 3日目

PAGE TOP