适合在 Python 中使用重复的函数调用来循环遍历某些东西(即列表)吗?

罗夫茂

假设我有以下 Python 脚本:

def pop_and_loop():
    my_list.pop(0)
    my_func()

def my_func():
    #do something with list item [0]
    if my_list[0] finished_with:
        pop_and_loop()
    #continued actions if not finished with
    if my_list[0] finished_with:
        pop_and_loop()

my_list = [#list containing 100 items]
my_func()

这是一个合适的设置吗?因为,我不是让每个函数调用以某种方式打开,因为它必须在我离开函数的位置保持一个标记去另一个,所以理论上它在等我回来,但我从来没有回到那个。这会产生问题吗?您是否有不同的方式来做到这一点?

编辑:我的实际脚本比这更复杂,在处理主列表中的每个项目时,我需要调用许多不同的函数。本质上我的问题是我是否需要将此设置转换为实际循环。请记住,我将需要刷新主列表以再次重新填充它,然后再循环一次。那么我将如何继续循环呢?

我应该改为:

my_list = []

def my_func(item):
    #do something with list item
    if item finished_with:
        return output
    elif item_finished_now:
        return output

while not len(my_list):
    while #there are items to fill the list with:
        #fill list

        for x in my_list:
            output = my_func(x)
            #deal with output and list popping here
    #sleep loop waiting for there to be things to put into the list again
    time.sleep(60)
巴雷尔

你的只是递归的一个例子。

问题和答案都是基于边界意见的,但在大多数情况下,您更喜欢迭代解决方案(循环)而不是递归,除非递归解决方案具有更简单或更容易在代码和推理中理解的明显好处。

由于各种原因,Python 没有任何递归优化,例如尾调用,并为每个新级别(或函数调用)创建一个新的堆栈帧。这就是迭代解决方案通常会更快的原因,以及 Python 中额外递归调用的开销相当大的原因——它需要更多的堆栈内存并花费更多时间来创建这些帧。最重要的是,递归深度是有限制的,大多数递归算法都可以很容易地转换为迭代解决方案。

您的具体示例很简单,可以像这样转换:

while my_list:
    while my_list[0] != "finished":
        # do stuff
    my_list.pop(0)

在旁注中,请不要pop(0)使用 acollections.deque代替,因为它是O(1)代替O(N).

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

适合在 python 中没有达到峰值

哪种迭代构造更适合在Scala中使用?

是否适合在c中使用usleep作为Timer

ReactCSSTransitionGroup只适合在新组件中设置动画吗?

是否适合在 setresuid()/setreuid()/seteuid() 上使用 setuid()?

哪种方法最适合在C中循环递增和遍历

这种继承模式是否适合在其上构建 python 包?

责任链设计模式是否适合在硬件组件上运行的Python解决方案

哪种散列函数更适合在小散列表中表示128位随机ID

适合在rxjava中使用Func0和Action1有什么区别

很好的教程或适合在IOS 7中使用Core.Data

哪种类型的缓存适合在Umbraco项目中使用,如何实现智能缓存?

哪种串行器或适配器最适合在ember js中使用?

Task.Run或TaskFactory.StartNew是否始终不适合在异步方法中使用?

我是否适合在构建系统中使用 shell 脚本而不是 AX_CHECK_COMPILE_FLAG?

CouchDb 是否适合在客户端桌面(Windows 10)上使用?

Vue 3 是否适合在静态对象上使用反应式

哪个文件系统更适合在外部HDD上使用?ExFAT或NTFS?

C ++ STL容器适合在动态有序列表中查找第n个元素吗?

哪种做法最适合在 Angular 中处理 HTML 事件?Angular 事件绑定或 RxJS fromEvent 函数?

哪种方法最适合在JavaScript中创建对象?对象属性之前是否必须使用“ var”?

哪些编解码器最适合在Windows XP上使用Windows Media Player播放?

哪种事件处理程序最适合在VB.net上的Click上使用Data Grid View触发?

使图像适合在javascript中正确显示

使用Python将列表中的重复JSON键值对组合在一起

如何在Python中使图像适合标签

无法在python中使用for循环遍历列表

使用curve_fit适合python

IN子句对我不适合在MySQL中工作