# GESP等级：三级 | GESP Python 三级考点

# ============================================
# 第4关：字典实操——增删改查 + turtle配色
# 字典 = {键:值}，用 key 查 value
# 键不可变（字符串/数字），值可以变
# ============================================

import turtle
t = turtle.Turtle()
t.shape("turtle")
t.speed(3)

# ============================================
# 练习1：填空——字典增删改查
# ============================================
print("===== 练习1：字典增删改查 =====")

# 创建一个颜色字典：颜色名→中文名
colors = {"red": "红色", "blue": "蓝色", "green": "绿色"}

# 1. 查——用 [key] 获取值
print("red 的中文是：", colors[___])    # 填什么？

# 2. 改——修改已有键的值
colors[___] = ___    # 把 "blue" 的值改成 "蓝"
print(colors)

# 3. 增——添加新键值对
colors[___] = ___    # 添加 "yellow" → "黄色"
colors[___] = ___    # 添加 "purple" → "紫色"
print(colors)

# 4. 删——用 pop(key) 或 del 删除
colors.pop(___)      # 删除 "purple"
print("删除 purple 后：", colors)

del colors[___]      # 用 del 删除 "yellow"
print("删除 yellow 后：", colors)

# 5. 清空——clear()
colors.clear()
print("clear() 后：", colors)
print("字典长度：", len(colors))


# ============================================
# 练习2：get() 安全取值
# d[key] 找不到会报错，get(key) 找不到返回 None
# ============================================
print()
print("===== 练习2：get() 安全取值 =====")

scores = {"小明": 95, "小红": 88, "小刚": 72}

# 补全 get() 取值
name = "小明"
score = scores.get(___)      # 用 get 取 "小明" 的成绩
print(f"{name} 的成绩是：{score}")

name = "小李"                # 这个 key 不存在！
score = scores.get(___)      # get 应该返回什么？
print(f"{name} 的成绩是：{score}")    # 打印出来看看

# 给 get() 设置默认值——找不到时返回你指定的值
score = scores.get("小李", ___)   # 找不到时返回 0
print(f"用默认值：{score}")

# 对比：d["小李"] 会怎样？
# 取消下面这行的注释试试看：
# print(scores["小李"])       # 会报 KeyError！

print("结论：找不到 key 时，d[key] 报错，get(key) 返回 None")


# ============================================
# 练习3：用字典管 turtle 颜色名→中文名
# ============================================
print()
print("===== 练习3：turtle 颜色字典 =====")

# 颜色映射字典：英文名 → 中文名
color_map = {
    "red": "红色",
    "orange": "橙色",
    "yellow": "黄色",
    "green": "绿色",
    "blue": "蓝色",
    "purple": "紫色",
    "pink": "粉色",
    "brown": "棕色",
}

# 遍历字典，让 turtle 画出每个颜色
t.penup()
t.goto(-300, 200)
t.pendown()
t.pensize(20)

for eng, chn in color_map.items():    # items() 同时拿到键和值
    t.color(eng)                       # 用英文名设置颜色
    t.write(chn, font=("Arial", 16, "normal"))
    t.forward(2)
    t.penup()
    t.goto(-300, t.ycor() - 40)       # 往下移
    t.pendown()

# ⭐⭐⭐ 挑战：自己再添加 3 个颜色到 color_map 里
# 提示：可以用 color_map["cyan"] = "青色"


# ============================================
# 练习4：RGB 颜色查询器
# 颜色名 → RGB 十六进制值
# ============================================
print()
print("===== 练习4：RGB 颜色查询器 =====")

rgb_colors = {
    "red": "#FF0000",
    "orange": "#FFA500",
    "yellow": "#FFFF00",
    "green": "#00FF00",
    "blue": "#0000FF",
    "purple": "#800080",
    "black": "#000000",
    "white": "#FFFFFF",
    "gray": "#808080",
}

# 用户输入颜色名，程序返回 RGB 值
user_input = input("请输入颜色英文名（如 red）：")
result = rgb_colors.get(user_input, "未知颜色")
print(f"{user_input} 的 RGB 值是：{result}")


# ============================================
# ⭐ 挑战1：统计字母出现次数
# 用字典统计一个单词里每个字母出现了几次
# ============================================
print()
print("===== ⭐ 挑战1：字母统计 =====")

word = "hello python"
count = {}      # 空字典

for ch in word:
    if ch == " ":
        continue    # 跳过空格
    if ch in count:
        count[ch] = count[ch] + 1    # 已存在，加1
    else:
        count[ch] = 1                # 第一次出现

print(f"单词 '{word}' 的字母统计：")
for k, v in count.items():
    print(f"  '{k}' → {v} 次")


# ============================================
# ⭐⭐ 挑战2：用字典做简单翻译器
# 输入中文颜色名，输出 turtle 颜色
# ============================================
print()
print("===== ⭐⭐ 挑战2：颜色翻译器 =====")

# 中文 → 英文 映射（和上面的英文→中文反过来）
chn_to_eng = {
    "红色": "red",
    "橙色": "orange",
    "黄色": "yellow",
    "绿色": "green",
    "蓝色": "blue",
    "紫色": "purple",
}

# 用户输入中文名，turtle 变成对应的颜色
chn_name = input("请输入颜色中文名（如 红色）：")
eng_name = chn_to_eng.get(chn_name)

if eng_name:
    t.color(eng_name)
    t.write(f"turtle 变成 {chn_name} 啦！", font=("Arial", 18, "bold"))
else:
    print("颜色字典里没有这个颜色，试试添加它吧！")


# ============================================
# 🔍 小测：想一想
# ============================================
# 1. d.get("red") 和 d["red"] 有什么区别？
# 答：__________________________________________________
#
# 2. 字典和列表有什么不同？
# 答：__________________________________________________
#
# 3. 字典的键能不能用列表？为什么？
# 答：__________________________________________________


t.hideturtle()
turtle.done()
