以下は「基礎 → 中級 → 上級」の順で計16問。各問題に期待される入力/出力(あるいは処理)、解答(コード)、短い解説を付けています。まず自力で解きたい場合は「問題のみ」を読んで止め、解答はその下のブロックで確認してください。
基礎(4問) — 型の扱いに慣れる
問1(入力 → 数値合計)
指示:文字列として与えられた x = "12" と整数 y = 8 を数値として足して表示するコードを書け。
期待:出力 20
# 解答例
x = "12"
y = 8
print(int(x) + y) # 20
Python解説:x は文字列なので int() で変換。
問2(割り算の型)
指示:a = 7, b = 2 のとき a / b と a // b の出力と型を表示するコードを書け。
期待:
3.5
<class 'float'>
3
<class 'int'>
Python# 解答例
a = 7
b = 2
print(a / b)
print(type(a / b))
print(a // b)
print(type(a // b))
Python解説:/ は float、// は整数(切り捨て)。
問3(文字列の繰り返し)
指示:price = "300" のとき price * 2 を実行した結果と理由を表示するコードを書け。
期待:出力 "300300" と説明コメント
# 解答例
price = "300"
print(price * 2) # "300300"(文字列の繰り返し)
Python解説:文字列 * 整数は繰り返しを意味する。
問4(ユーザー入力の型変換)
指示:ユーザーから身長(cm)を入力してメートルで表示する(整数入力を想定)。例:入力 170 → 出力 1.7。
期待:身長をメートル表示
# 解答例
cm = int(input("身長(cm): ")) # 例: 170
m = cm / 100
print(f"{m} m")
Python解説:input() は文字列 → int() が必要。 / によって float になる。
中級(6問) — 型混在・変換・検証
問5(複数入力 → 平均)
指示:スペース区切りで入力された 2つの数(整数または小数)を読み取り、合計と平均(小数)を表示するスクリプトを書け。
期待:"1.5 2" → 合計 3.5 平均 1.75
# 解答例
a_str, b_str = input("2つの数を入力: ").split()
a = float(a_str)
b = float(b_str)
total = a + b
avg = total / 2
print(total)
print(avg)
Python解説:未知の数は float() で受けておくと安全(整数も扱える)。
問6(数値としての妥当性チェック)
指示:ユーザー入力が整数文字列かどうか判定する関数 is_int(s) を実装し、テストする。
期待:"12" → True、"3.14" → False、"abc" → False
# 解答例
def is_int(s):
try:
int(s)
return True
except ValueError:
return False
print(is_int("12")) # True
print(is_int("3.14")) # False
print(is_int("abc")) # False
Python解説:例外処理で検査するのが簡潔で確実。
問7(フォーマットと型)
指示:名前(文字列)と年齢(整数)を受け取り「Taroさんは20歳です」と出力するが、年齢の入力は input() で受ける。int 変換と f文字列を使え。
期待:適切な文を出力
# 解答例
name = input("名前: ")
age = int(input("年齢: "))
print(f"{name}さんは{age}歳です")
Python解説:文字列と数値の混ぜ方は f文字列が便利。
問8(数値→文字列の安全な結合)
指示:商品価格(整数)と個数(整数)があり、合計金額を「合計: 300円」の形式で出力するコードを書け。文字列結合と f文字列の両方で1行ずつ示す。
期待:正しく文字列になる(エラー無し)
# 解答例
price = 100
count = 3
total = price * count
# 方法1: str() を使う
print("合計: " + str(total) + "円")
# 方法2: f文字列
print(f"合計: {total}円")
Python解説:文字列と数値を直接 + で繋ぐとエラーになるので str() か f文字列を使う。
問9(浮動小数点比較)
指示:0.1 + 0.2 が 0.3 と等しいか math.isclose() を使って判定せよ。
期待:True(近似一致)
# 解答例
import math
x = 0.1 + 0.2
print(x == 0.3) # 多くの場合 False
print(math.isclose(x, 0.3)) # True
Python解説:浮動小数点の丸め誤差を考慮する。
上級(6問) — 実務的な型処理・落とし穴
問10(可変引数と型確認)
指示:任意個の引数を受け取り、数値(int/float)のみ合計する sum_numbers(*args) を実装せよ(文字列等は無視)。
期待:sum_numbers(1, "a", 2.5) → 3.5
# 解答例
def sum_numbers(*args):
total = 0.0
for v in args:
if isinstance(v, (int, float)):
total += v
return total
print(sum_numbers(1, "a", 2.5)) # 3.5
Python解説:isinstance で型を限定し安全に集計。
問11(デフォルト引数の落とし穴)
指示:可変オブジェクトをデフォルト引数に使った関数のバグを示す例を作り、修正版を提示せよ。
期待:呼ぶたびに蓄積されない修正版
# NG例(バグあり)
def append_item(x=[]):
x.append(1)
return x
print(append_item()) # [1]
print(append_item()) # [1, 1] ← 想定外に蓄積される
# 修正版
def append_item_fixed(x=None):
if x is None:
x = []
x.append(1)
return x
print(append_item_fixed()) # [1]
print(append_item_fixed()) # [1]
Python解説:デフォルト引数は関数定義時に1回だけ評価される。
問12(CSV風文字列→数値のパースとエラーハンドリング)
指示:カンマ区切りの文字列(例 "10,20,abc,30")を受け取り、数値に変換できる要素のみの合計を返す関数を書け。
期待:"10,20,abc,30" → 60
# 解答例
def sum_csv_numbers(s):
total = 0
for part in s.split(","):
try:
total += int(part)
except ValueError:
continue
return total
print(sum_csv_numbers("10,20,abc,30")) # 60
Python解説:例外で不正な項目をスキップする。
問13(型ヒント+簡単な静的チェック用)
指示:引数 name: str, age: int を受け取り、自己紹介を返す関数 profile を型ヒント付きで書く。簡単な入力チェック(age が負でない)も入れる。
期待:負の年齢は ValueError を投げる
# 解答例
def profile(name: str, age: int) -> str:
if age < 0:
raise ValueError("age must be non-negative")
return f"{name}さんは{age}歳です"
print(profile("Taro", 20))
# print(profile("Taro", -1)) # ValueError
Python解説:型ヒントはランタイムでは強制されないが、読みやすさと静的解析に有効。
問14(数値フォーマット:小数点以下桁揃え)
指示:小数 3.14159265 を小数点以下 2 桁で表示する(丸め)。
期待:3.14
# 解答例
x = 3.14159265
print(f"{x:.2f}") # 3.14
Python解説:f文字列のフォーマット指定子で見やすく表示できる。
✅ まとめ(使い方メモ)
input()→ 常にstr。数値が必要ならint()/float()を使う。- 型の混在(
int+float)はfloatに昇格する。 - 文字列と数値は直接結合できない(
str()or f文字列 を使う)。 - 浮動小数点の比較は
math.isclose()。 - 可変オブジェクトのデフォルト引数に注意。
isinstance()で受け取りたい型を限定する。
