【Python打卡2019】20190430之根据日期判断为当年哪一天-字典使用

本文介绍了一种使用Python字典数据结构来高效计算输入日期为当前年份第几天的方法。通过创建一个字典,将月份作为键,对应的天数作为值,实现了将月份与天数的一一对应。此外,还考虑了闰年的情况,确保计算的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.任务分析与描述

此前的实现当中,我们都使用的是普通的元素集合,将月份和天数分开存储;
我们在Java中经常使用map类型进行键值对的存储,键值对能够满足将月份和天数一一对应的需求;
在Python中,我们可以通过字典来实现。

1.字典
  • 字典可以通过dict()函数创建,也可以直接使用{};
  • 字典中的元素无序,其中的元素为键值对形式(创建时逗号隔开两个键值对,冒号隔开键与值);
  • 添加元素直接赋值,如d[1]=2;则d中为{1:2}
  • 删除元素用del d[key];取出元素使用d[key]即可;
  • 字典其他用法可以参考我室友的博客:https://blog.youkuaiyun.com/MessiNine/article/details/80443442
2.程序与结果
"""
    判断输入日期为当前年份的第几天
    用列表代替元组
    +用集合set取代列表
    +使用字典取代set
"""
from datetime import datetime


def is_leap_year(year):
    return (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0)


def cal_which_day(date_str):
    input_date = datetime.strptime(date_str, "%Y/%m/%d")
    year = input_date.year
    month = input_date.month
    day = input_date.day

    # _31_days_month_set = {1, 3, 5, 7, 8, 10, 12}  # 大括号直接创建集合
    # _30_days_month_set = {4, 6, 9, 11}
    # 用字典代替集合,因为字典可以存储键值对,刚好可以将月份与其天数对应起来
    month_days_dict = {1: 31, 2: 28, 3: 31, 4: 30, 5: 31, 6: 30,
                       7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}

    total_month_days = 0

    # 这样的话,我们看一从1月计算到month月来进行天数的计算
    for i in range(1, month):  # range(1, n)表示从1月到month-1月,正好满足我们的需要
        total_month_days += month_days_dict[i]

    if is_leap_year(year) and month > 2:  # 如果是闰年,且大于2月,+1
        total_month_days += 1

    total_days = total_month_days + day

    return total_days


def main():
    input_date_str = input("请输入日期(yyyy/mm/dd):")
    which_day = cal_which_day(input_date_str)
    print("{}是当年的第{}天~(字典取代集合)".format(input_date_str, which_day))


if __name__ == '__main__':
    main()
Y:\Python\Anaconda\python.exe Y:/PythonWorkspace/lect06/WhichDay4.py
请输入日期(yyyy/mm/dd):2016/04/30
2016/04/30是当年的第121天~(字典取代集合)

Process finished with exit code 0
Python中实现打卡兑换礼物的功能,通常会涉及到以下几个步骤: 1. **数据结构设计**:创建一个数据库或数据结构来存储用户的打卡记录,比如字典或列表,其中每个元素包含用户ID、日期等信息。 ```python users_gifts = {} # 使用字典,key为用户ID,value为打卡记录 ``` 2. **添加打卡功能**:编写函数,当用户调用时,检查用户是否存在并更新打卡次数。例如,可以使用`datetime`库来记录每日打卡时间。 ```python import datetime def check_in(user_id): today = datetime.datetime.now().strftime("%Y-%m-%d") if user_id not in users_gifts: users_gifts[user_id] = {today: 1} else: if today not in users_gifts[user_id]: users_gifts[user_id][today] = 1 else: users_gifts[user_id][today] += 1 ``` 3. **条件判断与兑换规则**:设定一个规则,如连续7天打卡即可兑换一份礼物。可以遍历用户的打卡记录,检查是否符合条件。 ```python def can_exchange(user_id): user_history = users_gifts.get(user_id, {}) consecutive_days = {} for date, count in user_history.items(): if date - consecutive_days.get(date, '') <= datetime.timedelta(days=6): # 连续6天 consecutive_days[date] = count if len(consecutive_days) == 7: # 找到7连日 return True return False ``` 4. **兑换操作**:如果满足兑换条件,可以删除已达到兑换的打卡记录,并通知用户兑换成功。 ```python def redeem_gift(user_id): if can_exchange(user_id): for day, _ in list(users_gifts[user_id].items())[:7]: # 删除前7天的打卡记录 del users_gifts[user_id][day] print(f"恭喜用户{user_id},您的7天连续打卡已成功兑换礼物!") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值