這是整個代碼?在循環開始之前,您需要在代碼中的某個位置調用getInteger()
函數。您也不會在任何時候調用功能sqInteger()
。
您的異常處理程序會立即停止評估try
區塊,並在輸入非整數時將其移至except
區塊。因此,您可以在input()
函數之後調用sqInteger()
函數。如果用戶在終端中鍵入非整數,它將向下移動到您的異常處理程序並提示用戶重試。如果他們輸入一個整數,代碼將繼續評估並運行功能sqInteger
。
爲此,您也不需要將getInteger
轉換爲sqInteger()
函數。技術上允許你在Python中傳遞函數作爲參數,但這並不是必要的,也可能超出了本程序的範圍。
所以下面的代碼將是合適的:
def getInteger():
while True:
try:
x = int(input('Enter an integer: '))
# variable 'squared' now receives the return value from the function
squared = sqInteger(x) # call to function sqInteger necessary for this function to be executed
except ValueError:
print('That\'s not an integer. Try again.')
continue
else:
print(x) # if user entered 2, prints 2, not 4
return x # this value is still only what the user input, not the result of sqInteger()
break
def sqInteger(x):
y = x**2
print(y)
return y #you need to return values from functions in order to access it from outside the function
你傳遞變量成函數(作爲一個參數)的原因是爲了得到該函數訪問該變量。創建一個函數爲該函數創建一個本地作用域,以便該函數內命名的變量位於該函數外部的變量的單獨名稱空間中。這在有很多變量可能存在的大型程序中很有用,並且需要將它們分開。
因爲您已經單獨定義了一個sqrt函數,所以它不能訪問其範圍之外的變量。您需要傳入您希望有權訪問的變量。
您還需要在函數運行之前調用函數。定義函數僅用於設置函數,使其可以作爲一個功能單元來調用。這對分離程序中的問題很有用。調用函數的能力非常有用,因爲它允許您將代碼分離出來,只提到對函數的單個調用,而不是將其他代碼中的全部功能混淆在一起。它也允許代碼的可重用性。
您也可以通過返回一個值,該值賦值給一個函數調用,像這樣有機會獲得平方整數結果:
# lets say x = 4
squared = sqInteger(x)
def sqInteger(x):
y = x**2
return y
這是行不通的:
x = input("Enter integer") #lets say you enter 3
squared = sqInteger()
print(squared)
def sqInteger():
print(x) # error: x is not defined
return x**2 # error: x is not defined
該功能無法訪問外部變量,如x
。必須將這些變量作爲參數傳遞,以便您可以調用此函數並隨意設置參數。這是爲了程序中的模塊化。您可以將各種不同的整數作爲參數傳遞給它,並且它允許您在任何時候需要使用一個可重用函數來平方整數。
編輯:對不起,這是一個爛攤子,我終於固定的所有錯誤中,雖然我的解釋...
謝謝你的解釋,這是非常有幫助的!當我在我的代碼中執行編輯時,它不會打印用戶輸入的整數 - 除了打印整數的平方以外,這是一項要求。它是否跳過這個打印命令,因爲輸入後直接調用sqInteger(x)? – saj0991
你想打印輸入的用戶,而不是平方值,是否正確?您實際上需要轉到'else'塊並將'print(x)'語句移到'return'語句之上。 return語句將停止當前函數的執行,並立即返回到函數被調用的地方 - ergo,之後的print(x)函數將不會運行。我將編輯上面的主代碼塊以反映這一點。 – cchoe1
明白了!非常感謝! – saj0991