これはあくまで一つの例であり、他にも色々な書き方があり得る。が、一方で、基本に沿った標準的な書き方を理解することも重要。
人のプログラムを読んで、よいと思う部分はどんどん真似しましょう。
あるクラスには、6名の学生が在籍している。架空の在籍番号と学生氏名の辞書を作り、このクラスのある在籍番号を与えて対応する学生氏名を取り出すプログラムを作成し、その動作を確認せよ。
mydict = {1: '菅原孝支', 2: '孤爪研磨', 3: '烏養繋心', 4: '木兎光太郎', 5: '青根高伸', 6: '月島蛍'}
mydict[3]
'烏養繋心'
# おまけ(全部書き出す場合)
for u in range(1, len(mydict) + 1):
print(mydict[u])
菅原孝支 孤爪研磨 烏養繋心 木兎光太郎 青根高伸 月島蛍
引数を3つ与え、それらの和と積を返す関数を作成し、その関数を呼び出して動作を確認せよ。
def myfunc(a, b, c):
return a+b+c, a*b*c
wa, seki = myfunc(4, 5, 6)
print('和は', wa, 'です。')
print('積は', seki, 'です。')
和は 15 です。 積は 120 です。
for文またはwhile文を使って、1からinput文で与えた整数値までの、「全整数の和」を計算するプログラムを作成せよ。与えた整数値は和に含むこと。
# for を用いる場合
a = input('半角整数を入力する')
wa = 0
for k in range(1, int(a) + 1):
wa += k # wa = wa + k に同じ
print(wa)
半角整数を入力する10 55
# while を用いる場合
p = 0
wa = 0
while p < int(a):
p += 1 # p = p + 1 に同じ
wa += p # wa = wa + p に同じ
print(wa)
55
3と同様に、1からinput文で与えた整数値までの、「全偶数の和」を計算するプログラムを作成せよ。与えた整数値は和に含むこと。
# for を用いる場合
a = input('半角整数を入力する')
wa = 0
for k in range(1, int(a) + 1):
if k % 2 == 0:
wa += k # wa = wa + k に同じ
print(wa)
半角整数を入力する20 110
# 別解(range() の増分を指定)
wa = 0
for k in range(0, int(a) + 1, 2):
wa += k # wa = wa + k に同じ
print(wa)
110
Input文の入力が半角の10進数字のみで構成されているかを判定する関数を定義し、入力が不適切なら再入力を求める場合
キーワード:正規表現、関数
import re # 正規表現用ライブラリ
def isnum(s):
if re.fullmatch('[0-9]+', s): # 正規表現による判定
return True
else:
return False
# 実際の判定
while True:
print("1から正の整数nまでの「全整数の和」を求める")
total = 0
n = input("整数nは : ")
if isnum(n): # 関数の呼び出し
for i in range(1, int(n) + 1):
total += i
print(total,"です")
break
else:
print("***不正な入力です***")
1から正の整数nまでの「全整数の和」を求める 整数nは : 10 ***不正な入力です*** 1から正の整数nまでの「全整数の和」を求める 整数nは : p ***不正な入力です*** 1から正の整数nまでの「全整数の和」を求める 整数nは : -5 ***不正な入力です*** 1から正の整数nまでの「全整数の和」を求める 整数nは : 10 55 です
for文はwhile文は使わないので本問の趣旨とは外れるが、同じ動作をする簡便な書き方:内包表記
# 課題3
# for を用いる場合(pythonのリストを使用)
a = input('半角整数を入力する')
sum([k for k in range(1, int(a) + 1)])
半角整数を入力する10
55
# 課題4
# for を用いる場合(numpy arrayを使用)
import numpy as np
a = input('半角整数を入力する')
np.array([k for k in range(1, int(a) + 1) if k % 2 == 0]).sum()
半角整数を入力する20
110
架空の在籍番号のリストと学生氏名のリストを別々に作成し(もちろん要素数は一致)、その2つのリストから必答問題1で用いる辞書を作成せよ。(ヒント:zip なる機能を用いるとスマートに書けるかも)
number = range(1,7)
members = ['菅原孝支', '孤爪研磨', '烏養繋心', '木兎光太郎', '青根高伸', '月島蛍']
zipped = dict(zip(number, members))
print(zipped)
{1: '菅原孝支', 2: '孤爪研磨', 3: '烏養繋心', 4: '木兎光太郎', 5: '青根高伸', 6: '月島蛍'}
あるオリジナルデータをとある時間間隔で取得したが、時間間隔を細かく取りすぎたため間引きたい。 2個おき、3個おき・・・など、自身で指定する任意の間隔で間引いたデータを得るプログラムを作成せよ。なお、オリジナルのデータはこちらを使って生成せよ。(乱数なので実行ごとに値は変わる)(ヒント:enumerate なる機能を用いるとスマートに書けるかも)
from numpy.random import randint
original_data = randint(0, 101, 1000).tolist() # 0〜100 の整数を1000個生成
print(original_data)
[80, 34, 97, 31, 36, 64, 90, 64, 40, 46, 97, 62, 77, 60, 67, 99, 0, 42, 48, 1, 19, 43, 89, 49, 9, 35, 94, 50, 15, 17, 67, 100, 70, 54, 22, 10, 78, 70, 10, 78, 4, 84, 57, 48, 16, 7, 18, 20, 41, 5, 21, 65, 32, 62, 36, 28, 0, 12, 72, 47, 94, 35, 12, 4, 19, 32, 62, 43, 59, 27, 94, 71, 79, 58, 34, 45, 49, 3, 60, 17, 23, 17, 38, 62, 10, 4, 71, 52, 93, 32, 12, 80, 64, 12, 18, 29, 72, 0, 58, 42, 7, 11, 39, 64, 95, 8, 1, 96, 22, 89, 47, 69, 39, 54, 11, 8, 81, 94, 23, 32, 28, 27, 86, 30, 94, 24, 63, 50, 9, 78, 88, 60, 55, 50, 31, 31, 42, 76, 14, 67, 89, 75, 27, 22, 91, 56, 67, 36, 7, 93, 76, 70, 0, 74, 83, 65, 40, 94, 34, 46, 12, 18, 92, 53, 85, 4, 36, 32, 98, 57, 61, 82, 76, 65, 52, 51, 79, 90, 56, 69, 14, 79, 96, 97, 49, 87, 7, 21, 43, 49, 82, 80, 93, 24, 58, 75, 93, 68, 95, 94, 7, 54, 82, 28, 97, 83, 63, 90, 10, 60, 53, 12, 54, 34, 76, 40, 37, 91, 4, 5, 12, 37, 23, 44, 67, 36, 78, 46, 2, 44, 32, 43, 100, 6, 74, 30, 23, 17, 59, 79, 14, 27, 75, 94, 51, 51, 6, 8, 0, 66, 82, 82, 28, 83, 79, 9, 52, 73, 94, 38, 74, 10, 46, 61, 19, 66, 64, 8, 32, 56, 41, 54, 77, 96, 16, 10, 13, 48, 72, 3, 82, 17, 93, 86, 28, 69, 92, 25, 67, 69, 59, 6, 94, 25, 29, 7, 54, 45, 93, 23, 12, 52, 81, 85, 63, 1, 73, 48, 42, 53, 65, 31, 90, 83, 67, 36, 75, 94, 19, 40, 76, 86, 72, 92, 1, 73, 11, 82, 74, 46, 72, 81, 5, 11, 51, 73, 32, 18, 75, 85, 25, 62, 37, 85, 86, 59, 85, 34, 5, 66, 100, 85, 79, 77, 83, 17, 81, 28, 13, 24, 81, 52, 75, 27, 30, 72, 51, 39, 7, 34, 32, 77, 41, 2, 16, 32, 98, 93, 76, 26, 40, 1, 94, 87, 3, 92, 57, 7, 75, 66, 63, 34, 86, 60, 55, 56, 3, 26, 65, 27, 38, 30, 71, 41, 19, 14, 10, 32, 82, 98, 85, 27, 30, 59, 16, 87, 66, 18, 86, 78, 47, 87, 92, 81, 74, 73, 54, 9, 94, 7, 41, 66, 79, 44, 8, 50, 19, 51, 88, 83, 76, 20, 55, 63, 67, 69, 22, 39, 60, 9, 48, 32, 53, 39, 58, 51, 60, 44, 72, 67, 79, 63, 21, 39, 94, 46, 87, 23, 26, 37, 25, 89, 6, 33, 77, 67, 60, 89, 75, 9, 52, 81, 95, 15, 93, 97, 98, 72, 15, 83, 67, 7, 45, 19, 7, 38, 13, 48, 25, 2, 34, 63, 70, 74, 50, 60, 78, 94, 14, 52, 28, 41, 13, 27, 99, 41, 70, 71, 7, 61, 87, 94, 25, 57, 53, 62, 32, 69, 75, 0, 78, 36, 10, 0, 25, 86, 11, 31, 55, 70, 56, 16, 58, 89, 100, 65, 48, 62, 24, 68, 71, 13, 68, 54, 58, 12, 22, 6, 87, 66, 90, 90, 45, 41, 43, 14, 39, 12, 72, 28, 26, 78, 0, 23, 49, 85, 70, 48, 33, 94, 86, 16, 100, 84, 65, 64, 64, 98, 43, 53, 46, 99, 13, 13, 31, 25, 98, 7, 3, 53, 98, 20, 0, 10, 16, 83, 23, 0, 75, 87, 26, 64, 19, 28, 7, 81, 5, 61, 31, 33, 71, 27, 60, 83, 43, 72, 36, 71, 14, 59, 11, 78, 41, 17, 53, 73, 61, 46, 85, 92, 37, 42, 56, 0, 9, 90, 50, 42, 8, 17, 50, 61, 0, 62, 17, 91, 69, 25, 2, 37, 15, 75, 35, 78, 99, 84, 4, 87, 9, 2, 23, 78, 83, 18, 64, 100, 95, 69, 21, 83, 34, 2, 80, 19, 93, 86, 16, 17, 49, 45, 55, 87, 66, 58, 96, 60, 89, 75, 46, 80, 26, 22, 84, 80, 95, 89, 17, 63, 29, 62, 20, 0, 18, 66, 13, 26, 66, 74, 7, 6, 89, 95, 14, 65, 71, 52, 64, 98, 25, 65, 93, 9, 53, 100, 28, 72, 64, 38, 44, 26, 79, 86, 23, 51, 23, 25, 48, 18, 75, 1, 28, 64, 68, 34, 29, 55, 53, 1, 1, 9, 6, 34, 73, 10, 43, 76, 25, 61, 85, 60, 83, 49, 69, 6, 6, 8, 72, 71, 9, 45, 99, 37, 61, 77, 2, 36, 48, 79, 21, 73, 19, 37, 33, 90, 26, 67, 10, 63, 77, 65, 18, 52, 78, 85, 3, 100, 39, 95, 48, 51, 39, 85, 61, 21, 74, 32, 97, 91, 5, 2, 13, 36, 66, 52, 63, 70, 38, 17, 29, 13, 33, 66, 14, 24, 47, 44, 65, 90, 56, 42, 0, 61, 57, 86, 28, 51, 60, 86, 80, 10, 39, 54, 70, 80, 26, 31, 33, 59, 59, 26, 75, 34, 59, 31, 21, 74, 70, 9, 98, 62, 17, 24, 44, 82, 34, 99, 20, 82, 12, 65, 76, 53, 44, 55, 76, 14, 94, 6, 16, 2, 82, 35, 46, 96, 61, 69, 89, 35, 71, 58, 22, 76, 62, 12, 99, 80, 30, 45, 39, 94, 93, 2, 45, 38, 51, 87, 31, 55, 91, 1, 63, 5, 23, 72, 5, 9, 83, 44, 88, 58, 99, 9, 21, 48, 0, 36, 1, 60, 53, 50, 93, 20, 29, 99, 68, 44, 12, 60, 90, 59, 91, 24, 60, 29, 53, 78, 6, 49, 35, 6, 27, 89, 53, 17, 4, 53, 8, 49, 69, 69, 68, 42, 10, 59, 34, 64, 100, 90, 49, 65, 18, 97, 44, 35, 20, 63, 60, 39, 94, 100, 54, 93, 93, 12, 82, 17, 97, 13, 47, 2]
多かった解答例
mabiki = 5 # 間引き間隔
mabiki_list = []
i = 0
for val in original_data:
if i % mabiki == 0:
mabiki_list.append(val)
i += 1 # i = i + 1 に同じ
print(mabiki_list)
[80, 64, 97, 99, 19, 35, 67, 10, 4, 7, 21, 28, 94, 32, 94, 45, 23, 4, 12, 29, 7, 8, 47, 8, 28, 24, 88, 31, 89, 56, 76, 65, 12, 4, 61, 51, 14, 87, 82, 75, 7, 83, 53, 40, 12, 36, 32, 30, 14, 51, 82, 9, 74, 66, 41, 10, 82, 69, 59, 7, 12, 1, 65, 36, 76, 73, 72, 73, 25, 59, 100, 17, 81, 72, 32, 32, 40, 92, 63, 56, 38, 14, 85, 87, 47, 73, 41, 50, 76, 69, 48, 51, 79, 46, 25, 67, 52, 97, 67, 38, 34, 60, 28, 41, 87, 62, 78, 86, 56, 65, 71, 12, 90, 14, 26, 85, 86, 64, 46, 25, 98, 83, 26, 81, 71, 72, 11, 73, 37, 90, 50, 91, 15, 84, 23, 100, 34, 86, 55, 60, 26, 89, 20, 26, 89, 52, 93, 72, 79, 25, 28, 55, 6, 76, 83, 8, 99, 36, 19, 67, 18, 100, 39, 32, 13, 70, 33, 44, 0, 51, 39, 31, 75, 74, 17, 99, 76, 14, 82, 69, 22, 80, 93, 87, 63, 9, 99, 36, 93, 44, 91, 78, 27, 53, 68, 64, 18, 63, 54, 17]
別解(enumerate を用いたプログラム例)
mabiki = 5
mabiki_list = []
for i, val in enumerate(original_data):
if i % mabiki == 0:
mabiki_list.append(val)
print(mabiki_list)
[80, 64, 97, 99, 19, 35, 67, 10, 4, 7, 21, 28, 94, 32, 94, 45, 23, 4, 12, 29, 7, 8, 47, 8, 28, 24, 88, 31, 89, 56, 76, 65, 12, 4, 61, 51, 14, 87, 82, 75, 7, 83, 53, 40, 12, 36, 32, 30, 14, 51, 82, 9, 74, 66, 41, 10, 82, 69, 59, 7, 12, 1, 65, 36, 76, 73, 72, 73, 25, 59, 100, 17, 81, 72, 32, 32, 40, 92, 63, 56, 38, 14, 85, 87, 47, 73, 41, 50, 76, 69, 48, 51, 79, 46, 25, 67, 52, 97, 67, 38, 34, 60, 28, 41, 87, 62, 78, 86, 56, 65, 71, 12, 90, 14, 26, 85, 86, 64, 46, 25, 98, 83, 26, 81, 71, 72, 11, 73, 37, 90, 50, 91, 15, 84, 23, 100, 34, 86, 55, 60, 26, 89, 20, 26, 89, 52, 93, 72, 79, 25, 28, 55, 6, 76, 83, 8, 99, 36, 19, 67, 18, 100, 39, 32, 13, 70, 33, 44, 0, 51, 39, 31, 75, 74, 17, 99, 76, 14, 82, 69, 22, 80, 93, 87, 63, 9, 99, 36, 93, 44, 91, 78, 27, 53, 68, 64, 18, 63, 54, 17]
別解(enumerate + 内包表記を用いたプログラム例:Pythonっぽいといわれる書き方)
print([val for i, val in enumerate(original_data) if i % mabiki == 0])
[80, 64, 97, 99, 19, 35, 67, 10, 4, 7, 21, 28, 94, 32, 94, 45, 23, 4, 12, 29, 7, 8, 47, 8, 28, 24, 88, 31, 89, 56, 76, 65, 12, 4, 61, 51, 14, 87, 82, 75, 7, 83, 53, 40, 12, 36, 32, 30, 14, 51, 82, 9, 74, 66, 41, 10, 82, 69, 59, 7, 12, 1, 65, 36, 76, 73, 72, 73, 25, 59, 100, 17, 81, 72, 32, 32, 40, 92, 63, 56, 38, 14, 85, 87, 47, 73, 41, 50, 76, 69, 48, 51, 79, 46, 25, 67, 52, 97, 67, 38, 34, 60, 28, 41, 87, 62, 78, 86, 56, 65, 71, 12, 90, 14, 26, 85, 86, 64, 46, 25, 98, 83, 26, 81, 71, 72, 11, 73, 37, 90, 50, 91, 15, 84, 23, 100, 34, 86, 55, 60, 26, 89, 20, 26, 89, 52, 93, 72, 79, 25, 28, 55, 6, 76, 83, 8, 99, 36, 19, 67, 18, 100, 39, 32, 13, 70, 33, 44, 0, 51, 39, 31, 75, 74, 17, 99, 76, 14, 82, 69, 22, 80, 93, 87, 63, 9, 99, 36, 93, 44, 91, 78, 27, 53, 68, 64, 18, 63, 54, 17]