我想阻止用戶輸入數字來保存程序中的問題。我知道如何使用try,除了使用int(input())來防止在需要整數時輸入字符串,但我想知道str(input())是否有類似的情況。有沒有一種方法可以防止用戶輸入數字()
例如,如果用戶被要求輸入他們的姓名,他們輸入了「1994」,他們會收到並輸入一個整數的錯誤消息。
我想阻止用戶輸入數字來保存程序中的問題。我知道如何使用try,除了使用int(input())來防止在需要整數時輸入字符串,但我想知道str(input())是否有類似的情況。有沒有一種方法可以防止用戶輸入數字()
例如,如果用戶被要求輸入他們的姓名,他們輸入了「1994」,他們會收到並輸入一個整數的錯誤消息。
使用try-except
與else
塊中,你會提出一個ValueError
如果異常沒有轉換過程中出現一個int
(這意味着輸入爲的int
:
v = input("> ")
try:
_ = int(v)
except:
pass
else:
raise ValueError("input supplied should be of type 'str'")
這將捕獲任何號碼通過在else
區塊中引發異常進入:
> 1992
ValueErrorTraceback (most recent call last)
<ipython-input-35-180b61d98820> in <module>()
5 pass
6 else:
----> 7 raise ValueError("input supplied should be of type 'str'")
ValueError: input supplied should be of type 'str'
並允許字符串由pass
ING在except
:
> jim
v
Out[37]: 'jim'
或者,你也可以用any
和isdigit
做到這一點:
v = input("> ")
if any(s.isdigit() for s in v):
raise ValueError("input supplied should be of type 'str'")
這種檢查是否any
字符是數字,如果這樣會引發錯誤。
你可以防止漂浮太多,但這個開始變得醜陋:
v = input("> ")
for f in [int, float]:
try:
_ = f(v)
except:
pass
else:
raise ValueError("Numbers not allowed")
由於沒有使用來自'int'的值,因此可以省略賦值並將其單獨保留爲'int(v)'。當需要名稱('for'循環,'tuple'解包等)時,您只需將'_'用於「不需要」賦值。 – ShadowRanger
@ShadowRanger我知道,它看起來很糟糕,我真的不想這樣做(不是'_ = ..'看起來不錯)。 –
有沒有辦法可以防止漂浮物? –
使用相同的嘗試,除了用'INT(輸入())'但現在考慮引發的異常爲「一切正常「成功轉換爲」出錯了「? –
請注意,試圖以這種方式過濾輸入是......奇怪。當然,一個合法的'int'(可能)不是一個合法的名字。但是,既不是合法的「浮動」,也不是合法的「列表」等。試圖將不良輸入列入黑名單是徒勞的;白名單最終會變得棘手,因爲很容易忽略法律字符(空格,撇號和連字符,例如,全部以正常名稱出現)。我會避免試圖將特定模式列入黑名單,並接受他們給予的內容;畢竟,恰巧包含數字的'str'並不比名稱'!@#$%^'更爲違法。 – ShadowRanger