1. 场景描述

“月光族”是指没到下一个发薪日,工资就被全部花光的一群人。这个称谓是一个没有贬义的中性词。“月光族”通常是有知识有文化、有固定的工作收入,秉持着乐观豁达的生活态度,力争做到量入为出,挣多少用多少。他/她们喜欢消费,但不疯狂。偶尔也有因为房贷、车贷或者房租等压力,造成收支不平衡,使用信用卡透支的状况,显然“月光族”是银行信用卡的理想客群。“月光族”时常盘算着还有几天发工资,何时还上信用卡透支款项,总是期待着发薪日的早点到来。
下面我们就来编写一段Python代码,帮助“月光族”计算距离下一个发薪日还有多少天,信用卡透支消费的还款金额的计算问题。


2. 编程思路

编写这个程序还是有挑战性的,它可能比你想象的要复杂得多。因为在程序设计中你必须对“闰年和闰月,月大和月小”的特殊情况进行处理,这种特殊情形导致每个月包含的天数不同。如果你要自己实现这些功能,还是有一定的编码工作量。许多程序设计语言在日期处理上有点复杂,幸运的是Python已经为我们考虑到了特殊日期的处理!我们可以使用Python的标准库模块calendar和datetime来处理以上“闰年闰月和月大月小”的问题。
编程的基本思路是这样的:
如果今天日期在发薪日之前,计算今天到发薪日之间的天数;
如果今天日期等于发薪日,今天就是发薪日;
如果今天日期在发薪日之后,计算今天到下一个月的发薪日之间的天数。由于涉及跨越两个月,需要处理“闰年闰月和月大月小”的问题。
编程逻辑简单清晰,下面进入代码实现部分。


3. 代码实现

"""next_payday.py : 月光族的期待
"""
from calendar import monthrange   # ①
from datetime import datetime, timedeltadef calc_days(payday=15):"""功能:计算距离发薪日的天数"""today = datetime.now()if today.day <= payday:return payday-today.dayelse:last_day = monthrange(today.year, today.month)[1]   # ②paydt = datetime(today.year, today.month, last_day) + timedelta(days=payday)   # ③return (paydt.date()-today.date()).daysdef print_days(payday=15):"""打印距离发薪日的天数"""print('距离发薪日天数'.center(15, '-'))today = datetime.now()print('当前日期:' + today.strftime('%Y-%m-%d'))   # ④print('发 薪 日:' + '每月'+str(payday) + '号')days = calc_days(payday)if days:print(f'离发薪日:{days}天')else:print('今天发工资啦!')def main():print_days(payday=1)   # ⑤if __name__ == '__main__':main()

主要的代码说明如下:
语句①导入calendar和datetime模块中的相关函数。
语句②获取指定日期所在月份的最大天数。在这里我们使用了Python的calendar模块中的monthrange()函数,调用它可以获取指定月份的天数。需要特别强调的是monthrange()函数本身实现了对闰年润月和月大月小的自动处理。
语句③计算下一个发薪日的日期,将自动处理闰年润月和月大月小的特殊情况。
语句④首先使用datetime.strftime()将日期转换为“年-月-日”格式字符串,然后再打印输出。
语句⑤在主程序main()中验证程序功能。假如发薪日是每月1号,计算今天(2022-12-3)距离发薪日的天数。


4. 执行效果

结果如下所示:
(cases) D:\cases\月光族的期待>python next_payday.py
----距离发薪日天数----
当前日期:2022-12-03
发 薪 日:每月1号
离发薪日:29天

(cases) D:\cases\月光族的期待>
需要注意的是,如果你执行这段程序时所看到的显示结果可能与以上结果不同,这是因为你执行程序时的系统日期不同而已,带来处理结果的差异,结果均是正确的。


5. 扩展场景

接下来,我们来解决第二个问题,计算信用卡透支还款额的计算问题。

5.1 弄清几个术语

信用卡业务有几个术语需要我们必须理解,方能正确地编写程序代码。

1. 还款期数

信用卡是按月还款,每月是1期,一年共有12期。

2. 账单日

账单日是发卡行每月定期对客户的信用卡账户当前发生的各项交易费用进行汇总结算,计算出客户当前的总欠款金额和最小还款额后为客户发送对账单的日期。例如:浦发银行账单日可以选择每月的1号、3号、8号、14、15、16、17、19、20、22、23、25和26号等。

3. 还款日

还款日是发卡行要求持卡人偿还应付款项的最后期限。实际上,信用卡还款日是免息还款的最后一天,在这之后还款就是逾期了,需要缴纳利息。例如:浦发银行的信用卡还款日就是账单日后的第20天。

4. 利息

