[英]Python NameError: name 'encrypt' is not defined
當我嘗試運行此命令時,它說NameError:未定義名稱“ encrypt”。
MAX_KEY_SIZE = 26
def getMode():
while True:
print('Do you wish to encrypt or decrypt a message?')
mode = input().lower()
if mode in "encrypt" 'e' 'decrypt' 'd'.split():
return mode
else:
print('Enter either "encrypt" or "e" or "decrypt" or "d".')
據我對您的代碼的了解,“加密”是一個字符串值。 您需要使用所需的字符串值創建一個列表,並檢查mode變量是否與該列表中的值匹配。
MAX_KEY_SIZE=26
def getMode():
while True:
mode=input().lower()
if mode in ['encrypt','e','decrypt','d']:
return mode
else:
print('Enter either "encrypt" or "e" or "decrypt" or "d".')
如果要使用.split()方法,可以執行以下操作:
if mode in "encrypt e decrypt d".split()
知道了! input
試圖評估您的輸入(因此,它的名稱被誤導了)。 使用raw_input
以字符串格式捕獲用戶的願望。
基本上, input
所做的是將raw_input
傳遞給eval
:現在您正在嘗試將字符串“ encrypt”評估為Python代碼,因此它的作用與將“ encrypt”寫入文件相同。 自然會導致錯誤,因為沒有在任何地方引入這樣的變量。 eval
和input
都是非常危險的事情,因此請不要使用它們,很少有真正的用例。
有關此站點周圍差異的更多信息: https : //stackoverflow.com/a/15129556/308668
MAX_KEY_SIZE = 26
def getMode():
while True:
print ('Do you wish to encrypt or decrypt a message?')
mode = input().lower()
if mode in "encrypt" 'e' 'decrypt' 'd'.split():
return mode
else:
print('Enter either "encrypt" or "e" or "decrypt" or "d".')
希望這是您的代碼。如果是,那么它應該不會出現任何錯誤,而且您嘗試獲得結果的方法也可能無法解決您的目的,因為"encrypt" 'e' 'decrypt' 'd'.split()
將為您提供['encryptedecryptd']
並且您無法通過嘗試的“ in”方法搜索模式。 您可以搜索以下模式: if any(mode in s for s in "encrypt" 'e' 'decrypt' 'd'.split()): or you can store
“加密”'e''解密''d'在列表中,然后使用“輸入”方法來匹配用戶的輸入。
希望能幫助到你..
擴展pogo的答案 ,這是正確的...
使我(並且顯然還有許多其他人)感到驚訝的是, if mode in ...:
行中的if mode in ...:
的字符串簇不是語法錯誤。
if mode in "encrypt" 'e' 'decrypt' 'd'.split():
這些字符串都是編譯時常量,因此字符串文字串聯將它們在執行開始之前粘合為一個字符串:
>>> "encrypt" 'e' 'decrypt' 'd'
'encryptedecryptd'
然后在該字符串上調用split()
方法,該字符串偶然不包含任何空格。 返回值是一個包含單個字符串的列表:
>>> "encrypt" 'e' 'decrypt' 'd'.split()
['encryptedecryptd']
in
運算符不會抱怨給定一個字符串( mode
)和一個字符串列表,但是它將為mode
每個值返回False
,除了一個...沒有人可能鍵入:
>>> 'encrypt' in ['encryptedecryptd']
False
>>> 'encryptedecryptd' in ['encryptedecryptd']
True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.