ソースコード一覧

リスト1-01

price = 300
print(price)

リスト1-02

tax = price * 0.1
print(tax)

リスト2-01

print(12345)
print(12.345)
print(12+345j)

リスト2-02

print("123")
print("a")
print("")
print("こんにちは")
print("안녕하세요")

リスト2-03

print('それは"イチゴ"です')

リスト2-04

message = """こんにちは!
これは複数行に渡る
文字列です。"""
print(message)

リスト2-05

print(True)
print(False)

リスト2-06

print([10, 20, 30])
print([True, True, False])
print(["田中宏", 18, 68.2, 175.5])

リスト2-07

x = 1.5
y = x * 13
print(y)

リスト2-08

x = 3.2
y = x * 13
print(y)

リスト2-09

a = 10
print(a)

リスト2-10

a = 10
a = 20
print(a)

リスト2-11

a, b, c = 10, 20, 30
print(a, b, c)

リスト2-12

a = b = c = 0
print(a, b, c)

リスト3-01

name = input()
print(name)

リスト3-02

price = input()		# 300を入力します
tax = int(price) * 0.1
print(tax)

リスト3-03

price = int(input())     # 300を入力します
tax = price * 0.1
print(tax)

リスト3-04

price = int(input("価格>"))
print(price)

リスト3-05

print("こんにちは!")
print(42)

リスト3-06

name="太郎"
print(name)

リスト3-07

name, age, addr= "田中", 20, "東京"
print(name, age, addr)

リスト3-08

print("-" * 20)

リスト3-09

msg = input() 	# "こんにちは"を入力します
print(f"入力した文字列は{msg}です")

リスト3-10

var = int(input())   # 100を入力します
print(f"入力値+20 = {var + 20}")

リスト3-11

print("apple\nbanana\ncherry")

リスト3-12

print("apple\tbanana\tcherry")

リスト3-13

print("こんにちは")
print("田中さん")

リスト3-14

print("こんにちは", end="")
print("田中さん")

リスト3-15

print("こんにちは", end=" ")
print("田中さん")

リスト3-16

print(100, 120, 80, sep="\t")
print(90, 50, 130, sep="\t")

リスト3-17

n = 1234567
print(f"[{n:15,}]")    	# [      1,234,567]  15桁、デフォルト(数値は右寄せ)、コンマ区切り
print(f"[{n:<15,}]")   	# [1,234,567      ]  15桁、左寄せ、コンマ区切り
print(f"[{n:>15,}]")   	# [      1,234,567]  15桁、右寄せ、コンマ区切り
print(f"[{n:^15,}]")   	# [   1,234,567   ]  15桁、中央寄せ、コンマ区切り

リスト4-01

import math
print(math.log(10))
print(math.log(20))

リスト4-02

from tkxlib import dice
number = dice()
print(number)

リスト5-01

ans1 = 6 + 3 * 2         # 12
ans2 = (6 + 3) * 2       # 18
print(ans1, ans2)

リスト5-02

n = 10 / 3
print(n)

リスト5-04

mod = 10 % 3		# 1
print(mod)
mod = 15 % 4		# 3
print(mod)
mod = 20 % 2		# 0、 20は2の倍数
print(mod)

リスト5-05

n = 2 ** 3
print(n)

リスト5-06

n = 2 ** 0.5
print(n)

リスト5-07

var = 10
var = var + 1
print(var)

リスト5-09

var = 10
var += 1		# var = var + 1 と同じ
print(var)

リスト5-11

a, b = 10, 20
print(a == b)
print(a != b)

リスト5-12

a, b = 10, 20
print(a < b)
print(a > b)

リスト5-13

a, b = 10, 10
print(a <= b)
print(a >= b)

リスト5-14

x = 13
print(10 < x < 20)

リスト5-15

a, b = 6, [2,4,6,8]
print(a in b)
print(a not in b)

リスト5-16

a = 1024
b = 1024
print(id(a))
print(id(b))

リスト5-17

a = None
b = None
print(id(a))
print(id(b))

リスト5-18

a = None
print(a is None)

リスト5-19

x = 20
print(10 <= x < 100)   # 比較演算子だけで書ける

リスト5-20

color = "白"
print((color == "白") or (color == "黒"))

リスト5-21

color = "白"
print(not (color == "青"))

リスト5-22

drinking, smoking = 5, 0
print((drinking >= 2) and (smoking == 0))

リスト6-02

from tkxlib import dice

number = dice()
if number == 6:
    print("当たり")		# ifのコードブロック
else:
    print("はずれ")		# elseのコードブロック

リスト6-04

from tkxlib import dice
number = dice()

# 出目に応じて結果を表示する
if number == 6:
    print("当たり")
else:
    print("はずれ")

リスト6-06

from tkxlib import dice
number = dice()

if number == 1:
    print("出目は1")
elif number == 2:
    print("出目は2")
elif number == 3:
    print("出目は3")
else:
    print("出目は1、2、3ではない")

リスト6-07

from tkxlib import dice
number = dice()

# 出目に応じて表示内容を分岐する
if number == 1:
    print("出目は1")
elif number == 2:
    print("出目は2")
elif number == 3:
    print("出目は3")
else:
    print("出目は1、2、3ではない")

