python - 尝试减少重复性 - 除了
问题描述
我想知道如何压缩这段代码:
def chain_reaction(map, coord):
explosion = map[coord[0]][coord[1]]
map[coord[0]][coord[1]] = 0
for i in range(1, explosion + 1):
try:
if map[coord[0] + i][coord[1]] != 0:
chain_reaction(map, (coord[0] + i, coord[1]))
except IndexError:
pass
try:
if map[coord[0] - i][coord[1]] != 0:
chain_reaction(map, (coord[0] - i, coord[1]))
except IndexError:
pass
try:
if map[coord[0]][coord[1] + i] != 0:
chain_reaction(map, (coord[0],coord[1] + i))
except IndexError:
pass
try:
if map[coord[0]][coord[1] - i] != 0:
chain_reaction(map, (coord[0], coord[1] - i))
except IndexError:
pass
try:
map[coord[0] + i][coord[1]], map[coord[0] - i][coord[1]] = 0, 0
map[coord[0]][coord[1] + i], map[coord[0]][coord[1] - i] = 0, 0
except IndexError:
pass
return map
map = [[0,1,0,2], [3,0,1,1], [0,1,0,1], [0,0,2,0], [1,0,0,0]]
chain_reaction(map, (3,2))
该脚本的目标是在给定地图的情况下模拟爆炸的连锁反应,其中任何正整数都是炸弹,其值是其大小。如果爆炸击中另一颗炸弹,则会导致该炸弹爆炸。
我们还将第一次爆炸作为坐标。
我的主要问题是我似乎无法找到一种仅使用 try - except 工具而不在每种情况下都使用它的方法。
PS这是一个老考试题,我们被告知我们不能导入任何模块,我们将根据效率评分
解决方案
异常处理应该保留给......好吧......异常。如果您的常规控制流依赖于异常,那么您可能做错了什么*。
除了访问a[x]
和检查异常,您还可以首先检查 if x < len(a)
,即 ifx
是一个有效值。尝试从那里重写您的代码。
作为循环的一部分,有多种方法可以查看所有四个方向,但我认为这些方法不一定会使代码更易于阅读。
*) 一旦你开始超越这个相对简单的代码,它就会变得更加复杂。Python 与许多其他语言的不同之处在于它主动使用异常来进行流控制。现在,我会尽量远离他们,一旦你更熟悉这种语言,我就会重新访问链接。
推荐阅读
- swift - 在 Core Data 可转换字符串数组上返回匹配项的 Swift 谓词
- python - 带有日期时间函数的循环将不起作用
- node.js - Nginx 从 POST 请求中删除文件
- html - HTML图像消失,不加载
- python - 根据它们在python中的最后两个字符来分隔单词
- firebase - 如何录制语音并将它们存储到颤动的firebase存储中?
- flutter - 生成错误不适用于 AsyncBuilder
- kubernetes - Kubernetes 读取 pod 日志 API 中的 `previous` 参数的作用是什么?
- c - mkfifo 不制作 FIFO 特殊文件
- c++ - 什么是 C++ 中的“struct* struct newStruct(int somedata) { }”语法