微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python-将函数的顺序随机化

如何解决Python-将函数的顺序随机化

我正在编写一个具有许多功能代码,这些功能是稍后将它们显示在屏幕上的步骤。有没有一种方法可以随机哪个组首先开始,然后所有后续步骤分别被随机?为您提供更多背景信息:

我们有两组(A和B),每组由几个功能组成(将它们想象成一个游戏的步骤)。如您所见,我们从A组的第1步开始,然后继续进行B组的第1步,依此类推。 :

for i in range(x):
     functionA1():
     functionB1():
     functionA2():
     functionB2():
....

因此,想法是游戏开始,并且A和B组之间的步骤是交替的。 有没有办法让A组或B组随机开始,然后连续的步骤也改变了?因此,这是一个选项(上面的一个),而另一个随机选择的选项:

for i in range(x):
     functionB1():
     functionA1():
     functionB2():
     functionA2():
....

由于功能列表非常广泛,我真的想避免只在代码中写下两个可能的选项。

感谢您的帮助!

解决方法

一个选项类似于:

def functionA1():
    print('A1')
def functionA2():
    print('A2')
def functionA3():
    print('A3')
def functionB1():
    print('B1')
def functionB2():
    print('B2')
def functionB3():
    print('B3')

groupA = (functionA1,functionA2,functionA3)
groupB = (functionB1,functionB2,functionB3)
groups = [groupA,groupB]
import random
random.shuffle(groups)
for function1,function2 in zip(*groups):
    function1()
    function2()

输出

B1
A1
B2
A2
B3
A3

此外-如果有两个以上的组,则最好执行以下操作:

for functions in zip(*groups):
    for my_function in functions:
        my_function()

通过这种方法,可以轻松地将其扩展为大量的组,而无需更改代码的那一部分。

,

要保持级别顺序,您可以分别对其进行随机排序。

您可以将职能视为头等公民。

import random

lst = [["a1","b1"],["a2",'b2']]

for el in lst:
    random.shuffle(el)
print(ch)

示例输出:

[['a1','b1'],['b2','a2']]
,

类似这样的东西:

from random import shuffle

functions = ([functionA1,functionB1],[functionA2,functionB2])
for i in range(x):
     for group in functions:
         shuffle(group)
         for func in group:
             func()
,

如果您有很多功能,最好以某种方式组织它们。例如在单独的模块中:

# file group_a.py
def function1():
    print("A1")
# file group_b.by
def function1():
    print("B1")
# file main.py
import group_a
import group_b
import random

first,second = random.sample((group_a,group_b),k=2)

for i in range(1,x):
    getattr(first,f"function{i}")()
    getattr(second,f"function{i}")()

如果函数的命名方案是这样的,则可以使用getattr查找正确的函数。

如果它们具有任意名称,则需要在每个模块中创建一个列表,并按正确的顺序排列功能。然后,这将与buran的答案类似。

,

以下内容可以扩展到任意数量的组和功能。将说明三组。

from random import randrange

def rotate(arr,r):
    '  Roates an array '
    return arr[r:] + arr[:r]

# Generate groups of functions
n = 4  # number of functions in a group
groupA = [lambda i = i: f'A{i}' for i in range(1,n+1)]
groupB = [lambda i = i: f'B{i}' for i in range(1,n+1)]
groupC = [lambda i = i: f'C{i}' for i in range(1,n+1)]


# Random starting index (i.e. 0 to n-1)
index = randrange(0,n)

# Create function selections (rotate based upon index)
selection = [rotate(x,index) for x in zip(groupA,groupB,groupC)]
for funcs in selection:
    for f in funcs:
        print(f())

输出

示例1:

B1
C1
A1
B2
C2
A2
B3
C3
A3
B4
C4
A4

例如2

A1
B1
C1
A2
B2
C2
A3
B3
C3
A4
B4
C4

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。