リスト6-11

height = float(input("身長(cm)> "))
weight = float(input("体重(kg)> "))

bmi = weight / ((height / 100) ** 2)
bmi = round(bmi, 1)

# BMIの値に応じて区分を表示する
if bmi >= 30:
    print("肥満:", bmi)
elif bmi >= 25:
    print("太りすぎ:", bmi)
elif bmi >= 18.5:
    print("健康:", bmi)
else:
    print("低体重:", bmi)

リスト6-13

x = int(input("整数> "))
if x < 0:
    x *= -1
print(x ** 0.5)

リスト6-15

from tkxlib import dice
number = dice()
message = "当たり" if number == 6 else "はずれ"
print(message)

リスト7-01

for num in [21, 35, 16]:
    print(num)

リスト7-03

numbers = [21, 35, 16]
for num in numbers:
    print(num)

リスト7-06

for i in range(3):
   print("Hello")

リスト7-08

"""
3回繰り返す
  │
  └─↻─for: i ← range(3)
      │
      └─ iと "Hello" をスペースで区切って表示する
"""

# 3回繰り返して番号とメッセージを表示する
for i in range(3):
    print(i, "Hello")

リスト7-10

# 得点のリストを用意する
scores = [85, 92, 45, 78, 55, 95]

# 各得点の合否を判定して表示する
for score in scores:
    if score >= 60:
        grade = "合格"
    else:
        grade = "不合格"

    print(f"{score}:{grade}")

リスト7-12

scores = [
    66, 95, 58, 72, 45, 80, 61, 75, 35, 88,
    64, 53, 70, 40, 78, 63, 82, 55, 67, 48,
    73, 68, 50, 62, 77, 74, 71, 60, 69, 65,
]

out = exe = pro = bas = ins = 0

# 得点を階級別に集計する
for score in scores:
    # 得点に応じて該当する階級の人数を増やす
    if score >= 90:
        out += 1
    elif score >= 80:
        exe += 1
    elif score >= 70:
        pro += 1
    elif score >= 60:
        bas += 1
    else:
        ins += 1

print(f"out: {out}")
print(f"exe: {exe}")
print(f"pro: {pro}")
print(f"bas: {bas}")
print(f"ins: {ins}")

リスト7-14

data = [42.7, 8.3, 91.5, 15.0, 3.9, 67.2, -24.8, 0.6, 59.1, 88.4]

# データを順番に処理して平方根を計算する
for x in data:
    # 負の値なら警告して処理を終了する
    if x < 0:
        print(f"負の値です: {x}")
        break

    square_root = round(x**0.5, 2)
    print(f"{x}:\t{square_root}")

print("=処理終了=")

リスト7-16

data = [42.7, 8.3, 91.5, 15.0, 3.9, 67.2, -24.8, 0.6, 59.1, 88.4]

# リストの各要素を順に処理する
for x in data:
    # 値が負の場合の処理を行う
     if x < 0:
		print(f"負の値です: {x}")
		continue

    square_root = round(x**0.5, 2)
    print(f"{x}:\t{square_root}")

print("=処理終了=")

リスト8-02

from tkxlib import get_int
total = 0

# 0が入力されるまで整数を受け取り、合計する
while True:
    value = get_int()
    if value == 0:
        break
    print(value)
    total += value

# 合計結果を表示する
print("-----")
print("合計:", total)

リスト8-04

from tkxlib import get_int
total = 0

# 入力された整数を合計する
while (value := get_int()) != 0:
	print(value)
	total += value

# 集計結果を表示する
print("-----")
print("合計:", total)

リスト9-01

names = ["Tom", "Mary", "John", "Alice"]
weights = [70.5, 55.0, 71.2, 50.1]
print(names)
print(weights)

リスト9-02

mix = ["Tom", 18, 70.5, 175.5]
print(mix)

リスト9-03

numbers = list(range(10))
print(numbers)

リスト9-04

ls1 = []
ls2 = list()	# コンストラクタ呼び出し

リスト9-05

data = [[65.5, 172.8],[50.8, 158.2],[75.7, 178.3]]
print(data)

リスト9-06

data = [{"weight":65.5, "height":172.8},{"weight":50.8, "height":158.2}]
print(data)

リスト9-07

#     [0]     [1]     [2]       [3]
names = ["Tom", "Mary", "John", "Alice"]
print(names[2])

リスト9-08

#      [-4]   [-3]     [-2]    [-1]
names = ["Tom", "Mary", "John", "Alice"]
print(names[-1])

リスト9-09

names = ["Tom", "Mary", "John", "Alice"]
names[1] = "Bob"
print(names)

リスト9-10

data = [ [65.5, 172.8],
          [50.8, 158.2],
          [75.7, 178.3] ]

print(data[0][0], data[0][1])
print(data[1][0], data[1][1])
print(data[2][0], data[2][1])

リスト9-11

names = ["Tom", "Mary", "John", "Alice"]
for name in names:
    print(name)

リスト9-12

data = [[65.5, 172.8], [50.8, 158.2], [75.7, 178.3]]

for person in data:
    print(person)

リスト9-13

data = [[65.5, 172.8], [50.8, 158.2], [75.7, 178.3]]

