python - जब तक वे एक वैध प्रतिक्रिया नहीं देते हैं तब तक उपयोगकर्ता को इनपुट के लिए पूछना




validation loops (8)

मैं एक प्रोग्राम लिख रहा हूं जिसे उपयोगकर्ता से इनपुट स्वीकार करना होगा।

#note: Python 2.7 users should use `raw_input`, the equivalent of 3.X's `input`
age = int(input("Please enter your age: "))
if age >= 18: 
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

यह अपेक्षाकृत काम करता है अगर उपयोगकर्ता समझदार डेटा में प्रवेश करता है।

C:\Python\Projects> canyouvote.py
Please enter your age: 23
You are able to vote in the United States!

लेकिन अगर वे गलती करते हैं, तो यह दुर्घटनाग्रस्त हो जाता है:

C:\Python\Projects> canyouvote.py
Please enter your age: dickety six
Traceback (most recent call last):
  File "canyouvote.py", line 1, in <module>
    age = int(input("Please enter your age: "))
ValueError: invalid literal for int() with base 10: 'dickety six'

क्रैश होने के बजाय, मैं इसे फिर से इनपुट प्राप्त करने का प्रयास करना चाहता हूं। इस कदर:

C:\Python\Projects> canyouvote.py
Please enter your age: dickety six
Sorry, I didn't understand that.
Please enter your age: 26
You are able to vote in the United States!

मैं यह कैसे हासिल कर सकता हूं? क्या होगा यदि मैं -1 जैसे मूल्यों को अस्वीकार करना चाहता हूं, जो एक वैध int , लेकिन इस संदर्भ में बकवास है?


अपना कोड संपादित करने और त्रुटि को ठीक करने के लिए:

while True:
    try:
       age = int(input("Please enter your age: "))
       if age >= 18: 
           print("You are able to vote in the United States!")
           break
       else:
           print("You are not able to vote in the United States.")
           break
    except ValueError:
       print("Please enter a valid response")

आप while True क्यों करेंगे और फिर इस लूप से बाहर निकलेंगे, जबकि आप अपनी आवश्यकताओं को केवल वक्तव्य में डाल सकते हैं क्योंकि आप चाहते हैं कि उम्र बढ़ने के बाद ही आप रुक जाएं?

age = None
while age is None:
    input_value = input("Please enter your age: ")
    try:
        # try and convert the string input to a number
        age = int(input_value)
    except ValueError:
        # tell the user off
        print("{input} is not a number, please enter a number only".format(input=input_value))
if age >= 18:
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

इसके परिणामस्वरूप निम्नलिखित होंगे:

Please enter your age: *potato*
potato is not a number, please enter a number only
Please enter your age: *5*
You are not able to vote in the United States.

यह काम करेगा क्योंकि उम्र के पास कभी ऐसा मूल्य नहीं होगा जो समझ में नहीं आएगा और कोड आपके "व्यावसायिक प्रक्रिया" के तर्क का पालन करेगा।


आप उपयोगकर्ता को केवल विशिष्ट संख्या में प्रवेश करने की अनुमति देने के लिए अधिक सामान्य तर्क लिख सकते हैं, क्योंकि एक ही उपयोग-केस कई वास्तविक-दुनिया अनुप्रयोगों में उत्पन्न होता है।

def getValidInt(iMaxAttemps = None):
  iCount = 0
  while True:
    # exit when maximum attempt limit has expired
    if iCount != None and iCount > iMaxAttemps:
       return 0     # return as default value

    i = raw_input("Enter no")
    try:
       i = int(i)
    except ValueError as e:
       print "Enter valid int value"
    else:
       break

    return i

age = getValidInt()
# do whatever you want to do.

इसको आजमाओ:-

def takeInput(required):
  print 'ooo or OOO to exit'
  ans = raw_input('Enter: ')

  if not ans:
      print "You entered nothing...!"
      return takeInput(required) 

      ##  FOR Exit  ## 
  elif ans in ['ooo', 'OOO']:
    print "Closing instance."
    exit()

  else:
    if ans.isdigit():
      current = 'int'
    elif set('[[email protected]#$%^&*()_+{}":/\']+$').intersection(ans):
      current = 'other'
    elif isinstance(ans,basestring):
      current = 'str'        
    else:
      current = 'none'

  if required == current :
    return ans
  else:
    return takeInput(required)

## pass the value in which type you want [str/int/special character(as other )]
print "input: ", takeInput('str')

उपयोगकर्ता द्वारा एक वास्तविक मान दर्ज करने तक "जबकि" कथन का प्रयोग करें और यदि इनपुट मान कोई संख्या नहीं है या यह शून्य मान है तो इसे छोड़ दें और फिर से पूछने का प्रयास करें। उदाहरण में मैंने वास्तव में आपके प्रश्न का उत्तर देने की कोशिश की। अगर हमें लगता है कि हमारी उम्र 1 और 150 के बीच है तो इनपुट मूल्य स्वीकार किया जाता है, अन्यथा यह गलत मूल्य है। प्रोग्राम को समाप्त करने के लिए, उपयोगकर्ता 0 कुंजी का उपयोग कर सकता है और इसे एक मान के रूप में दर्ज कर सकता है।

नोट: कोड के शीर्ष पर टिप्पणियां पढ़ें।

# If your input value is only a number then use "Value.isdigit() == False".
# If you need an input that is a text, you should remove "Value.isdigit() == False".
def Input(Message):
    Value = None
    while Value == None or Value.isdigit() == False:
        try:        
            Value = str(input(Message)).strip()
        except InputError:
            Value = None
    return Value

# Example:
age = 0
# If we suppose that our age is between 1 and 150 then input value accepted,
# else it's a wrong value.
while age <=0 or age >150:
    age = int(Input("Please enter your age: "))
    # For terminating program, the user can use 0 key and enter it as an a value.
    if age == 0:
        print("Terminating ...")
        exit(0)

if age >= 18 and age <=150: 
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

जबकि try / ब्लॉक को except काम करेगा, इस कार्य को पूरा करने के लिए एक तेज़ और साफ तरीका str.isdigit() का उपयोग करना होगा।

while True:
    age = input("Please enter your age: ")
    if age.isdigit():
        age = int(age)
        break
    else:
        print("Invalid number '{age}'. Try again.".format(age=age))

if age >= 18: 
    print("You are able to vote in the United States!")
else:
    print("You are not able to vote in the United States.")

हालांकि स्वीकृत उत्तर अद्भुत है। मैं इस समस्या के लिए एक त्वरित हैक साझा करना भी चाहूंगा। (यह ऋणात्मक आयु की समस्या का भी ख्याल रखता है।)

f=lambda age: (age.isdigit() and ((int(age)>=18  and "Can vote" ) or "Cannot vote")) or \
f(raw_input("invalid input. Try again\nPlease enter your age: "))
print f(raw_input("Please enter your age: "))

पीएस यह कोड पायथन 2.x के लिए है और raw_input और प्रिंट फ़ंक्शंस को बदलकर 3.x पर निर्यात किया जा सकता है।


def validate_age(age):
    if age >=0 :
        return True
    return False

while True:
    try:
        age = int(raw_input("Please enter your age:"))
        if validate_age(age): break
    except ValueError:
        print "Error: Invalid age."




user-input