# GESP等级：二级 | GESP Python 二级考点
# -*- coding: utf-8 -*-
"""
05第2节4 — type()侦探 + 强制类型转换
GESP考点：#29（数据类型识别）、#19（类型转换）
=============================================
"""

print("=" * 50)
print('【导入】type() = 问电脑"你是什么类型？"')
print("=" * 50)

name = "小明"
age = 10
print(f'name = "{name}"  →  type(name) = {type(name)}')
print(f"age  = {age}           →  type(age)  = {type(age)}")

print()
print("=" * 50)
print("【知识点①】type(变量) 查看类型 — 照妖镜")
print("=" * 50)

a = 100
b = 3.14
c = "Hello"
d = True
e = [1, 2, 3]

print(f"type({a})        → {type(a)}")
print(f"type({b})       → {type(b)}")
print(f'type("{c}")    → {type(c)}')
print(f"type({d})       → {type(d)}")
print(f"type({e}) → {type(e)}")

print()
print("=" * 50)
print("【知识点②】int() 把文字变数字 — 脱衣服")
print("=" * 50)

print(f'int("6")       → {int("6")}          # 纯数字字符串 → 整数')
print(f"int(3.9)       → {int(3.9)}          # 截断取整！不是四舍五入！")
print(f"int(True)      → {int(True)}         # True → 1")
print(f"int(False)     → {int(False)}        # False → 0")

# 以下会报错，注释掉
# print(int("6.5"))   # ValueError: invalid literal for int()
# print(int("abc"))   # ValueError: invalid literal for int()

print()
print("=" * 50)
print("【知识点③】float() 文字变小数字 — 戴帽子")
print("=" * 50)

print(f'float("2.5")   → {float("2.5")}')
print(f'float("3")     → {float("3")}')
print(f"float(5)       → {float(5)}")
# print(float("abc"))  # ValueError

print()
print("=" * 50)
print("【知识点④】str() 数字变文字 — 穿衣服")
print("=" * 50)

print(f"str(123)       → \"{str(123)}\"")
print(f"str(3.14)      → \"{str(3.14)}\"")
print(f"str(True)      → \"{str(True)}\"")

print()
print("=" * 50)
print("【知识点⑤】bool() 真假判断")
print("=" * 50)

test_values = [1, 0, "abc", "", [1, 2, 3], [], None, 100, -1, "False"]
for v in test_values:
    print(f"bool({repr(v):12s}) → {bool(v)}")

print()
print("=" * 50)
print("【关键演示】除法永远出 float！")
print("=" * 50)

print(f"type(360 / 6) → {type(360 / 6)}    ← 60.0，不是整数！")
print(f"type(10 / 2)  → {type(10 / 2)}    ← 5.0")
print(f"type(7 / 2)   → {type(7 / 2)}     ← 3.5")
print(f"type(9 / 3)   → {type(9 / 3)}    ← 3.0，依然是 float！")

print()
print("三种除法对比：")
print(f"10 / 3   = {10 / 3}     ← float（普通除法）")
print(f"10 // 3  = {10 // 3}      ← int（整除）")
print(f"10 % 3   = {10 % 3}      ← int（取余）")

print()
print("=" * 50)
print("【实操①】type 侦探填空")
print("=" * 50)

x = 3.14
y = "3.14"
z = 3.14 > 3
w = "3" + "14"
v = 10 / 2

print(f"x = 3.14        → type(x) = {type(x)}")   # float
print(f'y = "3.14"      → type(y) = {type(y)}')   # str
print(f"z = 3.14 > 3    → type(z) = {type(z)}")   # bool
print(f'w = "3" + "14"  → type(w) = {type(w)}')   # str
print(f"v = 10 / 2      → type(v) = {type(v)}")   # float

print()
print("=" * 50)
print("【实操②】强制转换计算")
print("=" * 50)

print(f'int("6") + 2 = {int("6") + 2}')            # 8
print(f"int(3.9)         = {int(3.9)}")            # 3（截断！）
print(f'float("2.5") + 1 = {float("2.5") + 1}')    # 3.5
print(f"bool(1) + bool(1) = {bool(1) + bool(1)}")  # 2（True=1）

print()
print("=" * 50)
print("【实操③】字符串拼接与转换")
print("=" * 50)

print(f'str(123) + "4"          = "{str(123) + "4"}"')        # "1234"
print(f'str(50) + str(50)       = "{str(50) + str(50)}"')     # "5050"
print(f'int("50") + int("50")   = {int("50") + int("50")}')   # 100
print(f'str(1 + 2) + "3"        = "{str(1 + 2) + "3"}"')     # "33"

print()
print("=" * 50)
print("【小测验证】")
print("=" * 50)

print(f"题目1：int(3.9) = {int(3.9)}     ← 选 A（截断取整）")
print(f"题目2：type(360 / 6) = {type(360 / 6)}   ← 选 B（除法永远出 float）")
print(f"题目3：int(\"6\") + int(\"7\") = {int('6') + int('7')}    ← 选 B")
print(f"题目5：bool(\"\") = {bool('')}      ← 选 B（空字符串为 False）")

# 题目4验证
try:
    int("5.5")
except ValueError as e:
    print(f"题目4：int(\"5.5\") → 报错：{e}  ← 选 C")

print()
print("=" * 50)
print("【课外挑战】混合运算")
print("=" * 50)

# 观察不同类型的运算结果
print(f"3 * \"abc\" → {3 * 'abc'}")       # 字符串重复
print('"abc" + "def" →', "abc" + "def")  # 字符串拼接
print(f"True + True + True → {True + True + True}")  # 布尔值加法
print('"数字：" + str(42) →', "数字：" + str(42))  # 混合拼接

print()
print("=" * 50)
print("【总结口诀】")
print("type 是照妖镜，照出类型现原形")
print("int() 脱衣服，去掉引号变数字")
print("str() 穿衣服，加上引号变文字")
print("float() 戴帽子，整数变成小数字")
print("bool() 判真假，空的假来有的真")
print("除法永远出 float，千万要牢记心中")
print("=" * 50)

# ===== 补充：浮点数精度问题（GESP二级真题考点）=====
print("\n" + "="*50)
print("浮点数精度问题")
print("="*50)
print(f"0.1 + 2 = {0.1 + 0.2}")
print(f"0.1 + 0.2 == 0.3 的结果是：{0.1 + 0.2 == 0.3}")
print(f"为什么？因为0.1在二进制里除不尽，就像1/3在十进制里除不尽")
print(f"正确比较：round(0.1+0.2, 2) == 0.3 → {round(0.1+0.2, 2) == 0.3}")
