Python:生成与输入同名的变量的函数
对于可能出现的标题混淆,我深表歉意。我将尽力说明我的问题 背景: 我刚刚完成了一个有趣的编码问题,在这个问题上,我被要求编写一个函数来简化方向列表 输入看起来像Python:生成与输入同名的变量的函数,python,function,Python,Function,对于可能出现的标题混淆,我深表歉意。我将尽力说明我的问题 背景: 我刚刚完成了一个有趣的编码问题,在这个问题上,我被要求编写一个函数来简化方向列表 输入看起来像[“北”、“南”、“南”、“东”、“西”、“北”、“西”] 相邻的“南”“北”和“东”“西”都应删除,因为向北然后立即向南是没有意义的。清单应该简化,直到不能再简化为止 例如: ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] 应简化为 ['WEST'] Dumm
[“北”、“南”、“南”、“东”、“西”、“北”、“西”]
相邻的“南”“北”
和“东”“西”
都应删除,因为向北然后立即向南是没有意义的。清单应该简化,直到不能再简化为止
例如:
["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
应简化为
['WEST']
Dummy OP编写了一个笨拙的函数来实现它。但我的问题是关于其他人发布的一个非常聪明的答案
代码:
def dirreduce(arr):
dir=”“.加入(arr)
目录2=目录替换(“南北”)。替换(“南北”)。替换(“东西”)。替换(“东西”)。替换(“东西”)
dir3=dir2.split()
如果len(dir3)
我玩过它,看到了它的工作原理,但就是不知道它是如何工作的
我看到在return语句中,它应该再次运行,除非结果的长度与输入的长度相同,这是可以理解的。但是代码使用了dirreduce(dir3)
,这在我看来是错误的
如果我运行dirreduce(dir3)
,那么我的输入将是dir3
,但是在函数的框架内,会创建另一个dir3
。因此,现在当函数转到最终返回语句时,如果len(dir3)len(dir3)==len(dir3)”,它只会返回dir3`
据我所知,该函数将运行两次,每次输入最多运行一次,这不是事实。那么我的理解哪一部分是错误的呢
抱歉这么多的话,我想这毕竟是个简单的问题。肯定有一件非常基本的事情我弄错了。不同堆栈帧中的局部变量彼此完全不相关,即使它们共享相同的名称。每个递归调用都会创建一个新的堆栈帧,因此一个调用中的dir3
与另一个调用中的dir3
完全不同
假设您有一个非递归函数,它只将路径减少了一步:
def dirReducOneStep(arr):
dir = " ".join(arr)
dir2 = dir.replace("NORTH SOUTH",'').replace("SOUTH NORTH",'').replace("EAST WEST",'').replace("WEST EAST",'')
dir3 = dir2.split()
return dir3
print(dirReducOneStep(dirReducOneStep(dirReducOneStep(path))))
唯一的区别是dirreduce
在简化的路径上调用自身,而不是强制调用方决定是否在以前的输出中再次调用它。不同堆栈帧中的局部变量彼此完全无关,即使它们共享相同的名称。每个递归调用都会创建一个新的堆栈帧,因此一个调用中的dir3
与另一个调用中的dir3
完全不同
假设您有一个非递归函数,它只将路径减少了一步:
def dirReducOneStep(arr):
dir = " ".join(arr)
dir2 = dir.replace("NORTH SOUTH",'').replace("SOUTH NORTH",'').replace("EAST WEST",'').replace("WEST EAST",'')
dir3 = dir2.split()
return dir3
print(dirReducOneStep(dirReducOneStep(dirReducOneStep(path))))
唯一的区别是,dirreduce
在简化的路径上调用自己,而不是强迫调用方决定是否在以前的输出中再次调用它。这是一个基本概念。每个函数都有自己的堆栈,或者说作用域
你可以想象一个函数是一个盒子。局部变量在框内。如果有很多函数,那么就有很多盒子。每个盒子都有自己的局部变量。这就像:
BoxA
--variable_a
BoxB
--varibale_a
虽然这两个变量的名称相同,但它们位于不同的框中。因此,它们完全不同
此外,BoxA(实际上是functionA)无法访问BoxB中的变量_a,它超出了它的范围,因此即使这两个变量具有相同的名称也是安全的。这是一个基本概念。每个函数都有自己的堆栈,或者说作用域
你可以想象一个函数是一个盒子。局部变量在框内。如果有很多函数,那么就有很多盒子。每个盒子都有自己的局部变量。这就像:
BoxA
--variable_a
BoxB
--varibale_a
虽然这两个变量的名称相同,但它们位于不同的框中。因此,它们完全不同
此外,BoxA(实际上是function)无法访问BoxB中的变量_a,它超出了它的范围,因此即使这两个变量具有相同的名称也是安全的。dir3
是每个函数执行的局部变量,它们彼此无关。@juanpa.arrivillaga感谢您的快速响应。请你详细说明一下好吗。函数内部生成的dir3
是局部变量吗?哪个与哪个无关?当return语句计算len(dir3)
时,它不是已经被更改为局部变量了吗?对于['NORTH'、'WEST'、'SOUTH']
@kyrill,此解决方案失败,因为它们只有在彼此相邻时才会被删除。抱歉说得不够清楚。这很无聊:)dir3
是每个函数执行的局部变量,它们彼此无关。@juanpa.arrivillaga感谢您的快速响应。请你详细说明一下好吗。函数内部生成的dir3
是局部变量吗?哪个与哪个无关?当return语句计算len(dir3)
时,它不是已经被更改为局部变量了吗?对于['NORTH'、'WEST'、'SOUTH']
@kyrill,此解决方案失败,因为它们只有在彼此相邻时才会被删除。抱歉说得不够清楚。那太无聊了:)我认为第二个问题其实没那么有趣。其最优解在}(n)时间和}(logn)辅助空间中运行。然而,原始问题的给定解决方案需要ц(n^2)时间,尽管只有ц(1)空间(假设尾部调用优化,Python的情况并非如此,因此实际上是ц(n)空间)。另一种解决方案需要}(n)时间和ц(n)空间(以维持堆栈)