while循环使用原始数据

时间:2016-03-27 23:49:52

标签: python loops while-loop

我正在尝试使用while循环创建代码,这将阻止用户在输入原始数据时输入无效日期:

while True:
    try:
        Date = int(raw_input("Please input the Date in the format DDMM:"))
    except ValueError:
        print ("Please enter a valid date in the format DDMM")
        continue
    if int(Date[0]) > 3 or Date < 0 or int(Date[2]) > 1:
        print ("Please enter a valid date in the format DDMM")
        continue
    if int(Date[2:4]) > 12:
        print ("Please enter a valid date in the format DDMM")
        continue
    if int(Date[2:4])==1 or 3 or 5 or 7 or 8 or 10 or 12 and int(Date[0:2])>31:
        print ("Please enter a valid date in the format DDMM")
        continue
    if int(Date[2:4])==2 and int(Date[0:2])>28:
        print ("Please enter a valid date in the format DDMM")
        continue
    if int(Date[2:4])==4 or 6 or 9 or 11 and int(Date[0:2])>30:
        print ("Please enter a valid date in the format DDMM")
        continue
    else:
        break

运行代码

时收到以下错误消息
if int(Date[0]) > 3 or Date < 0 or int(Date[2]) > 1:
     

TypeError:'int'对象没有属性' getitem '

3 个答案:

答案 0 :(得分:1)

您正在将日期设为int

Date = int(raw_input("Please input the Date in the format DDMM:"))

并且您通过调用[]的{​​{1}}访问它。

要使其工作,您需要将其转换回字符串。

__getitem__

无论哪种方式,Date的使用都不一致,例如

Date = str( Date )

将其视为数字。

答案 1 :(得分:0)

这种情况正在发生,因为当你从用户那里获得输入时,你会立即将它作为一个整数投射,但是在你的条件下,你正试图索引或取一个不能工作的整数片< / p>

因此,要解决您的问题,请更改您的行:

Date = int(raw_input("Please input the Date in the format DDMM:"))

Date = raw_input("Please input the Date in the format DDMM:")

您的代码还有一些其他问题会阻止它按预期工作。例如,这在语法上是不正确的:

if int(Date[2:4])==4 or 6 or 9 or 11 and int(Date[0:2])>30

至少,作为直接修复,您需要执行以下操作:

if int(Date[2:4])==4 or int(Date[2:4])==6 or int(Date[2:4])==9 or int(Date[2:4])==11 and int(Date[0:2])>30

但是你可能想考虑重构代码以使整体更清洁

答案 2 :(得分:0)

您可以使用datetime模块:

import datetime

def validate(d):
    try:
        datetime.datetime.strptime(d, '%m%d')
    except ValueError:
        raise ValueError("Please enter a valid date in the format MMDD")

validate('1010')
validate('1099')