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

我想知道如何在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
      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.