适合使用重复的函数调用来循环遍历 Python 中的某些内容(即列表)吗?
Appropriate to use repeated function calls to loop through something (i.e. a list) in 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)
你的只是递归的一个例子。
问题和答案都处于临界状态 opinion-based,但在大多数情况下,您更喜欢迭代解决方案(循环)而不是递归,除非递归解决方案具有更简单或更易于理解的明显优势在代码和推理中。
由于各种原因,Python没有像tail call and creates a new stack frame for each new level (or function call). That, and more, are reasons an iterative solution would generally be faster and why the overhead of extra recursive calls in Python is rather large - it takes more memory for the stack and spends more time creating those frames. On top of all, there is a limit to the recursion depth这样的递归优化,大多数递归算法都可以很容易地转换为迭代解决方案。
您的具体示例很简单,可以像这样转换:
while my_list:
while my_list[0] != "finished":
# do stuff
my_list.pop(0)
附带说明一下,请不要 pop(0)
而是使用 collections.deque
,因为它是 O(1)
而不是 O(N)
。
假设我有以下 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)
你的只是递归的一个例子。
问题和答案都处于临界状态 opinion-based,但在大多数情况下,您更喜欢迭代解决方案(循环)而不是递归,除非递归解决方案具有更简单或更易于理解的明显优势在代码和推理中。
由于各种原因,Python没有像tail call and creates a new stack frame for each new level (or function call). That, and more, are reasons an iterative solution would generally be faster and why the overhead of extra recursive calls in Python is rather large - it takes more memory for the stack and spends more time creating those frames. On top of all, there is a limit to the recursion depth这样的递归优化,大多数递归算法都可以很容易地转换为迭代解决方案。
您的具体示例很简单,可以像这样转换:
while my_list:
while my_list[0] != "finished":
# do stuff
my_list.pop(0)
附带说明一下,请不要 pop(0)
而是使用 collections.deque
,因为它是 O(1)
而不是 O(N)
。