Python 魔法书: 第 2 卷
第 1 页
🧙‍♂️

函数的定义与调用

CodeCombat 第 31-35 关

📜 编写咒语 (定义)
✨ 施放咒语 (调用)

本节课关卡

扣哒世界 · 计算机科学2 · Python · 第31–35关

Python · 本节课关卡

31 · 乡村巡游者

先读关卡目标,观察地图,再运用本课知识。

32 · 村庄守卫

先读关卡目标,观察地图,再运用本课知识。

33 · 村庄守护神

先读关卡目标,观察地图,再运用本课知识。

34 · 造币厂

先读关卡目标,观察地图,再运用本课知识。

35 · 概念挑战. 寂静市

先读关卡目标,观察地图,再运用本课知识。

学习路线:读目标 → 看图解 → 写代码 → 运行检查

🔮

什么是函数 (Function)?

想象你是一个魔法师,每次战斗都要念一长串咒语:
"找敌人...检查距离...举起剑...用力挥下..."

太累了!不如把这一长串动作打包成一个新咒语,起名叫“超级攻击”。

"函数就是你的自定义咒语:把复杂的代码打包,想用的时候只需叫它的名字!"
重复的代码 = 杂乱的卷轴
📜📜📜
⬇️ Function ⬇️
📦
整洁的包裹
🧬

Python 函数解剖图

在 CodeCombat 的 Python 中,我们这样定义函数:

  1. def:告诉电脑“我要定义一个函数”。
  2. 函数名:给你的咒语起个名字。
  3. ():放参数的地方(目前是空的)。
  4. ::行尾写冒号,函数体统一缩进 4 个空格。

注意:执行到函数调用前,要先完成函数定义!

# 定义一个名为 attackEnemy 的函数 def attackEnemy(): enemy = hero.findNearestEnemy() if enemy: hero.attack(enemy)
🗣️

定义 (Define) vs 调用 (Call)

这是初学者最容易搞混的地方!

📝 定义 (Definition) = 写说明书
"这个魔法该怎么做?"
(电脑此时不会执行这些动作)
🪄 调用 (Call) = 下达命令
"现在,立刻做这个魔法!"
(电脑开始执行动作)
📘
定义
def myFunc(): …
➡
⚡
调用
myFunc()
🚶

第31关 · 乡村巡游者

任务: 在村庄里巡逻。因为要多次“找敌人并攻击”,所以我们把它写成一个函数。

# 1. 定义函数 (写在 main 外面) def findAndAttackEnemy(): enemy = hero.findNearestEnemy() if enemy: hero.attack(enemy) while True: hero.moveXY(35, 34) # 2. 调用函数 (重复使用!) findAndAttackEnemy() hero.moveXY(60, 31) findAndAttackEnemy()
👮
巡逻中...
🏘️

第32关 · 村庄守卫

你可以定义多个函数来处理不同的情况。这里我们区分“普通攻击”和“强力劈斩”。

def findAndAttackEnemy(): enemy = hero.findNearestEnemy() if enemy: hero.attack(enemy) def findAndCleaveEnemy(): enemy = hero.findNearestEnemy() if enemy: if hero.isReady("cleave"): hero.cleave(enemy) while True: hero.moveXY(35, 34) # 先试着大招,再普通攻击 findAndCleaveEnemy() findAndAttackEnemy()
⚔️ + 🌪️
多技能组合
🧠

第33关 · 村庄守护神

函数内部可以包含复杂的逻辑!

在这个函数里,我们把 if/else 判断全放进去。主程序只需要“傻瓜式”调用 cleaveOrAttack() 即可。

def cleaveOrAttack(): enemy = hero.findNearestEnemy() if enemy: if hero.isReady("cleave"): hero.cleave(enemy) else: hero.attack(enemy)
📦
复杂逻辑已打包
💰

第34关 · 造币厂

这一关你需要自己从头写出 attackEnemy 函数。

提示: 模仿 pickUpCoin 的写法,但是把捡硬币的逻辑换成打敌人的逻辑。

def pickUpCoin(): coin = hero.findNearestItem() if coin: hero.moveXY(coin.pos.x, coin.pos.y) def attackEnemy(): # 在这里写代码:找到敌人 -> 攻击敌人 enemy = hero.findNearestEnemy() if enemy: hero.attack(enemy)
🪙 🏃 👹
🎓

大法师结业口诀

"def 定义小技能,
冒号缩进写步骤,
函数名字来调用!"

"一次编写,到处使用 (DRY原则)"

🏆

我的知识宝藏 · 一页复习

扣哒世界 · 计算机科学2 · Python · 第31–35关

Python · 知识点图
关键字方法 / 函数字符串数字

什么是函数?

想象你是一个魔法师,每次战斗都要念一长串咒语: "找敌人...检查距离...举起剑...用力挥下..."

Python 函数解剖图

在 CodeCombat 的 Python 中,我们这样定义函数:

enemy = hero.findNearestEnemy()

定义 vs 调用

这是初学者最容易搞混的地方!

第31关 · 乡村巡游者

任务: 在村庄里巡逻。因为要多次“找敌人并攻击”,所以我们把它写成一个函数。

enemy = hero.findNearestEnemy()

第32关 · 村庄守卫

你可以定义多个函数来处理不同的情况。这里我们区分“普通攻击”和“强力劈斩”。

enemy = hero.findNearestEnemy()

第33关 · 村庄守护神

函数内部可以包含复杂的逻辑!

enemy = hero.findNearestEnemy()

第34关 · 造币厂

这一关你需要自己从头写出 attackEnemy 函数。

coin = hero.findNearestItem()

本节课关卡:31. 乡村巡游者;32. 村庄守卫;33. 村庄守护神;34. 造币厂;35. 概念挑战. 寂静市