for person in data:
    print(person[0], person[1])

リスト9-14

data = [[65.5, 172.8], [50.8, 158.2], [75.7, 178.3]]

for weight, height in data:
    print(weight, height)

リスト9-15

a, b = (10, 20)							# タプル
c, d = {"name": "田中", "score": 90}		# 辞書
print(a, b)
print(c, d)

リスト9-16

s = "hello".upper()
print(s)

リスト9-17

b = (255).bit_length()
print(b)

リスト9-18

msg = "hello"
s = msg.upper()
print(s)

リスト9-19

number = 255
b = number.bit_length()
print(b)

リスト9-20

fruits = ["apple", "banana"]
fruits.append("orange")
print(fruits)

リスト9-21

numbers = [1, 2, 3]
numbers.extend([4, 5, 6])
print(numbers)

リスト9-22

a = [1, 2, 3]
b = [4, 5, 6]
c = a + b
print(c)

リスト9-23

colors = ["red", "blue"]
colors.insert(1, "green")
print(colors)

リスト9-24

animals = ["cat", "dog", "cat", "bird"]
animals.remove("cat")
print(animals)

リスト9-25

stack = [1, 2, 3, 4, 5]
elm = stack.pop()
print(elm, stack)

リスト9-26

stack = [1, 2, 3, 4, 5]
elm = stack.pop(2)
print(elm, stack)

リスト9-27

data = [1, 2, 3, 4, 5]
data.clear()
print(data)

リスト9-28

animals = ["dog", "cat", "rabbit", "cat", "bird"]
pos = animals.index("cat")
print(pos)

リスト9-29

animals = ["dog", "cat", "rabbit", "cat", "bird"]
count = animals.count("cat")
print(count)

リスト9-30

numbers = [8, 2, 5, 7, 6, 3, 4, 1]
numbers.sort()
print(numbers)

リスト9-31

names = ["Mary", "Tom", "Alice", "Jon"]
names.sort()
print(names)

リスト9-32

numbers = [8, 2, 5, 7, 6, 3, 4, 1]
numbers.sort(reverse=True)
print(numbers)

リスト9-33

names = ["Mary", "Tom", "Alice", "Jon"]
names.reverse()
print(names)

リスト9-34

original = [1, 2, 3]
copied = original.copy()
print(copied)

リスト9-35

csv = "山田太郎,65.5,172.8"
data = csv.split(",")
print(data)

リスト9-36

ls = ['山田太郎', '65.5', '172.8']
csv = ",".join(ls)
print(csv)

リスト9-38

scores = [55, 75, 58, 66, 81, 72, 95, 68, 71, 85]
max_score = max(scores)
min_score = min(scores)
mean_score = round(sum(scores) / len(scores), 1)

print(f"最大値={max_score}、最小値={min_score}、平均値={mean_score}")

リスト9-40

scores = [55, 75, 58, 66, 81, 72, 95, 68, 71, 85]
sorted_scores = sorted(scores)

print(sorted_scores)

リスト9-42

data = [
    "名前,体重(kg),身長(cm)",
    "山田太郎,65.5,172.8",
    "佐藤花子,50.8,158.2",
    "鈴木一郎,75.7,178.3",
    "== end of data ==",
]

rows = data[1:-1]

# rowsの要素を1つずつ順に処理する
for csv in rows:
    people = csv.split(",")
    print(people)

リスト10-01

numbers = [3, 2, 5]
new_numbers = [x * 2 for x in numbers]
print(new_numbers)

リスト10-03

numbers = [2, 7, 8, 5, 6]
new_numbers = [x * 2 for x in numbers if x % 2 == 0]
print(new_numbers)

リスト10-06

data = [[65.5, 172.8], [50.8, 158.20], [75.7, 178.3]]
bmi = [weight / (height / 100) ** 2 for weight, height in data]
print(bmi)

リスト10-07

animals = ["dog", "cat", "rabbit"]
for i, animal in enumerate(animals):
	print(i, animal)

リスト10-08

animals = ["dog", "cat", "rabbit"]
for i, animal in enumerate(animals, start=1):
	print(i, animal)

リスト10-10

names = ["田中","佐藤", "山田"]
heights = [175.3, 163.5, 182.1]
for name, height in zip(names, heights):
	print(name, height)

リスト10-12

names = ["田中", "佐藤", "山田"]
weights = [70.2, 55.0, 68.4]
heights = [175.3, 163.5, 182.1]

people = list(zip(names, weights, heights))

print(people)

リスト11-01

t1 = (1, 2, 3)
t2 = (1,)					# 要素が1つの時は末尾にコンマが必要です
t3 = ()						# 空のタプル
t4 = tuple([1, 2, 3])		# リストから生成

リスト11-02

t = (1, 2, 3, 4, 5)
print(t[1])
print(t[2:])

リスト11-03

t1 = (1, 2, 3) + (4, 5)		# 結合
t2 = (0,) * 3				# 繰り返し

print(t1)
print(t2)

リスト11-04

a, b, c = (1, 2, 3)
print(a, b, c)

a, *b = (1, 2, 3)		# *bは、拡張アンパック:残りの要素をリストにしてbに代入する
print(a, b)

リスト11-05

