मेरे पास एक फ़ंक्शन है जिसकी रूपरेखा नीचे दी गई है। main() में, मैं किसी एक फ़ंक्शन के दिए गए मानों को वापस करना चाहता हूं लेकिन मैं इसे यादृच्छिक रूप से चुनना चाहता हूं। अभी तक, यह पहले func1 की जांच करता है और तभी आगे बढ़ता है जब func1 is some_val। मैं पहले कभी-कभी func2 को भी जांचने में सक्षम होना चाहता हूं।

मुझे एहसास है कि मैं दोनों कार्यों को कॉल कर सकता हूं, परिणामों के साथ एक सूची बना सकता हूं, और यादृच्छिक रूप से सूची में फेरबदल कर सकता हूं लेकिन func1 और func2 दोनों काफी शामिल हैं, इसलिए प्रदर्शन एक मुद्दा है।

क्या ऐसा करने का कोई साफ तरीका है?

def func1():
    
    ... do things
    
    return val

def func2():
    
    ... do things
    
    return val



def main():
    
    if func1() is not some_val:
        return func1()
    
    elif func2() is not some_val:
        return func2()
    
    else:
        return None
0
NewbieAF 13 जिंदा 2021, 21:14

3 जवाब

सबसे बढ़िया उत्तर

कार्यों की सूची में फेरबदल करें, फिर उस सूची पर पुनरावृति करें, उन्हें एक बार में कॉल करें।

def main():
    functions = [func1, func2, func3]
    random.shuffle(functions)

    for f in functions:
        if (rv := f()) is not some_val:
            return rv

ध्यान दें कि इसके लिए प्रत्येक फ़ंक्शन को समान हस्ताक्षर (और समान तर्क लेने) की आवश्यकता होती है, लेकिन शून्य-तर्क कार्यों की एक सूची बनाने के लिए यह तुच्छ है जो उचित तर्कों के साथ "वास्तविक" फ़ंक्शन को कॉल करते हैं। उदा.,

functions = [lambda: func1(x, y), lambda: func2(z, "hi", 3.14)]
2
chepner 13 जिंदा 2021, 21:20
from random import shuffle

def main(list_of_functions=[func1, func2], *args, **kwargs):
    shuffle(list_of_functions)
    outcomes = []
    for func in list_of_functions:
        outcomes.append(func(*args, **kwargs))
    return outcomes

main()

मान लें कि func1() रिटर्न "hello" और func2() रिटर्न "world"...

>>> main()
["hello", "world"]
>>> main()
["world", "hello"]
>>> main()
["world", "hello"]

बहुत साधारण। आपको बस इतना ही करना है। कार्यों को इस तरह चर के रूप में संग्रहीत किया जा सकता है:

>>> def otherFunc():
...     print("hi")
...
>>> otherFunc()
hi
>>> someFunc = otherFunc
>>> someFunc()
hi
1
BlueStaggo 13 जिंदा 2021, 21:29
import random

def f1():
    print(1)

def f2():
    print(2)

def f3():
    print(3)

listf=[f1,f2,f3]

for i in range(10):
    random_index = random.randrange(0,len(listf))
    listf[random_index]()


नतीजा:

2
2
1
2
1
3
2
3
3
2
0
Mario Abbruscato 13 जिंदा 2021, 21:28