ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

坐标移动与条件判断详解

坐标移动与条件判断详解 你好呀如果你之前完全没接触过编程这篇文章就是为你准备的。我会把这两道作业的代码 一行一行拆开 用生活中的例子讲清楚。看完你会发现编程其实没那么神秘说白了就是教计算机按规矩办事。## 先建立三个最基础的概念在看代码之前我们先认识三个词它们会反复出现1. 变量——就是一个贴了标签的盒子Python1x 0这句话的意思是拿一个盒子贴上标签叫x 在里面放进数字0 。以后写x x 1 就是把盒子里的东西拿出来加 1再放回去。2. 列表——就是一排有编号的格子Python1route [(0, 0)]route 是一个列表用方括号[] 表示可以理解成一排格子每个格子能放一个东西。格子从 0 开始编号注意不是从 1 开始这是编程里最常见的反直觉设计。3. 循环——就是重复做同一件事Python1for ch in s:意思是把s 里的东西 一个一个 拿出来每次放到ch 里然后执行缩进的那段代码。s 里有几个字母这段代码就重复几次。# 上午的程序让一个小人在纸上走路## 这个程序要解决什么问题想象有一个小人站在坐标纸的正中央我们把这个位置记作(0, 0) 。然后我们给他一串口令- F Forward向前走一步y 加 1- B Backward向后退一步y 减 1- L Left向左走一步x 减 1- R Right向右走一步x 加 1比如输入FRBL 小人走的路线是前、右、后、左——咦这不就是绕了一个方块又回到原地了吗程序的任务就是把他走过的每一个位置都记下来并告诉我们最后结果。## 逐行讲解Python1# -*- coding: utf-8 -*-这一行以# 开头叫 注释 。注释是写给人看的计算机会完全忽略它。这句的意思是告诉 Python这个文件里有中文请用 UTF-8 编码读取。Python1s input(请输入一串字母只含F、B、L、R)input() 是一个暂停并等待的指令程序运行到这里会停下来在屏幕上显示括号里的提示语等你用键盘打字、按回车。你输入的内容比如FRBL 会被装进s 这个盒子里。小知识input() 拿到的东西永远是 文字字符串 哪怕你输入的是 123它也认为是一二三这三个字符而不是数字。Python1x, y 0, 0这是同时给两个盒子赋值等价于Python12x 0y 0小人的起点就是 (0, 0)。Python1route [(0, 0)]这是整个程序里 最关键的一行之一 也是新手最容易忘的一步。(0, 0) 这种用圆括号包起来的东西叫 元组 你现在可以简单理解成一对坐标。我们让route 列表一开始就装着起点——因为题目要求记录起点 和 每一步结束后的位置起点必须先放进去### 进入循环一个口令一个动作Python1for ch in s:开始循环。假设你输入的是FRBL 那么- 第 1 圈ch 里装着F- 第 2 圈ch 里装着R- 第 3 圈ch 里装着B- 第 4 圈ch 里装着L循环体里的代码都向右缩进了 4 个空格 缩进代表这些代码属于循环内部 Python 靠缩进判断代码的归属所以缩进不能乱。Python12345678 if ch F:y 1elif ch B:y - 1elif ch L:x - 1elif ch R:x 1这是一串条件判断注意两个细节- 是两个等号意思是判断左右是否相等。 一个等号是赋值两个等号才是比较 这是新手最常写错的地方。- y 1 是y y 1 的简写意思是把 y 加 1。类似地- 就是减。程序会从上往下依次问这个字符是 F 吗是就 y 加 1 后面的判断全部跳过 不是就继续问是 B 吗……四个分支最多只有一个会执行。Python1 route.append((x, y))每走完一步就把当前坐标追加到route 列表的末尾。append 追加就是在列表最后面加一个新格子。我们可以看着FRBL 的执行过程时刻 x y route 列表 出发前 0 0 [(0,0)] F 之后 0 1 [(0,0), (0,1)] R 之后 1 1 [(0,0), (0,1), (1,1)] B 之后 1 0 [..., (1,0)] L 之后 0 0 [..., (1,0), (0,0)]最后route 里有 5 个位置1 个起点 4 步但步数是 4 。这就是为什么下一行不用route 的长度算步数。### 输出路线Python123456print(路线, end)for i, pos in enumerate(route):if i 0:print( → , end)print(pos, end)print()print() 是在屏幕上显示。默认每打印一次就会换一行但加上end 的意思是这次打印完 不要换行 这样所有内容才能连在一行里。这里出现了新工具enumerate 它能一边遍历列表一边顺便告诉你现在是第几个。所以i 是编号0、1、2……pos 是坐标本身。逻辑是先打印路线然后遍历每个位置——除了第 0 个起点之外每个位置前面先打印一个箭头→ 再打印坐标。最终效果1路线(0, 0) → (0, 1) → (1, 1) → (1, 0) → (0, 0)### 输出最终结果Python1print(最终坐标, route[-1])route[-1] 是 Python 里一个很方便的写法 负数编号表示从后往前数 -1 就是最后一个格子也就是最终位置。Python1print(总步数, len(s))len() 用来量长度。s 是输入的字符串len(s) 就是你输入了几个字母——正好等于步数4。注意不是len(route) 因为路线包含起点会多出 1。Python1234if x 0 and y 0:print(已回到起点)else:print(未回到起点)最后做判断x 并且 y 都等于 0才算回到起点。and 是并且两个条件必须同时成立。如果只有一个为 0比如 (0, 1)那也不算。这就是上午程序的全部内容。 它的套路可以总结成一句话定好起点 → 一边走一边记 → 走完做汇报。# 下午的程序给机器人当大脑## 这个程序要解决什么问题假设有一个机器人它需要根据两个信息决定动作- 距离 前方障碍物离它多远厘米- 电量 还剩多少电百分比规矩是 先看电量再看距离 。电量不足 20%不管前面多空旷都得去充电电量够才根据障碍物远近决定停车、减速还是正常开。题目给了 6 组测试数据注意它们是 6 种互不相干的情况 不是连续发生的——每一组都独立判断一次。## 逐行讲解Python12distances [80, 35, 10, 80, 20, 50]batteries [60, 60, 60, 15, 20, 20]这是两个列表。相同位置的数字配成一对第 0 个 80 和第 0 个 60 是第一组80 厘米、60% 电以此类推。一共 6 组。### 把判断逻辑封装成一个函数Python1def decide_action(distance, battery):def 是 define定义的缩写用来定义一个 函数 。函数可以理解成一台机器你从这头塞进去原料距离和电量它从那头吐出产品动作文字。括号里的distance, battery 叫 参数 是这台机器工作时需要的两份原料。把一段逻辑写成函数的好处是 写一次以后可以反复调用 而且主程序会显得很干净。Python12345678 if battery 20:return 停止并充电elif distance 20:return 停止避障elif distance 50:return 减速前进else:return 正常前进函数体里是判断逻辑。return 的意思是把结果递出去函数到此结束。这里有一个 非常巧妙的顺序设计 新手值得仔细体会1. battery 20 放在 第一位 。只要电量不足立刻return 后面的距离判断根本不会执行。这就保证了电量优先——第 4 组虽然距离 80 厘米很空旷但电量只有 15%照样去充电。2. 走到distance 20 这一行时电量必然已经 ≥ 20 了否则上一行就 return 了所以不用重复写电量条件。3. 走到distance 50 时距离必然已经 ≥ 20所以这里天然表示20 到 49 之间。这就是边界值的正确处理 - 电量正好 20 20 不成立 → 不算充电题目说20% 及以上就达标- 距离正好 20 20 不成立、 50 成立 → 减速前进- 距离正好 50 50 不成立 → 落到 else正常前进三个边界值恰好都落在题目要求的档位上。### 准备一个记账本Python1counts {}花括号{} 表示 字典 。字典不是一排编号格子而是一本成对记账本每个名字对应一个数字。我们准备用它记录每种动作出现了几次比如最后会变成Python1{正常前进: 2, 减速前进: 2, 停止避障: 1, 停止并充电: 1}### 六组数据逐个判断Python1for i in range(len(distances)):range(n) 会生成 0 到 n-1 的一串数字。len(distances) 是 6所以i 会依次取 0、1、2、3、4、5正好循环 6 次。我们用i 当下标去两个列表里取同一组的数据。Python12 d distances[i]b batteries[i]把第i 组的距离取出来放进d 电量放进b 。Python1 action decide_action(d, b)调用函数 把d 和b 塞给前面造好的那台机器机器吐出的动作文字装进action 。你看主程序完全不用关心函数内部怎么判断的这就是封装的好处。Python1 print(第%d组距离%d厘米电量%d%% - %s % (i 1, d, b, action))这一行看起来复杂其实只是按模板填空。字符串里的占位符- %d 表示这里放一个整数- %s 表示这里放一段文字- %% 表示一个真正的百分号因为单独的% 有特殊含义要写两个为什么是i 1 而不是i 因为i 从 0 开始但人习惯说第 1 组所以显示时加 1。 计算机内部从 0 数给人看时从 1 数 这是常见的小处理。Python1 counts[action] counts.get(action, 0) 1这是记账的一行也是新手可能觉得绕的一行拆开看- counts.get(action, 0) 查一下账本里这个动作出现过几次。如果是第一次出现账本里还没这个名字就当作 0。- 1 把次数加 1。- counts[action] ... 再写回账本。效果就是每判断一组对应动作的计数就加 1。 注意这行在循环内部 所以即使某组结果是停止计数和循环都会继续下一组照常判断。### 输出最终统计Python1order [正常前进, 减速前进, 停止避障, 停止并充电]为什么要专门定义一个顺序因为字典本身不保证排列顺序如果直接打印counts 四种动作的先后可能每次不同。我们规定一个固定顺序输出更整齐也能保证 四项全部出现 哪怕某项是 0 次。Python1print(统计结果 .join(%s%d次 % (n, counts.get(n, 0)) for n in order))这一行信息量大拆开- for n in order 按规定顺序依次取出每个动作名- %s%d次 % (n, counts.get(n, 0)) 拼成正常前进2次这样的片段- .join(...) 用逗号把所有片段连成一整句- 最后和统计结果拼在一起打印输出1统计结果正常前进2次减速前进2次停止避障1次停止并充电1次四项加起来 2211 6正好等于数据组数说明没有漏掉任何一组。# 把两段程序放在一起对比上午走路 下午机器人 数据从哪来 input() 键盘输入 直接写在程序里的两个列表 核心动作 循环里不断改变 x、y 循环里反复调用判断函数 怎么记结果 列表append 每个位置 字典给每种动作计数 判断关键 if/elif 识别是哪个字母 if/elif 注意先后顺序 电量优先 最后做什么 汇报路线、终点、是否回原点 汇报每组动作和总统计你会发现两个程序的骨架其实是一样的12345准备阶段变量、列表↓循环每次取一份数据 → 判断 → 记录↓收尾把记录的结果打印出来这个准备 → 循环处理 → 汇报的结构是大量程序的通用模板以后你会反复遇到。
返回列表