我有很长的循环用于重复名称,我希望通过使用函数简化事情,而不是每次都重复匹配的所有附带效果.我从以下测试用例开始,但它不像我期望的那样工作:
x, y = 0, 0
def testFunc(*args):
global x, y
for arg in args:
if arg:
x +=1
else:
y +=1
return (x, y)
Run Code Online (Sandbox Code Playgroud)
当我运行它:
>>>testFunc(x==y,x==y,x==y)
(3,0)
>>>testFunc(x==y)
(3,1)
>>>testFunc(x!=y,x!=y,x!=y)
(3,4)
Run Code Online (Sandbox Code Playgroud)
基本上,在任何操作发生之前,参数似乎都会转换为布尔值.有没有办法避免这种情况?我原以为:
>>>testFunc(x==y,x==y,x==y)
(2,1)
>>>testFunc(x==y)
(2,2)
>>>testFunc(x!=y,x!=y,x!=y)
(4,3)
Run Code Online (Sandbox Code Playgroud)
基本上,在任何操作发生之前,参数似乎都会转换为布尔值.
Python首先在调用函数之前评估参数,因此这是预期的行为.两个人int的平等是一个平等的bool.所以它首先评估x == y三次,每次都产生相同的结果.接下来它调用函数testFunc(True, True, True).
有没有办法避免这种情况?
您可以通过以下方式使其成为可调用的,从而推迟评估:
def testFunc(*args):
global x, y
for arg in args:
if arg(): # we call arg
x +=1
else:
y +=1
return (x, y)Run Code Online (Sandbox Code Playgroud)
然后用以下方法调用它:
>>> eq = lambda: x == y
>>> neq = lambda: x != y
>>> testFunc(eq, eq, eq)
(2, 1)
>>> testFunc(eq)
(2, 2)
>>> testFunc(neq, neq, neq)
(3, 4)
Run Code Online (Sandbox Code Playgroud)
因此我们在这里不传递结果x == y,我们传递一个函数,当被调用时,计算结果x == y.因此,该值是计算x和y此刻的调用时.
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |