2013-11-29 24 views
-1

這裏更換他們是我的代碼:Python是不承認我的變量,而是以零

change = 0 
count = 0 
value = 0 
answer = 0 

def numberTest(): 
    if change == 0: 
     skip() 
    else: 
     value = change 

def skip(): 
    count + 1 
    number = value 
    # Check if the input is valid 
    if value != number: 
     print('PLEASE ENTER A VALID NUMBER!!!') 
    else: 
     Even = number % 2 
    if Even == 0: 
     print('Substituting even number in: x/2') 
     print('%s/2=' % number) 
     answer = number/2 
    else: 
     print('Substituting odd number in: 3x + 1') 
     print('3' + number + ' + 1=') 
     answer = number * 3 
     answer = answer + 1 
    answer = str(answer) 
    print(''+ answer +'') 
    if answer == 1: 
     finalValue() 
    else: 
     check() 

def check(): 
    value = answer 
    skip() 

def loop(): 
    value = int(input('Input a number: ')) 
    change = value 
    skip() 
loop() 


def finalValue(): 
    print('The number (' + change + ') returned as 1.') 
    print('A total of (' + count + ') commands were executed.') 
    change = change + 1 
    count = 0 
    print('') 
    print('') 
    print('') 
    numberTest() 

每當我開始的代碼,我被要求輸入一個數字(如預期),但隨後出現這種情況:

Input a number: 1 
Substituting even number in: x/2 
0/2= 
0.0 

我真的不明白爲什麼程序無法正常工作如我所料,但代碼中的一個部分,我懷疑:

value = int(input('Input a number: ')) 

我也這樣寫我自己,我是新來的Python,我只先前批工作,所以轉換是很容易,但我不是很熟悉的一些命令......

編輯 我期望程序要做的是要求一個數字,存儲這個數字,然後運行它通過一系列測試,但是當數字到達實際測試時,它會用「x」代替「0」,即使我輸入一個數字,如「54656」。也許,當它要求輸入號碼時,我輸入號碼時,它只是不能正確存儲,或者我的代碼有問題...

+0

如果這是你想要的,'skip()'方法的第一行不會遞增'count'。 – PepperoniPizza

+0

這裏有很多混亂,你甚至不需要一半的變量。 – aIKid

+0

好吧,正如我所說的,我是Python的新手,跟蹤所有變量並且仍然有一個工作腳本是具有挑戰性的 – TechnologicalGenious

回答

1

您正試圖改變全局變量沒有聲明:

a = 'bad' 

def bad_fn(): 
    a = 'good' 
bad_fn() 
print('bad_fn() is'+a) 

def good_fn(): 
    global a 
    a = 'good' 
good_fn() 
print('good_fn() is'+a) 

結果

bad_fn() is bad 
good_fn() is good 

一般來說,在不好的做法,使用全局變量。顯式地傳遞參數使得調試和代碼重用遠不如頭痛。這裏被重寫代碼的版本應該是比較容易理解:

# Test the Collatz conjecture: 
# http://en.wikipedia.org/wiki/Collatz_conjecture 
import profile 

# Python 2/3 compatibility shim 
import sys 
if sys.hexversion >= 0x3000000: 
    # Python 3.x 
    inp = input 
    rng = range 
else: 
    # Python 2.x 
    inp = raw_input 
    rng = xrange 

# cache of already-seen values 
seen = set([1]) 

def test(n): 
    visited = set() 
    while True: 
     if n in seen:    # Ran into an already-seen chain that goes to 1 
      seen.update(visited) 
      return len(visited) 
     elif n in visited:  # Closed loop! this should never happen 
      print('Loop found at n = {}'.format(n)) 
      return None 
     else: 
      visited.add(n) 

     if n % 2:   # n is odd? 
      n = 3*n + 1 
     else: 
      n //= 2 

def do_profile(upto=1000000): 
    prof = profile.Profile() 
    prof.run('for n in rng(2, {}): test(n)'.format(upto)) 
    prof.print_stats() 

def main(): 
    while True: 
     try: 
      n = int(inp('Enter a number to test (or x to exit): ')) 
     except ValueError: 
      break 

     res = test(n) 
     if res is None: 
      print("Well, that's odd...") 
     else: 
      print("Chain terminated after {} values were tested".format(res)) 

if __name__=="__main__": 
    main() 

花了我的機器上17.7s運行do_profile(1000000)。它總共查看了2,168,611個數字,其中最高的是56,991,483,520。沒有找到循環。

編輯:我已經添加了inp()填充函數;代碼現在應該在兩者的Python 2或Python 3.

EDIT2運行:移動的取樣代碼到主代碼列表和添加範圍/ x範圍到Python的2/3墊片。

+0

這是針對Python 2還是3,我運行Python 3.3? – TechnologicalGenious

+0

當我運行你的代碼的測試部分時,我得到這個錯誤信息:'NameError:name'xrange'未定義'然後我從'xrange'中刪除'x',但是然後我得到這個消息:'NameError:名稱'測試'未定義' – TechnologicalGenious

+0

@TechnologicalGenious:我在Python 2.7.5中編寫並測試了它。 Python 3需要input()而不是raw_input()。我已經添加了翻譯墊片以使其適用於任何一種。 –

1

如果要更改全局變量,則需要聲明它在你前面的功能由global,即:

value = 0 

def changeValue(): 
    global value 
    value += 1 

如果沒有需要改變的變量,不需要global

+0

是的,我知道這一點,但我沒有改變變量,我要求一個數字,用'value'表示,然後將一個完全獨立的變量設置爲'value'的值。 – TechnologicalGenious

+1

@TechnologicalGenious在你的第一個函數中,你實際上正試圖改變這個變量。我沒看完你的整個問題,因爲我現在沒有時間,但我注意到了...... –