Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python——函数不返回值_Python_Python 3.x - Fatal编程技术网

Python——函数不返回值

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

我想编写一个函数来比较两个值,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
        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记录分数:

    • test\u val
      将返回0、1或2,其中0表示相等,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]))
    
    输出()


    希望有帮助

    如您的可视化所示,函数中的
    a_点
    b_点
    与全局变量不同。因此,在函数中修改它们不会修改全局函数。您可能对
    global
    关键字(也称为add
    global 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