Python - 函数不返回值

时间:2016-11-23 10:48:43

标签: python python-3.x

我想编写一个函数来比较两个值val1和val2,如果val1大于val2,则向a_points添加1个点(将其想象为Team A),反之亦然(如果val2,则向b_points添加一个点)更大。) 如果这两个值是偶数,我将不会向a_points或b_points添加任何点。

我的问题是 test_val不会返回a_points或b_points的值。

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

Here's a link to a visualization showing the problem.

7 个答案:

答案 0 :(得分:2)

考虑一下:

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)
祝你好运!

答案 1 :(得分:1)

这将简化您的代码和逻辑。并使它工作; - )

var serveraddress = "http://" + server + "/token"/*"/Account/LoginMobile"*/;

   doLogin(): void {

                var username = $("#username").val();
                var password = $("#password").val();
                var server = $("#server").val();
                //TODO do validation

                var serveraddress = "http://" + server + "/token"/*"/Account/LoginMobile"*/;

ApiHelper.post(serveraddress, { username: username, password: password, client_id: "VoltPMS.Mobile", client_secret: "voltrun", grant_type: "password" })
                    .done((data) => {
                        Volt.App.clearLoading();
                        if (data) {
                            if (data.access_token) {
                                SessionManager.setSessionItem("loginstatus", "true");
                                SessionManager.setSessionItem("username", username);
                                //SessionManager.setSessionItem("server", server);
                                SessionManager.setSessionItem("access_token", data.access_token);
                                SessionManager.setSessionItem("refresh_token", data.refresh_token);

                                 $("#username").val("");
                                 $("#password").val("");
                                 //$("#server").val("");
                                 Volt.Navigation.navigate("Home", "Home");
                            } else {
                                //TODO Login Error

                            }
                        } else {
                            //TODO Login ERROR
                        }
                    }).error((er) => {
                    Volt.App.clearLoading();    
                    });

答案 2 :(得分:1)

全局变量通常是坏主意。除非你真的需要,否则不要使用它们。

实现此类计数器的正确方法是使用类。

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_val返回值没有意义,因为调用者无法知道她是否获得a_pointsb_points,因此她无法使用返回值以任何有意义的方式。

答案 3 :(得分:0)

a_points=0
b_points=0

def test_val(a_points,b_points,val1,val2):
    global a_points
    global b_points

    if val1 > val2:
        a_points+=1
        return a_points
    elif val2 > val1:
        b_points+=1
        return b_points

    elif val1==val2:
         # If you pass, it won't return a_points nor b_points
         return a_points # or b_points

答案 4 :(得分:0)

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的值。这就是为什么在您共享代码的链接中包含最后的print(a_points,b_points)语句

答案 5 :(得分:0)

你的问题是Python整数是不可变的,一般来说这是很好的阅读。可以找到更多详细信息here

现在,关于解决方案:

  1. 根据建议,您可以使用global个变量。请记住,这通常被视为不良做法,因为它会导致代码混乱......但global在编程中占有一席之地。

  2. 同时建议您随时返回a_pointsb_points

  3. 使用list来保持分数:

    • test_val将返回0,1或2,其中0表示相等,1表示第一个参数较大,2表示第二个参数较大。
    • 你的主脚本将有一个包含上述索引的列表,它将保持得分"
  4. 代码:

    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]))
    

    输出(visualize

    eq=1, A=1, B=1
    

    希望有所帮助

答案 6 :(得分:-2)

请注意,a_pointsb_points会影响您的全局变量,因为它们也会作为参数传递。

任何方式,在平等的情况下,您不返回值,而不是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