t = (10, 20, 30, 40, 50)
print(len(t))

リスト11-06

t = ("apple", "banana", "cherry", "banana", "date")
print(t.index("banana"))

リスト11-07

t = ("apple", "banana", "cherry", "banana", "date")
print(t.count("banana"))

リスト11-08

s1 = {1, 2, 3}
s2 = set()					# 空のセット。 {}は空の辞書になるので使いません。
s3 = set([1, 2, 3])			# リストから生成

リスト11-09

numbers = [5, 3, 2, 5, 1, 2]

set_numbers = set(numbers)		# セットを作って重複を削除する
print(set_numbers)

リスト11-10

s = {10, 20, 30, 40, 50}
print(len(s))

リスト11-11

a = {1, 2, 3}
b = {2, 3, 4}

print(a | b)  # 和
print(a & b)  # 積
print(a - b)  # 差
print(a ^ b)  # 対称差

リスト11-12

a = {1, 2, 3, 4, 5}
b = {2, 3, 4}

print(a >= b)  # aはbのスーパーセットか
print(a <= b)  # aはbのサブセットか

リスト11-13

fset = frozenset({4, 5, 6})

リスト11-14

s1 = {"apple", "banana", "orange", "grape", "kiwi"}
s1.add("peach")
print(s1)

リスト11-15

s1 = {"apple", "banana", "orange", "grape", "kiwi"}
s1.remove("orange")
print(s1)

リスト11-16

s1 = {"apple", "banana", "orange", "grape", "kiwi"}
s1.discard("watermelon")  # 存在しない要素をdiscardしてもエラーにならない
print(s1)

リスト11-17

s1 = {"apple", "banana", "orange", "grape", "kiwi"}
removed = s1.pop()
print(removed)
print(s1)

リスト11-18

s1 = {"apple", "banana", "orange", "grape", "kiwi"}
s1.clear()
print(s1)

リスト11-19

s1 = {"apple", "banana", "orange", "grape", "kiwi"}
s2 = s1.copy()
print(s2)

リスト11-20

# すべての型のオブジェクトを作成しておく
ls = list(range(1, 4))
tp = tuple([1, 2, 3])
st = set([1, 2, 3])
fs = frozenset({1, 2, 3})

# リストへの変換
ls = list(tp)
ls = list(st)
ls = list(fs)

# タプルへの変換
tp = tuple(ls)
tp = tuple(st)
tp = tuple(fs)

# セットへの変換
st = set(tp)
st = set(ls)
st = set(fs)

# frozensetへの変換
fs = frozenset(tp)
fs = frozenset(ls)
fs = frozenset(st)

リスト12-01

user = {"id": 1001, "name": "田中太郎", "mail": "tanaka@mail.jp"}

リスト12-02

user = {
	"id": 1001,
	"name": "田中太郎",
	"mail": "tanaka@mail.jp",
}

リスト12-03

# 2次元グリッドの例(ゲームのマップ)
grid = {
    (0, 0): "スタート",
    (1, 0): "壁",
    (1, 1): "落とし穴",
    (2, 2): "ゴール",
}

リスト12-04

user = {
    "id": 1001,
    "name": "田中太郎",
    "mail": "tanaka@mail.jp",
}
print(user["id"])
print(user["name"])
print(user["mail"])

リスト12-05

user = {
    "name": "田中太郎",
    "id": 1001,
    "mail": "tanaka@mail.jp",
}

# "mail"の値を変更する
user["mail"] = "tanaka@mail.com"
print(user)

リスト12-06

user = {
    "name": "田中太郎",
    "id": 1001,
    "mail": "tanaka@mail.jp",
}

# 新しい要素age:20を追加する
user["age"] = 20
print(user)

リスト12-07

user = {
    "name": "田中太郎",
    "id": 1001,
    "mail": "tanaka@mail.jp",
	"age": 20,
}
age = user.pop("age")
print(age)
print(user)

リスト12-08

user = {
    "name": "田中太郎",
    "id": 1001,
    "mail": "tanaka@mail.jp",
}
del user["mail"]
print(user)

リスト12-09

book = {"title": "坊ちゃん", "author": "夏目漱石", "stock": 10}
if "price" in book:
	print(book["price"])
else:
	print("キー'price'がない")

リスト12-10

book = {"title": "坊ちゃん", "author": "夏目漱石", "stock": 10}
print(book.get("price", "価格の情報はありません"))

リスト12-11

default_config =	{"debug": False, "port": 8080}
user_config    = 	{"debug": True, "output": "file"}

final_config = default_config | user_config
print(final_config)

リスト12-13

score = {"id": 1201, "English": 90, "Math": 85, "Language": 92}

# 辞書のキーと値を順番に表示する
for key in score:
    print(f"{key}:{score[key]}")

リスト12-14

score = {"id": 1201, "English": 90, "Math": 85, "Language": 92}

keys = score.keys()			# キーのビュー
values = score.values()		# 値のビュー
items = score.items()			# キーと値のビュー

print(keys)
print(values)
print(items)

リスト12-16

score = {"id": 1201, "English": 90, "Math": 85, "Language": 92}

# 辞書のキーと値を順に表示する
for key, value in score.items():
       print(f"{key}:{value}")

