在Python中尝试和除外

时间:2014-03-24 02:52:47

标签: python

我的代码是:

def less_than_equal(start_day, start_mon, start_year, \
                end_day, end_mon, end_year):
    try:
        start_day <= end_day and start_mon <= end_mon
        return True
    except:
        start_day > end_day or start_mon > end_mon or start_year >end_year
        print("Start date must be less than or equal end date.")

,其中

>>> less_than_equal(12, 4, 1111, 12, 5, 1111)
True
>>> less_than_equal(12, 7, 1111, 12, 5, 1111)
"Start date must be less than or equal end date."  (but my code gives True)
>>> less_than_equal(17, 7, 1111, 12, 5, 1111)
"Start date must be less than or equal end date." (mine gives True here too)

我也很困惑如何使用加注和尝试除外。 哪个放在代码的正文中,哪个放在最后? 例如,在#TODO

def count_days(start_date, end_date):
    # date is represented as a string in format dd/mm/yyyy
    start_day, start_mon, start_year = get_day_month_year(start_date)
    end_day, end_mon, end_year = get_day_month_year(end_date)

# TODO: check for data validity here #
# if start date is not valid...
# if end date is not valid...
# if start date > end date...
    if is_valid( start_day, start_mon, start_year)  == False:
        raise ValueError( "Not a valid date: " + start_date )
    elif is_valid(end_day, end_mon, end_year) == False:
        raise ValueError(  "Not a valid date: " + end_date )
    if less_than_equal(start_day, start_mon, start_year, \
         end_day, end_mon, end_year) == "Start date must be less than or equal end date.":
        raise ValueError( "Not a valid date: " + start_date )

# lazy - let the computer count from start date to end date
   count = 0
    while less_than_equal(start_day, start_mon, start_year, end_day, end_mon, end_year):
        count = count + 1
        start_day, start_mon, start_year = next_date(start_day, start_mon, start_year)

# exclude end date
    return count - 1

非常感谢

2 个答案:

答案 0 :(得分:5)

除此之外,您不需要使用try。

def less_than_equal(start_day, start_mon, start_year, \
            end_day, end_mon, end_year):
    if start_day <= end_day and start_mon <= end_mon:
        return True
    elif start_day > end_day or start_mon > end_mon or start_year >end_year:
        print("Start date must be less than or equal end date.")
        return False

尝试和除了用于捕获异常。

关于第二个问题,你可以

count = 0
while True:
    try:
        if not less_than_equal(start_day, start_mon, start_year, end_day, end_mon, end_year):
            break
    except TypeError: # for example
        break

    count = count + 1
    start_day, start_mon, start_year = next_date(start_day, start_mon, start_year)

答案 1 :(得分:1)

有内置的库函数可以使这更简单:

import datetime
import time

def parse_date(datestring):
    dt = time.strptime(datestring, "%Y/%m/%d")
    return datetime.date(dt.tm_year, dt.tm_mon, dt.tm_mday)

def count_days(start_date, end_date):
    s = parse_date(start_date)
    e = parse_date(end_date)

    if s > e:
        raise ValueError("Start date must be <= end date")
    else:
        return (e - s).days

然后

count_days("2012/2/27", "2012/3/5")   # => 7