目前各信用卡发卡行的逾期利率均是每天万分之五。凡是超过免息期的欠款均要按照逾期利率和实际逾期天数计付利息。
至此有了以上知识,我们可以开始着手编写信用卡透支还款程序了。

5.2 编写程序

"""card_payback.py : 信用卡还款
"""
from datetime import datetime, timedeltaBILL_DAY = 8    # 账单日
INTEREST_RATE = 0.0005    # 逾期利率
BILLS = 'bills.txt'   # 账单文件def get_interest(payback_dt):"""功能:计算信用卡欠款利息参数:payback_dt 计划还款日期"""today = datetime.now()bill_dt = datetime(today.year, today.month, BILL_DAY)   # ① last_dt = bill_dt + timedelta(days=20)   # ② payback_dt = datetime.strptime(payback_dt, '%Y-%m-%d')  # ③amount = get_amount()if payback_dt.date() < last_dt.date():   # ④interest = 0else:days = (payback_dt-last_dt).daysinterest = INTEREST_RATE * amount * days   # ⑤return round(interest, 2)def print_result(payback_dt):"""功能:打印还款金额(本金和利息)参数:payback_dt 计划还款日期"""today = datetime.now()amount = get_amount()interest = get_interest(payback_dt)print('信用卡还款'.center(20, '-'))print('当前日期:', today.strftime('%Y-%m-%d'))print('计划还款:', payback_dt)print('欠款金额:', amount)print('还款利息:', interest)print('合计金额:', amount+interest)def get_amount():"""功能:获取信用卡当期欠款总额"""today = datetime.now()bill_dt = datetime(today.year, today.month, BILL_DAY)    last_dt = datetime(today.year, today.month, 1) - timedelta(days=1)   # ⑥last_bill_dt = datetime(last_dt.year, last_dt.month, BILL_DAY)  # ⑦with open(BILLS) as f:lines = f.readlines()amount = 0for line in lines:dt, money = line.split()dt = datetime.strptime(dt, '%Y-%m-%d')if last_bill_dt.date() < dt.date() <= bill_dt.date():   # ⑧amount += float(money)return amountdef main():payback_dt = '2022-12-30'print_result(payback_dt)if __name__ == '__main__':main()

程序中重要语句解释如下:
语句①计算当前日期所在月份的账单日期(当期账单日或本期账单日);
语句②计算当期还款日期,也就是免息期最后1天;
语句③将字符串格式的计划还款日期转换为datetime类型的日期;
语句④判断免息条件是否成立;
语句⑤按照逾期实际天数和逾期利率计算欠款的逾期利息;
语句⑥上月最后一天的日期,这里隐含着对闰年闰月和月大月小的自动处理;
语句⑦获取上一期的账单日(上期账单日)
语句⑧判断是否本期消费账单

5.3 执行程序

下面程序演示场景是:计划还款日期2022-12-30,账单存放在bills.txt文件中,其内容和格式如下:
2022-11-15 7800.25
2022-11-19 2500
2022-11-8 1000
2022-11-3 2000
2022-10-23 534.59
2022-10-5 1000
这是一个文本文件格式。文件每一行代表一笔信用卡消费,包含日期和金额,之间使用空格分隔。
D:\cases\月光族的期待>python card_payback.py
-------信用卡还款--------
当前日期: 2022-12-03
计划还款: 2022-12-30
欠款金额: 10300.25
还款利息: 10.3
合计金额: 10310.55

D:\cases\月光族的期待>
经执行程序结果表明,程序正确地计算了信用卡还款的欠款金额和透支利息,达到了设计的目标。但是有一点需要在此强调,当你执行这段程序时,可能会有不同的显示结果,其原因是账单文件bills.txt中没有当期信用卡消费明细数据。解决办法是在bills.txt账单文件中加入当期信用卡消费数据,再次执行程序就可以显示相关信用卡还款信息了。

5.4 功能完善

我们拟增强两个方面的功能:
1)增加打印信用卡当期的每一笔消费明细,格式如下:
-------信用卡还款--------
当前日期: 2022-12-03
计划还款: 2022-12-30
消费明细:
2022-11-15 7800.25
2022-11-19 2500


欠款金额: 10300.25
还款利息: 10.3
合计金额: 10310.55
2)从程序命令行中获取参数,提取计划还款日期。命令行执行方式如下:
python card_payback.py 2022-12-30
有兴趣的读者可以自行完成以上程序的功能优化。

