# GESP等级：四级 | GESP Python 四级考点
"""
第4节：return返回值——做完事要汇报

【使用方法】
1. 打开 IDLE → File → New File
2. 把这个文件完整复制进去（或直接打开本文件）
3. 按 F5 运行（或 Run → Run Module）
4. 从第1步到第4步依次运行，观察 return 的效果

【GESP考点】
#32 return返回值

【学习目标】
- 理解 return 的作用：把结果"说出来"
- 理解函数调用 = 使用返回值
- 知道无 return 的函数默认返回 None
- 能用 return 值配合画图
"""

import turtle

# ============================================
# 第1步：没有return——闷葫芦
# ============================================
# 记忆钩子：没有return=闷葫芦（做了事不说话）
# 老师让算3+5，算出8，但不说话——老师不知道答案
# ============================================

print("=" * 50)
print("第1步：没有return——闷葫芦")
print("=" * 50)


def add_no_return(a, b):
    """计算 a+b 但不返回结果（闷葫芦）"""
    result = a + b
    print(f"  函数内部算好了：{a} + {b} = {result}")
    # 没有写 return → 默认返回 None


print("\n>>> 调用 add_no_return(3, 5)")
return_value = add_no_return(3, 5)
print(f">>> 函数返回了什么？→ {return_value}")
print(f">>> 类型是：{type(return_value)}")
print("💡 函数虽然算了，但没说出来！外面拿不到结果！")


# ============================================
# 第2步：有return——大声汇报！
# ============================================
# 记忆钩子：return=做完事大声汇报
# 老师让算3+5，算出8，大声说"8！"——老师知道了
# ============================================

print("\n" + "=" * 50)
print("第2步：有return——大声汇报！")
print("=" * 50)


def add_with_return(a, b):
    """计算 a+b 并返回结果（大声汇报）"""
    result = a + b
    print(f"  函数内部算好了：{a} + {b} = {result}")
    return result  # ← 大声汇报！把结果传出去


print("\n>>> 调用 add_with_return(3, 5)")
return_value = add_with_return(3, 5)
print(f">>> 函数返回了什么？→ {return_value}")
print(f">>> 类型是：{type(return_value)}")
print("💡 有 return，外面就能拿到结果了！")


# ============================================
# 第3步：函数调用 = 使用返回值
# ============================================
# return 回来的值可以：
#   - 直接打印：print(函数())
#   - 存到变量：x = 函数()
#   - 参与运算：函数() + 函数()
#   - 传给另一个函数：另一个函数(函数())
# ============================================

print("\n" + "=" * 50)
print("第3步：函数调用 = 使用返回值")
print("=" * 50)


# ---------- 3a：直接打印 ----------
def double(n):
    """返回 n 的两倍"""
    return n * 2


print("\n>>> 直接打印返回值：print(double(5))")
print(f"    double(5) = {double(5)}")  # double(5) → 10，然后打印


# ---------- 3b：存到变量 ----------
print("\n>>> 把返回值存到变量：result = double(10)")
result = double(10)  # double(10) → 20，存进 result
print(f"    result = {result}")
print(f"    再用 result 做运算：result + 5 = {result + 5}")


# ---------- 3c：返回值参与运算 ----------
print("\n>>> 返回值参与运算：double(3) + double(4)")
print(f"    double(3) + double(4) = {double(3) + double(4)}")
# double(3) → 6, double(4) → 8, 6+8=14


# ---------- 3d：链式调用 ----------
print("\n>>> 返回值传给另一个函数：double(double(3))")
print(f"    double(double(3)) = {double(double(3))}")
# double(3) → 6, double(6) → 12


# ============================================
# 第4步：用 return 值画多边形——360 ÷ 边数
# ============================================
# 有了 return，我们可以写一个"算角度"的函数，
# 把算好的角度返回，再传给乌龟！
# ============================================

print("\n" + "=" * 50)
print("第4步：用 return 值画多边形")
print("=" * 50)


def angle(sides):
    """计算正多边形每次转的角度：360 ÷ 边数"""
    return 360 / sides


# 创建一个乌龟
t = turtle.Turtle()
t.shape("turtle")
t.speed(5)

# 用函数返回值来画六边形
sides = 6
turn_angle = angle(sides)  # ← 调用函数得到返回值！60.0

print(f"\n>>> angle({sides}) 返回了：{turn_angle}")
print(f">>> 用这个返回值来画一个正{sides}边形")

t.pencolor("blue")
t.pensize(3)

for i in range(sides):
    t.forward(80)
    t.right(turn_angle)  # ← 用 return 回来的值！


# ---------- 4b：画三角形 ----------
t.penup()
t.forward(200)
t.pendown()

sides = 3
turn_angle = angle(sides)  # ← 又调用一次！120.0

print(f"\n>>> angle({sides}) 返回了：{turn_angle}")
print(f">>> 用这个返回值来画一个正{sides}边形")

t.pencolor("red")

for i in range(sides):
    t.forward(120)
    t.right(turn_angle)


# ---------- 4c：画正方形 ----------
t.penup()
t.forward(200)
t.pendown()

sides = 4
turn_angle = angle(sides)

print(f"\n>>> angle({sides}) 返回了：{turn_angle}")
print(f">>> 用这个返回值来画一个正{sides}边形")

t.pencolor("green")

for i in range(sides):
    t.forward(100)
    t.right(turn_angle)


# ============================================
# 第5步：None 是什么？
# ============================================
# 没有 return 的函数，默认返回 None
# None = "什么都没有" / "空气"
# ============================================

print("\n" + "=" * 50)
print("第5步：None——没有 return 的默认返回值")
print("=" * 50)


def say_hello(name):
    """打招呼但不返回任何东西"""
    print(f"  你好，{name}！")


print("\n>>> r = say_hello('小明')")
r = say_hello("小明")
print(f">>> r 的值是：{r}")
print(f">>> r 的类型是：{type(r)}")

print("\n>>> 判断是不是 None：print(r is None)")
print(f"    {r is None}")  # True！

print("\n💡 规律：")
print("   有 return → 返回指定值")
print("   没有 return → 默认返回 None")


# ============================================
# 总结
# ============================================
print("\n" + "=" * 50)
print("总结")
print("=" * 50)
print("""
🔥 记忆钩子：
   return = 做完事大声汇报 💬
   没有 return = 闷葫芦 🤐

📌 三个重点：
   ① return 把值"说出去"——函数外才能用
   ② 函数调用 = 用返回值——可以打印/存变量/运算
   ③ 没有 return 默认返回 None——什么都没有

❓ 小测答案：
   "没有 return 的函数返回什么？"
   → None（空/什么都没有）
""")

t.hideturtle()
turtle.done()
