Python 从列表中随机选择函数并测试它是哪个函数时的奇怪行为
假设我有两个函数:Python 从列表中随机选择函数并测试它是哪个函数时的奇怪行为,python,random,Python,Random,假设我有两个函数: def f1(): pass def f2(): pass def function1_and_something(): function1() #Do something def function2_and_something_else(): function2() #Do something else random.choice([function1_and_something, function2_and_some
def f1():
pass
def f2():
pass
def function1_and_something():
function1()
#Do something
def function2_and_something_else():
function2()
#Do something else
random.choice([function1_and_something, function2_and_something_else])() # chose and call
如果我想随机运行这两个函数中的一个,我可以这样做:
flist = (f1, f2)
function = random.choice(flist)()
不幸的是,当我想测试哪个函数使用的是if语句时
if function == f1:
print "Good"
良好
未输出。为什么?在不知道函数是什么或您想要做什么的情况下,我只是将它们设置为字符串,以说明如何使用random.choice和比较值
import random
list_thing = ["function1", "function2"]
var = random.choice(list_thing)
if var == "function1":
print "var is equal function1"
elif var == "function2":
print "var is equal to function12"
正如roippi所评论的,您的两个代码块在
var
中存储不同的值。在第一个版本中,您将存储在var
中选择的函数(当您使用var()
调用它时,您将放弃返回值)。在第二个块中,您在选择函数后立即调用该函数,并且var
会被分配函数的返回值(这可能会使您与函数的比较没有用处)
第二个代码块相当于第一个代码块的修改版本:
list_thing = [function1, function2]
var = random.choice(list_thing)
var2 = var() # call the chosen function, and save its return value as var2
if var2 == function1: # compare against var2, rather than var here
#Do something
elif var2 == function2: # here too
#Do something else
除非您的函数可以返回它们自己(或彼此),否则代码的第二个版本可能不是您想要的。如果不知道函数的作用,或者您的#do something
块的意思,就很难说出您应该做什么。我认为,另一种方法是将函数调用与另一个函数中的#something
一起打包,然后在包装函数之间进行选择:
def f1():
pass
def f2():
pass
def function1_and_something():
function1()
#Do something
def function2_and_something_else():
function2()
#Do something else
random.choice([function1_and_something, function2_and_something_else])() # chose and call
你需要给出一个例子来说明什么是
list\u thing
以及它里面是什么。用if或while来显示列表和代码。如果var=random,你是否尝试执行choice(list\u thing)(
?@user2357112我已经编辑了我的问题,希望它现在更有意义。这两个代码片段做的事情不同var
在第一个代码段中绑定到函数对象,在第二个代码段中绑定到var
的返回值。我认为这个答案不是很有帮助(尽管提问者可能不同意我的观点)。问题中非工作代码的问题是,var
获取的是所选函数的返回值,而不是工作版本中的函数本身。OP想要什么并不十分清楚,您可以从他的语法错误中看到,如var=random.choice(list_thing)()
他需要在做其他事情之前,先向他展示如何使用正确的语法。嗯,我的观点是,random.choice(list_thing)(
不一定是一个错误。如果该列表是函数列表,则该表达式将选择一个函数并调用它(不带参数)。问题似乎是表达式的值是函数的返回值,而不是函数本身(因此您无法有效地将var
与函数进行比较)。我知道random.choice(list_thing)(
不一定是一个错误,而是OP使用var()的事实
和如果var==function1:
也让我觉得他不确定自己在做什么是合乎逻辑的。好吧,你肯定是对的,提问者想要什么并不很清楚。我们的辩论促使我作出自己的回答。希望在我们的两个答案之间,这个问题能够得到充分的理解和解决!