场景编程集锦-月光族的期待相关推荐

  1. 场景编程集锦 - 懵懂的青春

    1. 场景描述 "等待着下课,等待着放学,等待游戏的童年".当罗大佑这首耳熟能详的"童年"再度想起的时候,你和我是否都会被这个熟悉的旋律带回到那个只属我们的懵懂 ...

  2. 场景编程集锦 - BMI指数与健身达人

    1. 场景描述 BMI指数(身体质量指数,英文Body Mass Index)是用体重公斤数除以身高米数的平方得出的数字,是目前国际上通用的衡量人体胖瘦程度以及是否健康的一个标准."身体质量 ...

  3. 场景编程集锦 - 吉米的总统梦想

    1. 场景描述   吉米是太平洋岛国一个贫苦家庭的孩子,他的梦想就是当总统,引领国家走向富强之路.   开学的第一堂课上,老师用白色的粉笔在黑板上写下了"我的梦想",同学们都陷入了 ...

  4. 场景编程集锦 - 乒坛争锋:孙颖莎vs伊藤美城

    1. 场景描述 孙颖莎和伊藤美诚是世界女子乒坛的顶尖运动员.根据国际乒联2022年11月15日公布的世界排名,孙颖莎位列第一,伊藤美诚排名第五.孙颖莎是中国女子乒乓球队的三大主力,曾获得2020年东京 ...

  5. 月光族的最佳财务规划

    刚出校门的90后,挣得不多,如果没理财观念,便有可能存不下钱.90后妹子们攒不下钱的原因无非下面几种: 1. 赚得不多,储蓄更少. 刚出校门收入还不太多,这个时候随便吃吃喝喝,付个房租就感觉促襟见肘了 ...

  6. 身为“月光族”的电视选择之道

      一直以来,电视是客厅的主体,其变化对客厅整体装修方案举足轻重.现在,电视向更薄.更大.更清晰方向迅速转变,加之目前市场上等离子.液晶等平板电视价格的不断走低,日益接近百姓,其简洁的外观.清晰的画面 ...

  7. 月光族开始反消费主义:58万年轻人攒钱攒到“丧心病狂”

    曾几何时,"月光"成为年轻人甩不掉的标签,而如今,他们正开启一波全新的"攒钱潮". 据余额宝数据显示,截至6月30日,95后通过余额宝货基(货币基金)攒钱的金额 ...

  8. 抨击世俗:月光族 我用奢侈作青春LOGO[转载]

    月光族 我用奢侈作青春LOGO 四川在线-华西都市报 2005年10月26日13:06   http://news.qq.com 拿2000元月薪,敢买1800元的皮包:用Dior香水,却穿不足百元的 ...

  9. BIM技术之Dynamo图元编程:体量族放样并导入revit

    思路:针对异性构件放样(融合)较为便捷,放样指轮廓沿路径扫描得到形体:关键在有轮廓有路径,且互相垂直(在解决复杂构件时,以结果节点为导向的思路极佳) 代码块:solid.bysweep\rectang ...

最新文章

  1. for循环动态的给select标签添加option内容
  2. 填报表中也可以添加 html 事件
  3. 【数据库】分库分表策略
  4. wifi协议栈_一文读懂米家部分智能硬件:米家Zigbee及WiFi模块拆解分析
  5. 动力强劲的星型发动机,为何不用在汽车上呢?
  6. python关于文件的编程题_《Python编程》源代码文件
  7. 优雅的监听软键盘隐藏
  8. 练习-图书馆管理系统
  9. Docker 搭建 LNMP + Wordpress(详细步骤)
  10. 40种让孩子爱上阅读的好方法!转给家长
  11. Unity策略游戏集合
  12. 山东2016年高考高校理工科录取人数统计
  13. pta 7-20 xrf的镜子碎了?
  14. wangEditor上传图片事件抛出处理+解决Form-Making中无法粘贴
  15. 中国电信 合约协议   转载
  16. 最新版Vmware虚拟机的下载方法、详细安装说明
  17. Hadoop集群+Spark集群搭建基于VMware虚拟机教程+安装运行Docker
  18. 数据库(分库分表)中间件对比(转)
  19. Java面试大全(2020年版)101-200
  20. 成都Java开发培训多少钱?贵不贵?

热门文章

  1. 把iPhone的屏幕投影到Mac上
  2. python电脑下载了怎么用-怎样在电脑上下载哔哩哔哩的视频?
  3. 交叉火力dsp手机调音软件_济南冠铭改装东风本田CRV音响二次升级丹拿232+交叉火力A6XS数字音频处理器...
  4. 起飞!通过无线WIFI下载调试FPGA
  5. <Principles of fMRI 1>课程笔记4 心理学推断
  6. 【web-攻击应用程序框架】(12.1)分层架构:攻击与保障
  7. Android记事本定时功能,安卓手机上怎么使用日历记事本?
  8. 云计算原理与实践 第三章、云计算架构
  9. Paper---CNN调参论文参考
  10. 如何成为一个优秀的综合布线培训讲师