リスト12-17

users = [
    {"id": 103, "name": "tanaka", "role": "admin"},
    {"id": 105, "name": "sasaki", "role": "user"},
    {"id": 100, "name": "maeda", "role": "user"},
]

リスト12-19

users = [
       {"id": 103, "name": "tanaka", "role": "admin"},
       {"id": 105, "name": "sasaki", "role": "user"},
       {"id": 100, "name": "maeda", "role": "user"},
]

# ユーザー一覧からsasakiを検索して表示する
for user in users:
       if user["name"] == "sasaki":
              print(user["id"], user["name"], user["role"])
              break

リスト12-20

user_map = {
    "tanaka": {"id": 103, "role": "admin"},
    "sasaki": {"id": 105, "role": "user"},
    "maeda": {"id": 100, "role": "user"},
}

リスト12-22

users = [
       {"id": 103, "name": "tanaka", "role": "admin"},
       {"id": 105, "name": "sasaki", "role": "user"},
       {"id": 100, "name": "maeda", "role": "user"},
]

user_map = {}

# ユーザー一覧から名前をキーにした辞書を作成する
for user in users:
       user_id, name, role = user["id"], user["name"], user["role"]
       user_map[name] = {"id": user_id, "role": role}

user = user_map["sasaki"]
print("sasaki", user["id"], user["role"])

リスト12-24

numbers = [1, 2, 3]

# 数値をキー、2乗値を値にした辞書を作成する
square_map = {n: n ** 2 for n in numbers}

print(square_map)

リスト12-26

users = [
	{"id": 103, "name": "tanaka", "role": "admin"},
	{"id": 105, "name": "sasaki", "role": "user"},
	{"id": 100, "name": "maeda", "role": "user"},
]

# ユーザー一覧から検索用の辞書を作成する
user_map = {
	user["name"]: {"id": user["id"], "role": user["role"]}
	for user in users
}

user = user_map["sasaki"]
print("sasaki", user["id"], user["role"])

リスト12-27

func = lambda x: x**2 + 1
ans = func(3.0)
print(ans)

リスト12-29

users = [
	{"id": 103, "name": "tanaka", "role": "admin"},
	{"id": 105, "name": "sasaki", "role": "user"},
	{"id": 100, "name": "maeda", "role": "user"},
]

# ユーザーのリストをidの降順にソートする
users.sort(key=lambda user: user["id"], reverse=True)

for user in users:
    print(user)

リスト13-04

def print_message():
    """メッセージを表示する。"""
    print("こんにちは")

print_message()

リスト13-06

def print_message(name):
	print(f"こんにちは{name}さん")

print_message("太郎")

リスト13-08

def function(x):
      """式の値を計算して返す。"""
      return x**2 + x + 1

print(function(10))

リスト13-10

def score(math, science, english):
      """3科目の合計と平均を返す。"""
      total = math + science + english
      average = round(total / 3, 1)
       return total, average

total, average = score(80, 70, 60)
print(f"合計={total}、平均={average:.1f}")

リスト13-12

def calc_price(price, tax_rate=0.1):
    return int(price * (1 + tax_rate))

print(f"価格={calc_price(1000)}")
print(f"価格={calc_price(1000, 0.08)}")

リスト13-16

"""
BMI計算プログラム

体重(kg)と身長(cm)をキーボードから入力し、
BMIを計算してコンソールに表示する。
"""

from tkxlib import get_float

def calculate_bmi(weight_kg, height_cm):
    """
    体重と身長からBMIを計算する関数

    引数:
        weight_kg (float): 体重(kg)
        height_cm (float): 身長(cm)

    戻り値:
        float: 小数点以下1桁のBMI
    """
    # 身長をcmからmに変換
    height_m = height_cm / 100

    # BMIを計算
    bmi_value = weight_kg / (height_m * height_m)

    # 小数点以下1桁までに丸める
    return round(bmi_value, 1)

# 体重をキーボード入力
weight = get_float("体重(kg単位)> ")

# 身長をキーボード入力
height_cm = get_float("身長(cm単位)> ")

# BMIを計算
bmi_result = calculate_bmi(weight, height_cm)

# 結果をコンソール表示
print(f"体重:{weight}kg 身長:{height_cm}cm BMI:{bmi_result}")

リスト13-17

# インポートされる変数(定数)
APP_NAME = "MyApp"
MAX_COUNT = 100

# インポートされる関数
def greet(name):
    return f"こんにちは、{name}さん!"

# インポートされるクラス
class User:
    def __init__(self, name):
        self.name = name

リスト13-18

import math

print(math.pi)        	# 3.141592653589793
print(math.sqrt(16))  	# 4.0

リスト13-19

from math import pi, sqrt

print(pi)       		# 3.141592653589793
print(sqrt(16)) 		# 4.0

リスト13-20

import tkxlib as kb

bank = kb.get_str("銀行名 >")		# 文字列のキーボード入力
rate = kb.get_float("利率 >")		# 浮動小数点数のキーボード入力

リスト13-22

import bmi
print("bmiモジュールをインポートしました")

sample.py

import travel

print("travelモジュールをインポートしました")

リスト13-24

from tkxlib import get_float

