Python——函数不返回值
我想编写一个函数来比较两个值,val1和val2,如果val1大于val2,则向a_点添加1点(就像团队a一样),反之亦然(如果val2大于b_点,则向b_点添加一点) 如果这两个值是偶数,我将不向a_点或b_点添加任何点 我的问题是测试值不会返回a\u点或b\u点的值。Python——函数不返回值,python,python-3.x,Python,Python 3.x,我想编写一个函数来比较两个值,val1和val2,如果val1大于val2,则向a_点添加1点(就像团队a一样),反之亦然(如果val2大于b_点,则向b_点添加一点) 如果这两个值是偶数,我将不向a_点或b_点添加任何点 我的问题是测试值不会返回a\u点或b\u点的值。 a_points=0 b_points=0 def test_val(a_points,b_points,val1,val2): if val1 > val2: a_points+=1
a_points=0
b_points=0
def test_val(a_points,b_points,val1,val2):
if val1 > val2:
a_points+=1
return a_points
elif val2 > val1:
b_points+=1
return b_points
elif val1==val2:
pass
请注意,
a_点
和b_点
会隐藏全局变量,因为它们也是作为参数传递的
无论如何,如果相等,则不返回值,而是返回值,而不是pass
def test_val(a_points,b_points,val1,val2):
if val1 > val2:
a_points+=1
return a_points
elif val2 > val1:
b_points+=1
return b_points
elif val1==val2:
return a_points
考虑这一点:
a0=5
a1=6
a2=7
b0=3
b1=6
b2=10
a_points=0
b_points=0
def test_val(a_points, b_points, val1, val2):
if val1 > val2:
a_points += 1
return (a_points, b_points)
elif val2 > val1:
b_points += 1
return (a_points, b_points)
elif val1==val2:
return (a_points, b_points)
a_points, b_points = test_val(a_points,b_points, a0, b0)
a_points, b_points = test_val(a_points,b_points, a1, b1)
a_points, b_points = test_val(a_points,b_points, a2, b2)
print(a_points, b_points)
祝你好运
print (test_val(a_points,b_points,1,2))
print (test_val(a_points,b_points,2,1))
print (test_val(a_points,b_points,2,2))
这将给您一个结果:
1
1
None
因此,您不应该查看返回值的函数,而是更新变量a_points和b_points的值。这就是为什么在您共享的链接中,代码在末尾包含一个
打印(a_点,b_点)
语句的原因这将简化您的代码和逻辑。并使其发挥作用;-)
全局变量通常是一个坏主意。除非你真的需要,否则不要使用它们 实现此类计数器的正确方法是使用类
class MyCounter(object):
def __init__(self):
self.a_points = 0
self.b_points = 0
def test_val(self, val1, val2):
if val1 > val2:
self.a_points += 1
elif val2 > val1:
self.b_points += 1
else:
pass
counter = MyCounter()
counter.test_val(1, 2)
counter.test_val(1, 3)
counter.test_val(5, 3)
print(counter.a_points, counter.b_points)
输出:
(1, 2)
请注意,从
test\u val
返回一个值是没有意义的,因为调用者无法知道她是获得a\u点
还是b\u点
,所以她不能以任何有意义的方式使用返回值。您的问题是Python整数是不可变的,这通常是值得一读的。可以找到更多的细节
现在,关于解决方案:
全局
变量。请记住,这通常被认为是不好的做法,因为它会导致混乱的代码。。。但是global
s在编程中占有一席之地a_点
和b_点
list
s记录分数:
将返回0、1或2,其中0表示相等,1表示第一个参数较大,2表示第二个参数较大test\u val
- 您的主脚本将有一个包含上述索引的列表,其中将“保留分数”
a0=5
a1=6
a2=7
b0=3
b1=6
b2=10
points=[0, 0, 0]
def test_val(val1,val2):
if val1 > val2:
return 1
elif val2 > val1:
return 2
elif val1==val2:
return 0
points[test_val(a0,b0)] += 1
points[test_val(a1,b1)] += 1
points[test_val(a2,b2)] += 1
print("eq=%d, A=%d, B=%d" % (points[0], points[1], points[2]))
输出()
希望有帮助如您的可视化所示,函数中的
a_点
和b_点
与全局变量不同。因此,在函数中修改它们不会修改全局函数。您可能对global
关键字(也称为addglobal a_points,b_points
)或return
关键字感兴趣。我认为按照Sebastian的建议返回这两个值是最好的解决方案。这样,函数的输出总是相同的。我只想在函数的末尾放一个return(a_points,b_points)
,然后删除elif
语句,但这些只是很容易理解的小改进(正如戈尔马多刚刚发布的)。非常感谢。这正是我想做的!我以前试着把它编入一个班级,但我失败了,然后出现了上面提到的问题,我觉得最好保持简单。非常感谢你@如果你觉得我的答案有帮助的话,你可以投我一票。
(1, 2)
a0=5
a1=6
a2=7
b0=3
b1=6
b2=10
points=[0, 0, 0]
def test_val(val1,val2):
if val1 > val2:
return 1
elif val2 > val1:
return 2
elif val1==val2:
return 0
points[test_val(a0,b0)] += 1
points[test_val(a1,b1)] += 1
points[test_val(a2,b2)] += 1
print("eq=%d, A=%d, B=%d" % (points[0], points[1], points[2]))
eq=1, A=1, B=1