三天打渔,两天晒网Python

目录

 一. 问题解决思路分析

 二. 问题解决步骤

第一步:计算出从2010年1月1日起至指定的某天总共有多少天 

         第二步:判断这个人在指定时间是打渔还是晒网

         第三步:完成提高要求

         第四步:编写主方法进行测试


具体题目如下图所示:

这次我选择使用Python来完成这个题目。

 一。问题解决思路分析

因为“ 三天打渔两天晒网”,所以周期为5天,要判断出指定的某天是打渔还是晒网,则首先需要计算出从2010年1月1日起至指定的某天总共有多少天,计算出来之后对5取余这里分为两种情况:

①0<=余数<3 -------------------这个人这天在打渔

②2<余数<5 -------------------这个人这天在晒网

二。问题解决步骤

第一步:计算出从2010年1月1日起至指定的某天总共有多少天

因为最近一直在学习pandas和numpy的的库,之前刚好有过将字符串转为时间格式的代码经验---使用pandas库的to_datetime()方法即可将固定格式的字符串类型转为日期时间类型的变量转换成DATATIME类型后,可以就直接对时间进行。减法  ,这样即可得到想要的天数,代码如下

# -*- coding:utf-8 -*- 
# @Author: Jiawei Han

import pandas as pd

def day_number(date):
    """
    计算输入的时期距离起始日期的天数并且返回
    """
    # 使用to_datetime()方法设置起始时间
    begin_date = pd.to_datetime('2010-1-1')
    # 这里将格式转化为datetime的时间格式 将两个时间直接做减法 结果就是两个时间所隔的天数
    return (date-begin_date).days

第二步:判断这个人在指定时间是打渔还是晒网

判断的方法就是步骤一得到的天数对5进行取余,进而用取余的结果来判断代码如下:

def judge(number, date):
    """
    判断在这天这个人是在做什么的方法
    """
    # 如果隔的天数除5取余比3小说明这人在打渔 反之在晒网
    if number % 5 < 3:
        return "这天在打渔 --- " + date
    else:
        return "这天在晒网 --- " + date

第三步:完成提高要求

首先是将若干日期写入in.txt,用户可以选择自己输入若干个测试日期,我这里是将用户输入的日期放入列表中,然后用with...open以写的方式打开in.txt文件,将列表里的所有日期写入in.txt文件,一个日期占一行代码如下:

def write_file():
    # 定义列表str_dates用来存储输入的若干个日期
    str_dates = []
    str_date = ''
    # 将用户输入的日期保存在列表str_dates中
    while str_date != 'quit':
        str_date = input("请按照 年-月-日 的格式输入需要判定的日期(输入quit结束输入):")
        # 输入 quit 表示终止输入
        if str_date == 'quit':
            break
        str_dates.append(str_date+'\n')
    # 将用户输入的所有日期保存至 in.txt 文件中
    with open('in.txt','w') as f_obj:
        for str in str_dates:
            f_obj.write(str)

接下来是从in.txt读取日期后进行判断,然后将判断结果存入out.txt文件中。同样这里我将日期从文件取出来之后放入列表中以便于接下来判断,判断就是直接调用我前面定义的方法judge()循环判断列表里的所有日期,将返回的结果直接存入out.txt文件中代码如下:

def output_file():
    # 从 in.txt 读取日期并且做出判断
    with open('in.txt','r') as f_obj:
        # 读取文件里的日期并且放入列表str_dates中
        str_dates = f_obj.readlines()
        # 以写的方式打开out.txt文件
    with open('out.txt', 'w') as f_obj:
        # 循环进行单个日期进行的步骤
        for str_date in str_dates:
            date = pd.to_datetime(str_date)
            # 将判断结果写入out.txt
            f_obj.write(judge(day_number(date), str_date))

第四步:编写主方法进行测试

由于我使用to_datetime()方法将字符串转为日期时间格式,可以很好的判断输入字符串是否符合相应格式以及年月日正确,完成了基本要求和提高要求之后就可以编写主方法,根据不同情况调用前面编写的函数来进行测试具体代码如下:
我利用了pandas库中的to_datetime()方法 
如果格式转化出现异常,则说明用户输入的字符串并非一个有效的时间字符串或者是输入的年月日不正确
所以使用异常处理try...except...else若发生异常则提示输入侧的字符串并非一个有效值的时间字符串

if __name__ == '__main__':
    flag = input("请选择要实现的功能:\n    1.输入日期判断    2.利用txt文件测试\n")
    if int(flag) == 1:
        str_date = input("请按照 年-月-日 的格式输入需要判定的日期:")
        '''
        我这里判断输入的字符串格式是否正确
        我利用了pandas库中的to_datetime()方法 
        如果格式转化出现异常,则说明用户输入的字符串并非一个有效的时间字符串
        所以使用异常处理 若发生异常 则提示 输入的字符串并非一个有效的时间字符串
        '''
        try:
            date = pd.to_datetime(str_date)
        except:
            print("这不是一个正确并且有效时间字符串!!")
        else:
            # 如果字符串输入正确并且年份不小于2010时则:
            # 调用判断的函数并传入所隔天数和输入的日期两个参数 打印出这个人在干什么
            if date.year<2010:
                print("输入年份不能小于起始日期2010年!!")
            else:
                print(judge(day_number(date), str_date))
    if int(flag) == 2:
        write_file()
        output_file()
        print("判断结果已经写入out.txt文件中, 请查看")

主要测试截图如下:

 

--------------------------------------------------------------------文章结束,谢谢观看----------------------------------------------------------------

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值