def calculate_bmi(weight_kg, height_cm):
    height_m = height_cm / 100
    bmi_value = weight_kg / (height_m * height_m)
    return round(bmi_value, 1)

if __name__ == "__main__":
    weight = get_float("体重(kg単位)> ")
    height_cm = get_float("身長(cm単位)> ")
    bmi_result = calculate_bmi(weight, height_cm)
    print(f"体重:{weight}kg 身長:{height_cm}cm BMI:{bmi_result}")

リスト13-25

from tkxlib import get_float

def calculate_bmi(weight_kg, height_cm):
    height_m = height_cm / 100
    bmi_value = weight_kg / (height_m * height_m)
    return round(bmi_value, 1)

def main():
    weight = get_float("体重(kg単位)> ")
    height_cm = get_float("身長(cm単位)> ")
    bmi_result = calculate_bmi(weight, height_cm)
    print(f"体重:{weight}kg 身長:{height_cm}cm BMI:{bmi_result}")

if __name__ == "__main__":
	main()

リスト14-01

from pathlib import Path

cwd = Path.cwd()
print(cwd)

リスト14-02

from pathlib import Path

path = Path("sample.txt")

リスト14-03

from pathlib import Path

path = Path("sample.txt")
print(path)
print(path.absolute())

リスト14-04

from pathlib import Path

base_path = Path("c:/temp/data")
file_name = input("ファイル名: ")

path = base_path / file_name
print(path)

リスト14-05

from pathlib import Path

path = Path("C:/portable-python-vscode/workspace/chapter14/sample.txt")
print(path.name)
print(path.parent)

リスト14-06

from pathlib import Path

p = Path("C:/portable-python-vscode/workspace/chapter14/sample.txt")
print(p.exists())

p = Path("C:/portable-python-vscode/workspace/chapter14")
print(p.exists())

リスト14-07

from pathlib import Path

p = Path("C:/portable-python-vscode/workspace/chapter14/sample.txt")
print(p.is_file())
print(p.is_dir())

リスト14-08

from pathlib import Path

wkspc = Path("C:/portable-python-vscode/workspace")
for p in wkspc.rglob("*"):
    if p.is_file():
        print(p.name)

リスト15-01

# 一括入力して変数に入れる
from pathlib import Path
file_path = Path("sample.txt")

 data = file_path.read_text(encoding="utf-8")
print(data)

リスト15-02

# (\nを含む)1行ずつ読み出す
from pathlib import Path
file_path = Path("sample.txt")

with file_path.open("r", encoding="utf-8") as f:
    for line in f:
        print(line, end="")

リスト15-03

from pathlib import Path
file_path = Path("sample2.txt")

with file_path.open("w", encoding="utf-8") as f:
  f.write("1行目\n")
    num = 123
    f.write(f"2行目:{num}\n")
   f.write(str(num))

リスト15-04

from pathlib import Path
data = "1行目の出力データ\n2行目の出力データ\n3行目の出力データ\n"
file_path = Path("sample2.txt")

file_path.write_text(data, encoding="utf-8")

リスト15-06

from pathlib import Path
data = ["apple", "banana", "cherry"]

# リスト内包表記で、行末に改行コード(\n)を含むリストを作成する
new_data = [item + "\n" for item in data]

file_path = Path("list.txt")
# テキストファイルを開いてリストを一括出力する。
with file_path.open("w", encoding="utf-8") as f:
	f.writelines(new_data)

リスト15-07

from pathlib import Path
file_path = Path("no_exist.txt")

try:
    data = file_path.read_text(encoding="utf-8")
    print(data)
except FileNotFoundError as e:
    print(f"ファイルが見つかりません:\n{e}")

リスト15-08

from pathlib import Path
file_path = Path("sample.txt")

try:
    data = file_path.read_text(encoding="utf-8")
    print(data)
except (OSError, UnicodeDecodeError) as e:
    print(f"ファイル入力エラーです:\n{e}")

リスト15-09

from pathlib import Path
file_path = Path("output.txt")

data = "apple\nbanana\ncherry\n"
try:
    file_path.write_text(data, encoding="utf-8")
except (OSError, UnicodeEncodeError) as e:
    print(f"ファイル出力エラーです:\n{e}")

リスト15-11

    from tkxlib import get_float

    def sqrt(x):
        """平方根を計算します。"""
        # 負の値の平方根計算を防ぐ
      if x < 0:
            raise ValueError("負の平方根は計算できません")
        else:
            return x ** 0.5

    number = get_float()
    # 例外を補足して分かりやすく表示する
    try:
      result = sqrt(number)
        print(f"平方根={round(result, 1):.1f}")
    except ValueError as e:
        print("エラー\n", e)

リスト15-12

import csv
from pathlib import Path
file_path = Path("data.csv")

with file_path.open("r", encoding="utf-8", newline="") as f:
	reader = csv.reader(f)
	header = next(reader)		# readerから1行読み出す
	for row in reader:
     	print(row, "->", row[0], row[1], row[2])   # 要素をインデックスでアクセス

リスト15-13

import csv
from pathlib import Path
data = [
    ["名前","年齢","住所"],
    ["田中","30","東京"],
    ["佐藤","25","大阪"],
    ["鈴木","28","福岡"]
]
file_path = Path("data.csv")

