您当前的位置: 首页 >  Python

Bulut0907

暂无认证

  • 6浏览

    0关注

    346博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Python atexit程序退出前执行代码、import、工作日节假日判断、身份证号码验证

Bulut0907 发布时间:2020-11-16 12:15:30 ,浏览量:6

目录
  • 1. atexit(程序结束前的操作)
  • 2. linux系统import自定义模块失败
  • 3. 判断一天是节假日还是工作日
  • 3. 验证身份证号码是否正确

1. atexit(程序结束前的操作)
import atexit

if __name__=="__main__":
    count = 0

    @atexit.register
    def exit_print_count():
        print(count)

    count += 1

    print("hello world")

结果如下:

hello world
1

说明:

  • atexit适用于程序正常完成、异常完成,但不适用于手动终止程序
  • 如果Exception在@atexit.register之前抛出,也不会执行register函数的
@atexit.register
def exit_print_count():
    print(count)

程序在完成前会执行atexit.py中的register函数,而register函数需要接收一个函数类型的参数,该参数就是下面的exit_print_count函数,所以就会执行exit_print_count函数;这是python的一种语法糖

  • 从上面的结果可以看到,count是累加后最终的结果值
2. linux系统import自定义模块失败

错误详情如下:

    from my_prop import my_prop
ModuleNotFoundError: No module named 'my_prop'

原因是linux系统并不能将我们的项目根目录添加到python的system path下,需要我们在程序中手动添加

import os
import sys
current_path = os.path.abspath(os.path.dirname(__file__))
project_root_path = current_path[:current_path.find("project_name/")+len("project_name/")]
sys.path.append(project_root_path)
3. 判断一天是节假日还是工作日
  1. 安装包
pip install chinesecalendar
  1. 使用说明
  • is_workday方法:判断是否为工作日,返回值为bool类型
  • is_holiday方法:判断是否为节假日,返回值为bool类型
  1. 例子
from chinese_calendar import is_workday, is_holiday
import datetime
from datetime import timedelta

def workdayCountFunc(endDate, beginDate):
    workdayCount = 0

    while True:
        beginDate += timedelta(days=1)

        if beginDate >= endDate:
            break
        else:
            if is_workday(beginDate):
                workdayCount += 1

    return workdayCount


if __name__ == '__main__':


    date1 = datetime.date(2021, 10, 7)      # 国庆的最后一天假期, 星期四
    print(is_workday(date1))    
    print(is_holiday(date1))

    date2 = datetime.date(2021, 10, 9)      # 补班, 星期六
    print(is_workday(date2))
    print(is_holiday(date2))

    workdayCount = workdayCountFunc(date2,date1)		# 10月8号星期五,是正常上班的
    print(workdayCount)

执行结果如下:

False
True
True
False
1
3. 验证身份证号码是否正确

18位身份证的最后一位是验证位,范围为0-10,如果是10,则用字母x代替

验证规则如下:

  1. 将身份证号码前17位数分别乘以不同的系数。从第1位到第17位对应的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2
  2. 将17位数字和系数相乘的结果相加。然后除以11,得到一个余数,余数的范围为0-10
  3. 余数分别对应1、0、10、9、8、7、6、5、4、3、2这11个检验码
  4. 看最后得到的检验码,如果和身份证的最后一位相同,则身份证号码正确,如果不相同,则身份证号码错误

实现代码如下:

if __name__ == '__main__':

    def id_card_verify(id_card_str):
        id_card_number_alphabets = list(id_card_str)

        x_list = ['x', 'X']
        # 将字符x或X替换为10
        id_card_numbers = ['10' if id_card_number_alphabet in x_list else id_card_number_alphabet
                           for id_card_number_alphabet in id_card_number_alphabets]

        factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]

        sum = 0
        for i in range(17):
            sum += (int(id_card_numbers[i]) * factor[i])

        check_code = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]
        if check_code[sum % 11] == int(id_card_numbers[17]):
            return '身份证号码正确'
        else:
            return '身份证号码错误'

    id_card_str = '43042219xxxx14xxxx'
    verify_msg = id_card_verify(id_card_str)
    print(verify_msg)
关注
打赏
1664501120
查看更多评论
立即登录/注册

微信扫码登录

0.0404s