尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python while循环与pass语句:从游戏逻辑到工程实践的核心控制

Python while循环与pass语句:从游戏逻辑到工程实践的核心控制 1. 从“人狗大作战”到循环控制为什么while是Python编程的基石最近在社区里看到不少朋友在讨论“人狗大作战”这类小游戏的Python实现代码兴致勃勃地下载了Python环境跟着教程配置了VSCode准备大干一场。但往往在动手写核心逻辑时就卡在了第一步如何让游戏持续运行直到一方“血量”归零如何让角色重复执行攻击、防御动作这个看似简单的“重复执行”恰恰是编程思维从“顺序执行”跃升到“逻辑控制”的关键一步。而实现这一步在Python里最直接的工具就是while循环。很多新手包括当年的我最容易犯的错误就是试图用无数行重复的print或赋值语句来模拟循环代码冗长且难以维护。一旦游戏规则稍有变动比如从“三局两胜”改成“血量制”整个代码结构就得推倒重来。while语句的价值就在于它用极其简洁的语法封装了“在条件满足时反复执行一段代码”这一核心逻辑。这不仅是游戏编程的基础更是自动化脚本、数据监控、网络爬虫乃至量化交易策略中处理持续流或不确定长度任务的必备技能。与此同时在构建复杂的条件判断或搭建代码框架时我们常常会遇到一种情况语法上需要一个语句块但逻辑上暂时什么都不想做或者只是需要一个占位符来保证程序结构完整。这时那个看似毫无用处的pass语句就派上了大用场。它像代码里的“施工围挡”告诉解释器“这里我计划要做点事但现在先空着别报错”。理解并善用pass能让你在构思大型项目或调试复杂逻辑时更加从容。本文将彻底拆解while和pass这两个看似基础却深刻影响代码结构与思维的核心语句。我不会只给你干巴巴的语法规则而是会结合“人狗大作战”的游戏逻辑、数据处理的常见场景带你理解它们为何这样设计在实际编码中会遇到哪些“坑”以及如何用它们写出既健壮又优雅的代码。无论你是刚看完《Python编程从入门到实践》的新手还是在为面试题中复杂的循环逻辑发愁的进阶者相信都能从中获得新的启发。2. while循环不止是重复更是状态驱动的引擎while循环的核心在于“条件驱动”。它不像for循环那样通常用于遍历已知的序列而是专注于处理那些终止条件在运行时才能确定的场景。这种特性让它成为构建交互式程序、监控任务和事件驱动逻辑的天然选择。2.1 基础语法与“人狗大作战”的生死循环while语句的基本结构非常简单while 条件表达式: # 循环体缩进的代码块 执行语句当 Python 解释器执行到while语句时它会先计算“条件表达式”的值。如果结果为True则执行一次循环体内的所有语句执行完毕后再次回到while行重新计算条件表达式的值。如此周而复始直到某一次计算条件表达式的结果为False循环终止程序继续执行循环体之后的代码。让我们将其代入“人狗大作战”的简化模型。假设游戏规则是人和狗都有初始血量轮流攻击每次攻击造成随机伤害直到一方血量小于等于0。import random human_hp 100 dog_hp 100 round_count 0 print(人狗大作战开始) while human_hp 0 and dog_hp 0: # 循环条件双方都存活 round_count 1 print(f\n 第 {round_count} 回合 ) # 人攻击狗 human_attack random.randint(10, 20) dog_hp - human_attack print(f人类攻击了狗造成 {human_attack} 点伤害。狗剩余血量{max(dog_hp, 0)}) # 如果狗已死则终止本轮不再执行狗的攻击 if dog_hp 0: break # 狗攻击人 dog_attack random.randint(8, 18) human_hp - dog_attack print(f狗反击了人类造成 {dog_attack} 点伤害。人剩余血量{max(human_hp, 0)}) # 循环结束后判断胜负 print(\n 战斗结束 ) if human_hp 0: print(狗获得了胜利) elif dog_hp 0: print(人类获得了胜利)关键点解析条件表达式human_hp 0 and dog_hp 0这是循环的“发动机”。只要双方血量都大于0战斗就继续。这个条件在每次循环开始前都会被评估。循环体内的状态改变在循环体内我们通过dog_hp - human_attack和human_hp - dog_attack改变了决定循环条件的变量值。这是避免“无限循环”的关键——你必须在循环体内提供改变条件状态的路径。break的提前退出在狗被击败后我们使用了break语句立即跳出整个while循环。这是因为如果不跳出程序仍会执行本回合狗的攻击逻辑这显然不符合常理。break提供了在循环条件尚未变为False时基于内部逻辑强制退出的能力。注意这是一个典型的“前测试循环”即先判断条件再决定是否执行循环体。这意味着如果一开始条件就不满足比如初始血量设为了0循环体一次都不会执行。2.2 无限循环是陷阱也是工具如果while的条件表达式永远为True就会形成无限循环。这通常是初学者最常踩的坑之一程序会卡死消耗大量CPU资源。错误示例# 经典死循环忘记修改循环条件 count 0 while count 5: # 条件永远为True因为count从未增加 print(陷入循环...) # 程序永远停在这里然而无限循环并非一无是处。在特定场景下它是非常有用的设计模式服务器主循环一个Web服务器或游戏服务器需要7x24小时不间断运行等待并处理客户端请求。事件监听器GUI应用或机器人程序中的事件监听循环持续等待用户输入或传感器信号。实时数据监控持续从金融数据接口如Wind、Tushare拉取数据并处理。安全使用无限循环的模式# 模式一使用 break 在内部控制退出 while True: # 条件恒为True user_input input(请输入指令输入‘quit’退出: ) if user_input.lower() quit: print(程序退出。) break # 内部条件触发退出 # 处理其他指令... print(f执行了: {user_input}) # 模式二结合 try-except 和信号控制 import time should_exit False def signal_handler(signum, frame): global should_exit should_exit True # ... (假设这里注册了信号处理函数例如收到CtrlC) while not should_exit: try: # 执行一些轮询任务例如检查API data fetch_data_from_api() process(data) time.sleep(1) # 避免CPU空转非常重要 except KeyboardInterrupt: print(\n接收到中断信号准备退出...) should_exit True except Exception as e: print(f处理数据时出错: {e}) # 可以选择记录日志后继续或根据错误类型决定是否退出核心技巧在使用while True时务必在循环体内包含sleep语句或time.sleep()除非你确实需要榨干CPU性能如高性能计算。这能极大降低程序对系统资源的占用。在“人狗大作战”的实时版本中如果做成图形界面主游戏循环通常就是一个while True内部包含处理事件、更新画面、短暂休眠的逻辑。2.3 while与for的选择遍历已知与探索未知很多初学者会困惑什么时候用for什么时候用while一个简单的区分原则是for循环当你事先知道需要重复的次数或者需要遍历一个已知的、有限的集合如列表、字符串、字典、文件行、range对象时使用。它是“迭代驱动”。while循环当你不知道需要重复多少次循环的结束取决于某个运行时才能确定的条件如用户输入、数据是否到达末尾、某个状态是否改变时使用。它是“条件驱动”。场景对比场景推荐循环原因遍历一个列表中的所有元素for item in my_list:集合已知且有限。读取文件直到文件末尾while (line : file.readline()):结束条件EOF在运行时确定。执行固定次数如10次for _ in range(10):次数明确。等待用户输入特定命令while user_input ! quit:结束条件由用户动态决定。运行量化策略直到市场收盘while not is_market_close(current_time):结束条件依赖于外部时间。逆序一个单链表while current_node is not None:链表长度未知结束条件是节点为空。在“人狗大作战”的例子中我们使用while是因为回合数不确定它取决于每次随机攻击的伤害值。如果我们改成一个“训练模式”固定打10个回合那么用for _ in range(10):就更合适。3. 循环控制三剑客break, continue, elsewhile(和for) 循环有两个强大的“伙伴”break和continue。此外Python 还为循环提供了一个独特的else子句。理解它们才能精细地控制循环流程。3.1 break紧急制动break语句的作用是立即终止当前所在的最内层循环并跳转到循环体之后的语句继续执行。我们已经在2.1节的游戏示例中看到了它的用法。更复杂的例子在数据中查找第一个满足条件的元素假设我们有一组股票代码和价格列表想要找到第一支价格低于某个阈值的股票。stocks [(AAPL, 175), (GOOGL, 145), (MSFT, 330), (TSLA, 180), (AMZN, 130)] threshold 150 found_stock None for code, price in stocks: if price threshold: found_stock (code, price) break # 找到第一个就停止不再遍历剩余股票 if found_stock: print(f找到低于{threshold}的股票: {found_stock[0]}, 价格${found_stock[1]}) else: print(f没有找到价格低于{threshold}的股票)这里使用break可以提高效率因为找到目标后就不需要再检查后面的数据了。3.2 continue跳过本轮continue语句的作用是跳过当前循环体中剩余未执行的语句直接进入下一轮循环即重新计算while条件或获取for的下一个元素。例子处理数据时跳过无效值假设我们从某个金融接口获取了一组数据但其中混入了None或负值我们需要计算有效数据的平均值。data_points [23.5, None, 42.1, -5, 18.9, None, 36.7] total 0 count 0 for value in data_points: if value is None or value 0: print(f跳过无效数据: {value}) continue # 跳过本次循环的后续代码累加 total value count 1 if count 0: average total / count print(f有效数据平均值: {average:.2f}) else: print(没有有效数据。)continue让代码逻辑更清晰避免了使用多层嵌套的if-else。3.3 while-else循环的“善后”条款这是Python循环的一个独特特性。else子句紧跟在循环体之后并且只有当循环正常结束即不是通过break语句跳出时才会执行。# 搜索场景的经典用法 search_list [1, 3, 5, 7, 9] target 4 index 0 while index len(search_list): if search_list[index] target: print(f找到目标 {target}索引为 {index}) break index 1 else: # 这个else属于while循环 # 只有当while循环完整遍历完因条件index len(search_list)变为False而结束且没有执行过break时才会来到这里。 print(f列表中未找到目标 {target}) # 无论是否找到都会执行这里的代码 print(搜索完毕。)执行逻辑如果在循环中通过break找到了目标则直接跳出循环else块不会执行。如果循环从头到尾完整执行了一遍即index从0递增到len(search_list)条件变为False这意味着没有执行过break那么循环结束后就会执行else块中的代码。重要提示while-else中的else很容易被误解为“循环条件为False时执行”。实际上它的正确理解是“循环没有被break中断时执行”。即使循环体一次都没执行初始条件就为False只要没遇到breakelse块也会执行。这个特性非常适合用于搜索、验证等“找得到/找不到”的场景可以避免额外设置一个标志变量如found False。4. pass语句沉默的占位符与结构守护者如果说while是主动控制流程的引擎那么pass就是被动维持结构完整的“哑元”。它是一个空操作语句当解释器执行它时什么都不发生。4.1 基础语法与存在意义pass的语法简单到极致pass它的主要用途是作为语法上的占位符在需要语句块的地方暂时不写任何逻辑但又不想引发语法错误。为什么需要它Python 使用缩进来定义代码块。对于某些复合语句如if,while,for,def,class语法上要求后面必须跟一个非空的语句块。如果你在构思阶段只想先搭个架子pass就派上用场了。4.2 典型应用场景场景一搭建函数或类的框架当你设计一个模块时可能先定义好接口函数名、参数、类名具体实现稍后再填充。def complex_data_processor(raw_data): 一个复杂的数据处理函数步骤很多先搭架子。 # TODO: 第一步数据清洗 pass # TODO: 第二步特征提取 pass # TODO: 第三步模型预测 pass # TODO: 第四步结果格式化 pass return processed_result class FutureTradingStrategy: 一个计划中的期货交易策略类。 def __init__(self, config): self.config config # 初始化一些成员变量 pass def on_market_data(self, tick_data): 收到市场行情时的回调函数。 # 核心交易逻辑待实现 pass def on_order_event(self, event): 收到订单事件时的回调函数。 # 风控和日志记录待实现 pass这样做的好处是代码结构清晰可以通过语法检查其他部分的代码可以先行引用这些未完成的函数或类而不会报错。场景二在异常处理中忽略特定错误有时你明确知道某些异常可以安全地忽略但又不能完全省略except块。def safe_divide(a, b): try: result a / b except ZeroDivisionError: # 除数为零我们决定返回None而不是崩溃但不需要额外操作 result None except TypeError: # 输入类型错误我们同样返回None且无需特殊处理 result None except Exception: # 其他所有异常我们选择静默忽略并返回None。 # 但这里必须有一条语句所以用pass。 pass # 这里也可以写 result None但用pass强调了“故意忽略” result None return result警告过度使用pass忽略异常是非常危险的做法它会掩盖真正的程序错误。务必确保你非常清楚自己在忽略什么并且有充分的理由例如在清理临时文件时文件可能不存在。场景三实现抽象基类中的抽象方法在定义抽象基类ABC时子类必须实现所有抽象方法。但有时某个子类可能确实不需要某个方法的实际行为。from abc import ABC, abstractmethod class DataExporter(ABC): abstractmethod def export_to_csv(self, data): pass # 抽象方法只有定义 abstractmethod def export_to_json(self, data): pass class CSVOnlyExporter(DataExporter): def export_to_csv(self, data): # 具体实现CSV导出 with open(output.csv, w) as f: # ... 写入数据 print(CSV导出成功。) def export_to_json(self, data): # 这个导出器不支持JSON但为了满足抽象基类要求必须实现这个方法。 # 我们可以选择抛出一个 NotImplementedError或者用pass静默处理。 pass # 或者 raise NotImplementedError(This exporter does not support JSON.)在这种情况下pass提供了一种最小化的实现虽然它什么也不做。4.3 pass, continue 和 空语句块的区别初学者容易混淆pass、continue以及一个完全空的代码块。pass什么都不做只是一个占位符让程序继续执行下一条语句。continue只用于循环体内作用是跳过本轮剩余代码直接开始下一轮循环。空代码块在if/elif/else、try/except中有时确实需要什么都不做。但要注意在except或else后面直接跟冒号然后换行可能会引起语法歧义取决于Python版本和格式通常建议放一个pass以明确意图。# 可能引起混淆的例子 if condition: # 这里完全空着在有些格式下可能没问题但不推荐 # 更好的方式是 pass一个实用技巧在团队协作或长期项目中可以用# TODO:注释配合pass明确标记出待完成的部分。def calculate_portfolio_risk(portfolio): # TODO: 实现夏普比率计算 pass # TODO: 实现最大回撤计算 pass # TODO: 集成风险模型 pass return risk_metrics5. 实战避坑while循环中的常见陷阱与高级模式掌握了基本语法并不意味着能写好循环。在实际编码中尤其是处理复杂逻辑或异步任务时一些细微之处可能导致bug。5.1 陷阱一循环条件中的可变对象与函数调用循环条件在每次迭代前都会被重新求值。如果条件表达式包含函数调用或引用可变对象而其值在循环体内被改变就需要格外小心。示例遍历并修改列表# 危险的操作在循环中修改正在遍历的列表长度 numbers [1, 2, 3, 4, 5, 6] i 0 while i len(numbers): # len(numbers) 每次循环都会重新计算 if numbers[i] % 2 0: # 删除偶数 numbers.pop(i) # 注意删除元素后列表变短但i没有减1且len(numbers)也变了 # 这会导致跳过下一个元素或者索引越界。 else: i 1 # 只有不删除元素时才递增索引 print(numbers) # 输出可能是 [1, 3, 5]但逻辑容易出错。更安全的做法通常在需要遍历并修改列表时更推荐创建一个新列表或者使用for循环遍历列表的副本。# 方法一创建新列表 numbers [1, 2, 3, 4, 5, 6] odd_numbers [] for num in numbers: if num % 2 ! 0: odd_numbers.append(num) print(odd_numbers) # 输出 [1, 3, 5] # 方法二倒序遍历如果必须原地修改 numbers [1, 2, 3, 4, 5, 6] for i in range(len(numbers)-1, -1, -1): # 从后往前索引 if numbers[i] % 2 0: numbers.pop(i) print(numbers) # 输出 [1, 3, 5]示例条件依赖耗时函数import time def get_sensor_reading(): 模拟一个耗时的传感器读数函数。 time.sleep(0.1) # 模拟I/O延迟 # ... 返回读数 return some_value # 低效写法每次循环都调用耗时函数 while get_sensor_reading() threshold: process_reading() # 问题循环条件判断一次 process_reading内部可能又判断一次导致函数被调用两次。 # 优化写法将函数调用结果存入变量 reading get_sensor_reading() while reading threshold: process_reading(reading) reading get_sensor_reading() # 在循环末尾更新5.2 陷阱二浮点数比较与循环终止由于浮点数的精度问题直接使用或!作为循环终止条件可能导致无限循环或意外退出。# 不可靠的循环 x 0.0 while x ! 1.0: # 由于浮点误差x可能永远无法精确等于1.0 x 0.1 print(x) if x 1.5: # 安全阀防止无限循环 break正确做法对于浮点数应使用范围比较,,,或检查差值是否小于一个极小的容差epsilon。x 0.0 target 1.0 epsilon 1e-10 # 一个非常小的数 while abs(x - target) epsilon: # 判断是否“足够接近” x 0.1 print(fx {x:.10f}) # 格式化输出观察精度5.3 高级模式使用while循环处理复杂状态机while循环非常适合实现简单的状态机这在解析数据、处理协议或游戏角色AI中很常见。# 一个简单的字符串解析状态机示例解析如 key1value1;key2value2; 的字符串 input_str nameJohn;age25;cityNew York; state SEEK_KEY current_key current_value result {} i 0 while i len(input_str): char input_str[i] if state SEEK_KEY: if char : state IN_VALUE elif char ;: # 空键值对忽略或处理错误 pass else: current_key char elif state IN_VALUE: if char ;: # 一个键值对结束 result[current_key.strip()] current_value.strip() current_key current_value state SEEK_KEY else: current_value char i 1 # 处理最后一个键值对如果字符串不是以分号结尾 if current_key and state IN_VALUE: result[current_key.strip()] current_value.strip() print(result) # 输出: {name: John, age: 25, city: New York}在这个例子中state变量驱动着while循环的行为根据当前读取的字符在不同状态间切换。这种模式比多层嵌套的if-else更清晰也更容易扩展例如增加处理转义字符的状态。5.4 性能考量while vs for在遍历序列时for循环通常比等价的while循环更快也更Pythonic。因为for循环的迭代逻辑是由解释器在C语言层面优化的。# 较慢的 while 遍历 my_list [i for i in range(1000000)] i 0 while i len(my_list): _ my_list[i] i 1 # 更快的 for 遍历 for item in my_list: _ item因此除非有明确的理由如循环条件复杂、需要基于索引的复杂操作否则优先使用for循环进行遍历。6. 综合案例构建一个简单的交互式命令行游戏框架让我们综合运用while、break、continue和pass来搭建一个“人狗大作战”游戏的可扩展命令行框架。这个框架将包含游戏主循环、状态管理、用户输入处理和占位符式的技能系统。import random import time class Character: 游戏角色基类。 def __init__(self, name, hp, attack_range): self.name name self.hp hp self.max_hp hp self.attack_range attack_range # (min, max) def is_alive(self): return self.hp 0 def take_damage(self, damage): self.hp - damage if self.hp 0: self.hp 0 def attack(self, target): 普通攻击。 damage random.randint(*self.attack_range) print(f{self.name} 攻击了 {target.name}造成 {damage} 点伤害) target.take_damage(damage) return damage def special_skill(self, target): 特殊技能。这是一个占位符子类应重写。 # 使用pass作为占位符表示有这个方法但默认不做事。 # 也可以选择抛出 NotImplementedError。 pass def __str__(self): return f{self.name} [HP: {self.hp}/{self.max_hp}] class Human(Character): 人类角色。 def __init__(self, name): super().__init__(name, hp120, attack_range(12, 25)) self.skill_charge 0 # 技能充能 def special_skill(self, target): 重写强力一击需要充能。 # 这里我们先不实现具体逻辑用pass占位后续再完善 # print(f{self.name} 正在蓄力...技能未准备好。) # 暂时先调用普通攻击 self.attack(target) pass class Dog(Character): 狗角色。 def __init__(self, name): super().__init__(name, hp100, attack_range(15, 30)) def special_skill(self, target): 重写连续撕咬。 # 同样用pass占位 # print(f{self.name} 狂吠着但技能还在冷却...) self.attack(target) pass def game_loop(): 游戏主循环。 player Human(勇敢的冒险者) enemy Dog(凶恶的流浪狗) round_num 1 print( * 30) print(人狗大作战 - 命令行版) print( * 30) time.sleep(1) # 主游戏循环条件驱动直到一方死亡 while player.is_alive() and enemy.is_alive(): print(f\n*** 第 {round_num} 回合 ***) print(player) print(enemy) print(- * 20) # 玩家行动选择 action None while action not in [1, 2, 3]: # 内层while处理无效输入 print(\n请选择你的行动) print( 1. 普通攻击) print( 2. 使用特殊技能未实装) print( 3. 查看状态) action input(输入数字选择 (1-3): ).strip() if action 1: player.attack(enemy) elif action 2: # 调用特殊技能目前是占位符pass实际效果同普通攻击 player.special_skill(enemy) print(特殊技能效果待实现) elif action 3: print(f\n{player}) print(f{enemy}) continue # 使用continue跳过本回合敌人行动重新选择行动 else: print(无效选择请重新输入。) # 这里没有改变action循环条件仍满足会再次进入while循环 # 检查敌人是否已死 if not enemy.is_alive(): break # 使用break立即结束战斗循环 # 敌人行动简单AI print(f\n{enemy.name} 的回合...) time.sleep(0.5) if random.random() 0.3: # 30%概率使用技能 enemy.special_skill(player) print(狗使用了特殊技能) else: enemy.attack(player) round_num 1 time.sleep(1) # 回合间暂停增强体验 # 游戏结束判断胜负 print(\n * 30) print(战斗结束) if player.is_alive(): print(f恭喜{player.name} 获胜了) else: print(f{enemy.name} 获胜了...) print( * 30) # 启动游戏 if __name__ __main__: game_loop()框架解析与技巧双层while循环外层while player.is_alive() and enemy.is_alive()控制整场战斗。内层while action not in [1, 2, 3]用于处理玩家输入确保输入有效。这是处理交互式输入的常见模式。pass的占位作用在Character.special_skill以及子类重写的方法中我们使用了pass。这允许我们先搭建出完整的类结构和游戏流程而将具体的技能效果实现推迟到后续开发。代码可以正常运行而不会报错。break与continue的协同当玩家选择“查看状态”选项3时我们使用continue跳过敌人行动让玩家重新选择。当敌人死亡时我们使用break立即跳出外层战斗循环避免执行无效的敌人回合。循环内的状态检查在玩家行动后我们立即检查enemy.is_alive()如果敌人已死则用break结束循环。这是一种“提前退出”的优化也符合逻辑。time.sleep()的使用在游戏循环中适当加入短暂休眠可以控制节奏避免输出刷屏提升用户体验。这个框架虽然简单但清晰地展示了如何将while循环用于游戏主循环和输入验证如何使用pass进行快速原型设计以及如何用break和continue精细控制流程。你可以在此基础上充实special_skill的实现添加更多角色、物品和复杂AI逐步完善游戏。7. 从语法到思维while与pass背后的编程哲学回顾整篇文章while和pass这两个语句一个代表“持续的行动”一个代表“刻意的静止”它们共同揭示了编程中一些更深层的思维模式。while循环教会我们的是基于状态的持续响应。现实世界中的很多过程——无论是等待用户点击、监听网络端口、监控传感器数据还是游戏中的每一帧渲染——都不是一步到位的它们是一个持续的、条件驱动的循环。while就是将这种“等待-检查-执行”的模式抽象成了简洁的语法。理解while就是理解如何将动态的、不确定长度的过程转化为清晰的、可控制的代码逻辑。它要求我们明确循环的不变式什么条件必须一直为真和终止条件什么情况下必须停止这是构建健壮程序的关键。而pass语句则体现了一种渐进式开发和接口先行的智慧。在复杂的项目开始时我们很难一下子写出所有完美的实现。pass允许我们先把骨架搭起来定义好模块、类、函数的边界和接口确保代码在结构上是完整且可运行的然后再去填充血肉。它也是一种“诚实”的标记明确告诉阅读者“这里暂时是空的但我知道它应该存在”。在团队协作中这比留下一段注释掉的代码或者一个会抛出NotImplementedError的方法更清晰、更安全。在实际编码中我个人的习惯是在构思算法或处理流程时先画出逻辑草图明确哪里需要用while来处理不确定的循环在定义类或复杂函数时先写下所有必要的方法签名和文档字符串用pass占位再逐个击破实现。对于while循环我几乎总会先写下循环的终止条件并思考“这个条件在循环体内会被改变吗”以此避免无限循环的坑。对于pass我通常会紧随一个# TODO注释说明未来的实现意图。最后关于那个经典的面试题“如何用Python实现一个单链表的逆序”其核心就是一个while循环遍历节点。理解了while对“未知长度序列”的遍历能力以及如何通过临时变量交换节点指针这道题就迎刃而解了。编程语言的语法是有限的但将它们组合起来解决无限问题的思维才是我们持续学习和练习的价值所在。
返回列表