Python 不是继续,而是重新运行函数
我想知道如何在Python中执行以下操作。 如果我有一个带有Python 不是继续,而是重新运行函数,python,for-loop,Python,For Loop,我想知道如何在Python中执行以下操作。 如果我有一个带有for循环的函数,可以使用If语句跳过某些数字 这是从activestate.com获得的fisher yates d的一个实现 import random def shuffle(ary): a=len(ary) b=a-1 for d in range(b,0,-1): e=random.randint(0,d) if e == d: continue
for
循环的函数,可以使用If语句跳过某些数字
这是从activestate.com获得的fisher yates d的一个实现
import random
def shuffle(ary):
a=len(ary)
b=a-1
for d in range(b,0,-1):
e=random.randint(0,d)
if e == d:
continue
ary[d],ary[e]=ary[e],ary[d]
return ary
现在continue
直接转到d的下一个值。如何使用原始参数ari
,而不是执行continue
,重新运行函数
请注意,该函数只是一些示例代码,我很好奇一般如何做到这一点。
此外,如果列表很大,则可能无法维护阵列的副本,因此这并不是一个真正的解决方案
def function(list):
len(list)-1
for i in range(len(list)-1,0,-1):
e= randint(0,i)
while e > i:
e= randint(0,i)
"do something to the list"
return array
这是一种常见的递归模式。但是,您的情况与通常情况略有不同,因为在这里,如果洗牌失败,您需要制作一份输入列表副本,以便在递归时使用
import random
def shuffle(ary):
initial = ary[:]
a=len(ary)
b=a-1
for d in range(b,0,-1):
e=random.randint(0,d)
if e == d:
return shuffle(initial)
ary[d],ary[e]=ary[e],ary[d]
return ary
ary = [1,2,3,4,5,6]
print shuffle(ary)
还要注意
来自随机导入范围
def卫星轨道(项目):
i=长度(项目)
当i>1时:
i=i-1
j=randrange(i)#0您可以将参数复制到临时变量中。然后使用temp变量调用函数并使用return
def function(list):
listCopy = list;
len(list)-1
for i in range(len(list)-1,0,-1):
e= randint(0,i)
if e > i:
return function(listCopy)
else
"do something with the list"
return array
不完全是你要的。只是想提醒您这一可能性。列表未进行适当编辑…是否要在“重新启动”函数后继续原始循环?也就是说,您是想进行递归,还是只想中止当前函数并重新开始?@gioi我假设列表将在“对列表执行某些操作”部分中进行编辑。您对else
分支中的列表到底做了什么?添加/删除元素?哪一个?我发现了一个与我写的代码非常接近的例子。这是Fisher-Yates shuffle的一个实现。我已经在开始的帖子中更新了代码。如果list
将被更改,那么listCopy
也将被更改。顺便问一下,那些分号是什么?@poke:没错,你可以使用listCopy=list(list)
创建一个真正的新列表,但从内存角度来看,这不是一个好主意。不,这不起作用。如果我将ari=[1,2,3,4,5,6]
替换为continue
为return shuffle(ari)
我会得到结果[5,3,6,4,2,1]
。我不认为应该发生这种情况,因为4
仍然在同一个位置,如果我正确理解了代码,则不应该发生这种情况。请注意,示例代码已更改为我刚找到的实现,但问题是相同的。从我所看到的情况来看,问题仍然是返回shuffle(ary)的问题
您正在使用已修改的ary
重新运行shuffle()
。这不是我要寻找的行为。@Mythio——我直到一分钟前才看到你的更新代码。看我的更新。谢谢,我来看看卫星算法。但是,您提供的解决方案意味着保留原始阵列的副本。我想知道是否有可能避免这种情况,例如因为内存限制。可能吗?
from random import randrange
def FisherYates(items):
i = len(items)
while i > 1:
i = i - 1
j = randrange(i+1) # 0 <= j <= i
items[j], items[i] = items[i], items[j]
return
def function(list):
listCopy = list;
len(list)-1
for i in range(len(list)-1,0,-1):
e= randint(0,i)
if e > i:
return function(listCopy)
else
"do something with the list"
return array
def function(list):
for i in (a for a in range(len(list)-1,0,-1) if randint(0,a) > a):
#do something with list
#do something else with remainder.