2016-11-23 223 views
0

我想編寫一個函數來比較兩個值val1和val2,並且如果val1大於val2,請向a_points添加1個點(將其想像爲團隊A),反之亦然(如果val2較大,則向b_points添加一個點。) 如果這兩個值都是偶數,我不會將任何點添加到a_points或b_points。Python - 函數不返回值

我的問題是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.

+0

如您的可視化所示,函數內部的「a_points」和「b_points」與全局變量不同。因此,在函數內修改它們將不會修改全局函數。您可能對'global'關鍵字(又名add'global a_points,b_points')或'return'關鍵字感興趣。 – xZise

回答

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

我認爲塞巴斯蒂安認爲這是最好的解決方案,所以返回這兩個值。這種方式的功能總是相同的輸出。我只在函數的末尾放置了一個'return(a_points,b_points)',並刪除了'elif'語句,但這些只是一些小增強(如剛剛發佈的Gormador) –

+0

非常容易理解。謝謝! –

-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 
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 
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)聲明末尾

1

這將簡化您的代碼和邏輯。並使其工作;-)

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 

    elif val2 > val1: 
     b_points+=1 

    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

全局變量一般都是壞主意。除非你真的需要,否則不要使用它們。

實現這種計數器的正確方法是使用一個類。

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,所以她不能使用回價值的任何有意義的方式。

+0

這完全是我想要做的!我**曾嘗試過把它變成一個班級,但我失敗了,然後發生了上述問題,我覺得最好保持簡單。非常感謝! –

+0

@KristenHuber如果您發現它有幫助,您可以點讚我的答案。 – alexanderlukanin13

0

你的問題是,Python整數是不可變的,這通常是很好的閱讀。更多的細節可以參見here

現在,關於解決方案:

  1. 至於建議,你可以使用global變量。請記住,這通常被認爲是不好的做法,因爲它會導致雜亂的代碼...但global s在編程中有自己的位置。

  2. 也有人,你可以隨時返回既a_pointsb_points

  3. 使用list s到不斷得分:

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

輸出(visualize

eq=1, A=1, B=1 

希望它有幫助