with file_path.open("w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)

リスト15-14

import csv
from pathlib import Path
file_path = Path("data.csv")

with file_path.open("r", encoding="utf-8", newline="") as f:
 	dict_reader = csv.DictReader(f)
 	for row in dict_reader:
             # キーでアクセスする
		print(row, "->", row["名前"], row["年齢"], row["住所"])

リスト15-15

import csv
from pathlib import Path

dict_data = [
   	{"名前": "田中", "年齢": "30", "住所": "東京"},
   	{"名前": "佐藤", "年齢": "25", "住所": "大阪"},
   	{"名前": "鈴木", "年齢": "28", "住所": "福岡"}
]
file_path = Path("data.csv")

with file_path.open("w", encoding="utf-8", newline="") as f:
    dict_writer = csv.DictWriter(f, fieldnames=["名前", "年齢", "住所"])
    dict_writer.writeheader()  		# ヘッダー行を書き込む
    dict_writer.writerows(dict_data)	# データ行を書き込む

リスト16-02

from datetime import date

class Person:
    """個人を表すクラス。"""
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    def birth_year(self) -> int:
        today = date.today()
        return today.year - self.age

# 使い方の例 --------------------------------------
person1 = Person("田中", 15)
person2 = Person("鈴木", 25)

print(person1.name, person1.age, person1.birth_year())
print(person2.name, person2.age, person2.birth_year())

① 基本形

def add(a: str, b: int) -> str:
    return a + str(b)

③ リストはlist[型]

def total(numbers: list[int]) -> int:
    return sum(numbers)

⑥ デフォルト引数

def power(base: int, exponent: int = 2) -> int:
    return base ** exponent

リスト16-03

def func(var):
    var[0] = 10	# リストは要素の値を変更できるので、要素[0]の内容を変更します。

data = [1, 2, 3]
func(data)
print(data)

リスト16-04

data = 10
print(id(data))

data = 100
print(id(data))

リスト16-06

"""インスタンスの作成数をカウントする"""
class User:
    count = 0   # インスタンスの作成数

    def __init__(self, name) -> None:
        self.name = name
        User.count += 1     # インスタンスが作成されるたびにカウントを1増やす

# 使用例
print(User.count)	# クラスの変数なのでインスタンスがなくても使用できる

user1 = User("田中")
user2 = User("鈴木")
print(User.count)   # インスタンスの作成数

リスト16-08

    class Member:
       """個人を表すクラス。"""

       def __init__(self, uid: int, name: str, age: int) -> None:
           self.uid = uid
           self.name = name
           self.age = age

     def __str__(self) -> str:
           return f"Member(uid={self.uid}, name={self.name}, age={self.age})"

     def __repr__(self) -> str:
           return f"Member(uid={self.uid!r}, name={self.name!r}, age={self.age!r})"

     def __eq__(self, other: object) -> bool:
           if not isinstance(other, Member):
               return NotImplemented
           return self.uid == other.uid

     def __hash__(self) -> int:
           return hash(self.uid)

リスト16-10

    class Member:
       """個人を表すクラス。"""

       def __init__(self, uid: int, name: str, age: int) -> None:
           self.uid = uid
           self.name = name
           self.age = age

       def __str__(self) -> str:
           return f"Member(uid={self.uid}, name={self.name}, age={self.age})"

       def __repr__(self) -> str:
           return f"Member(uid={self.uid!r}, name={self.name!r}, age={self.age!r})"

       def __eq__(self, other: object) -> bool:
           # 同じMember型同士のみを比較する。
           if not isinstance(other, Member):
               return NotImplemented
           return self.uid == other.uid

       def __hash__(self) -> int:
           return hash(self.uid)

member1 = Member(100, "田中宏", 18)

print(member1)
print(repr(member1))

member2 = Member(200, "鈴木隆", 20)

# uidを基準に、2つのインスタンスが同一かを判定する。
if member2 == member1:
    print("同じインスタンスです")
else:
    print("同じインスタンスではありません")

リスト16-12

from dataclasses import dataclass

@dataclass(frozen=True)
class Person:
    """個人を表すクラス。"""
    name: str
    age: int

リスト17-03

class Member:
    """会員を表すクラス。"""

    FEE: int = 5000

    def __init__(self, uid: int, name: str) -> None:
        self.uid = uid
        self.name = name

    def membership_fee(self) -> int:
        """会費額を返します。"""
        return Member.FEE

class GeneralMember(Member):
    """一般会員を表すクラス。"""

    def __init__(self, uid: int, name: str, lesson_menu: list[str]) -> None:
        super().__init__(uid, name)	# スーパークラスのコンストラクタを実行
        self.lesson_menu = lesson_menu	# サブクラスのデータ属性を初期化する

リスト17-05

from members import GeneralMember

# サブクラスのインスタンスを作る
gm = GeneralMember(1001, "田中花子", ["ヨガ", "ピラティス"])

# スーパークラスのデータ属性とメソッドにアクセスする
print(f"会員番号={gm.uid}")
print(f"会員名={gm.name}")
print(f"会費額={gm.membership_fee()}")

# 自クラスのデータ属性にアクセスする
print(f"レッスンメニュー={gm.lesson_menu}")

リスト17-07

class SeniorMember(Member):
    """シニア会員を表すクラス。"""

    def membership_fee(self) -> int:
        """会費額を返す。"""
        return round(Member.FEE * 0.6)

リスト17-09

from members import SeniorMember

# Memberクラスのコンストラクタが使われます
senior_member = SeniorMember(2001, "佐藤一郎")

# スーパークラスのデータ属性とメソッドを使用する
print(senior_member.uid)
print(senior_member.name)
print(senior_member.membership_fee())

リスト17-10

class Phone:
    pass
class Computer:
    pass
 class SmartPhone(Phone, Computer):
    pass

リスト17-12

import json
class JsonMixin:
    def to_json(self):
        return json.dumps(self.__dict__, ensure_ascii=False)

リスト17-14

  from jsonmix import JsonMixin
  class GeneralMember(JsonMixin, Member):
    -- 省略 --

リスト17-16

from members import GeneralMember

gm = GeneralMember(1001, "田中花子", ["ヨガ", "ピラティス"])
print(gm.to_json())

リスト17-18

    from members import GeneralMember, SeniorMember

    members = [
        GeneralMember(1001, "田中花子", ["ヨガ", "ピラティス"]),
        SeniorMember(2001, "佐藤一郎"),
        SeniorMember(2002, "伊藤京子"),
        GeneralMember(1003, "高橋健太", ["水泳", "筋力トレーニング"]),
        GeneralMember(1002, "鈴木美咲", ["ダンス", "エアロビクス"]),
        SeniorMember(2003, "山本次郎"),
    ]

    # 同名メソッドを持つ会員オブジェクトを順番に処理する
    for member in members:
      print(f"{member.name}の会費={member.membership_fee()}円")

リスト17-20

class Taro:
    def talk(self):
        print("こんにちは、太郎です")

class Hanako:
    def talk(self):
        print("こんにちは、花子です")

class Jiro:
    def talk(self):
        print("こんにちは、次郎です")

# 使用例 ---------------------
person_list = [Taro(), Hanako(), Jiro()]

# リストの各インスタンスに同じメソッド名で順番に処理を行う
for person in person_list:
    person.talk()

リスト18-03

"""CSVファイルからBMIを計算して表示する。"""

import csv
from pathlib import Path

class Person:
    """1人分の測定データを表すクラス。"""

    def __init__(self, name: str, weight_kg: float, height_cm: float) -> None:
        """名前、体重、身長を受け取って初期化する。"""
        # オブジェクト生成時に値の妥当性を確認する。
        if name == "":
            raise ValueError("名前は空文字にできません")
        if weight_kg <= 0:
            raise ValueError("体重は正の数である必要があります")
        if height_cm <= 0:
            raise ValueError("身長は正の数である必要があります")

        self.name = name
        self.weight_kg = weight_kg
        self.height_cm = height_cm

    @classmethod
    def from_csv_row(cls, row_data: list[str]) -> "Person | None":
        """CSVの1行データを検証し、有効なら Person を返す。"""
        # 項目数が正しいか確認する。
        if len(row_data) != 3:
            return None

        name = row_data[0].strip()
        weight_text = row_data[1].strip()
        height_text = row_data[2].strip()

        # 空文字の項目がないか確認する。
        if (name == "") or (weight_text == "") or (height_text == ""):
            return None

        try:
            weight_kg = float(weight_text)
            height_cm = float(height_text)
        except ValueError:
            return None

        # 体重と身長が正の数か確認する。
        if (weight_kg <= 0) or (height_cm <= 0):
            return None

        # インスタンスを生成して返す。
        try:
            return cls(name, weight_kg, height_cm)
        except ValueError:
            return None

    def calculate_bmi(self) -> float:
        """BMIを計算し、小数点以下1桁に丸めて返す。"""
        height_m = self.height_cm / 100
        bmi_value = self.weight_kg / (height_m * height_m)
        return round(bmi_value, 1)

    def get_display_text(self) -> str:
        """表示用の文字列を返す。"""
        bmi_value = self.calculate_bmi()
        return (
            f"名前:{self.name} 体重:{self.weight_kg}kg "
            f"身長:{self.height_cm}cm BMI:{bmi_value}"
        )

def read_person_csv(file_path) -> list[list[str]]:
    """person.csv を読み込み、ヘッダーを除くデータ行を返す。"""
    try:
        with open(file_path, "r", newline="", encoding="utf-8") as file:
            reader = csv.reader(file)
            next(reader, None)
            return list(reader)
    except (OSError, UnicodeDecodeError, csv.Error) as error:
        print(f"ファイルの読み込みに失敗しました: {error}")
        return []

def main():
    """CSVを読み込み、BMIを計算して表示する。"""
    file_path = Path("person.csv")
    data_rows = read_person_csv(file_path)

    # 各行を順に確認し、有効なデータだけを表示する。
    for record_no, row_data in enumerate(data_rows, start=1):
        person = Person.from_csv_row(row_data)

        # 不正なデータは件数付きのメッセージを表示して読み飛ばす。
        if person is None:
            print(f"{record_no}件目は不正なデータです")
            continue

        print(person.get_display_text())

if __name__ == "__main__":
    main()