如何获得引用的正确变量

时间:2011-03-06 23:01:03

标签: python

在下面的代码中,我试图获得第二个'while'语句(而digit_check)以从之前的while_count语句接收新日期。但它似乎从第一个分配行中获取了user_date变量的原始赋值。

如何将新变量赋值传递给第二个while语句?

非常感谢

def main():

    user_date = raw_input("Enter a date in the format mm/dd/yyyy and press 'Enter'  ")
    count = len(user_date)
    digit = ''
    digit_check = ''

    while count != 10:
        user_date = raw_input('try again  ')
        count = len(user_date)

    if user_date[0].isdigit() and user_date[1].isdigit() and user_date[3].isdigit()  \
       and user_date[4].isdigit() and user_date[6].isdigit() and user_date[7].isdigit() \
       and user_date[8].isdigit() and user_date[9].isdigit() and user_date[2] == '/' \
       and user_date[5] == '/':
           digit_check = True

    while digit_check != True :
       user_date = raw_input('Not right - try again')

    convert_date(user_date)

    print 'That date is ',convert_date(user_date) + ' ' + user_date[3] + user_date[4] + ',' + user_date[6:]

def convert_date(user_date):

    # Convert date to different format
    month = ''

    if user_date[0] == '0' and user_date[1] == '1':
        month = 'January'
    elif user_date[0] == '0' and user_date[1] == '2':
        month = 'February'
    elif user_date[0] == '0' and user_date[1] == '3':
        month = 'March'
    elif user_date[0] == '0' and user_date[1] == '4':
        month = 'April'
    elif user_date[0] == '0' and user_date[1] == '5':
        month = 'May'
    elif user_date[0] == '0' and user_date[1] == '6':
        month = 'June'
    elif user_date[0] == '0' and user_date[1] == '7':
        month = 'July'
    elif user_date[0] == '0' and user_date[1] == '8':
        month = 'August'
    elif user_date[0] == '0' and user_date[1] == '9':
        month = 'September'
    elif user_date[0] == '1' and user_date[1] == '0':
        month = 'October'
    elif user_date[0] == '1' and user_date[1] == '1':
        month = 'November'
    elif user_date[0] == '1' and user_date[1] == '2':
        month = 'December'

    return month


main()

3 个答案:

答案 0 :(得分:1)

一个问题是你没有在这里重新计算digit_check:

while digit_check != True :
   user_date = raw_input('Not right - try again')

这将进入一个无限循环。

我建议不要用很多循环和大量的赋值编写一个庞大的函数,而是将代码重构为更小的函数并使用更简单的逻辑。例如:

def getDate():
    while True:
        user_date = raw_input('Enter a date')
        if validate(user_date):
             return user_date
        else:
             print 'Error, try again.'

def validate(user_date):
    # etc...

答案 1 :(得分:1)

或者使用内置的库函数?

import re
import datetime

def getDate(msg="Enter a date in the format mm/dd/yyyy and press 'Enter': ", pat=re.compile(r'(\d{1,2})/(\d{1,2})/(\d{4})$')):
    while True:   # repeat until a valid date is entered
        s = raw_input(msg)            # get input
        match = pat.match(s.strip())  # match against regular expression
        if match:                     # match found?
            m,d,y = match.groups()
            try:
                # parse to date
                return datetime.date(int(y), int(m), int(d))
            except ValueError:
                # parsing failed (month 93 is invalid, etc)
                pass

def main():
    userDate = getDate()
    print('You entered {0}'.format(userDate.strftime('%B %d, %Y')))

if __name__=="__main__":
    main()

答案 2 :(得分:0)

你没有在while循环中重新计算digit_check,所以它永远失败,即使user_date正在改变。在user_date = raw_input之后在while循环中添加if块('不正确 - 再试一次')修复它。

话虽如此,你肯定应该把这个检查作为一个单独的功能,特别是因为你现在要调用它两次而不是一次。