zoukankan      html  css  js  c++  java
  • Python3版本号比较代码实现

    一、版本号比较的困难

    不能直接以字符串形式进行比较:对于1.3和1.4直接以字符串进行比较是可以正确得出1.4比1.3大;但如果是1.3和1.14还直接进字符串比较那就是1.3比1.14大那就不对了。

    不能直用用数值类型进行比较:如果版本号是1和2那可以自接以整型进行比较,如果是1.3和1.4可以直接以浮点型进行比较;但如果是1.3.1和1.4.1这种形式,那整型和浮点型都不能用了。

    二、版本号比较实现思路

    最关键的点就是每次取一节版本号、转换成整型进行比较;比如1.2.3和1.2.14,先比较1,再比较2,最后再比较3得14。

    三、实现

    3.1 实现效果

    3.2 实现代码

    compare_version----递归实现版本比较

    pick_up_latest_version----调用compare_version,打印最终的版本比较结果

    # version1----第一个要比较的版本字符串
    # version2----第二个要比较的版本字符串
    # split_flag----版本分隔符,默认为".",可自定义
    # 返回值----相等返回0,version1比version2大返回1,version2比version1大返回2
    # 接受的版本字符形式----空/x/x.y/x.y./x.y.z;两个参数可为前边列出的形式的任一种
    def compare_version(version1=None,version2=None,split_flag="."):
        # 如果存在有为空的情况则进入
        if (version1 is None) or (version1 == "") or (version2 is None) or (version2 == ""):
            # version1为空且version2不为空,则返回version2大
            if ((version1 is None) or (version1 == "")) and (version2 is not None) and (version2 != ""):
                return 2
            # version2为空且version1不为空,则返回version1大
            if ((version2 is None) or (version2 == "")) and (version1 is not None) and (version1 != ""):
                return 1
    
        # 如果版本字符串相等,那么直接返回相等,这句会且只会在第一次比较时才可能进入
        # version1和version2都为空时也会进入这里
        if version1 == version2:
            return 0
    
        # 对版本字符串从左向右查找".",第一个"."之前的字符串即为此次要比较的版本
        # 如1.3.5中的1
        try:
            current_section_version1 = version1[:version1.index(split_flag)]
        except:
            current_section_version1 = version1
        try:
            current_section_version2 = version2[:version2.index(split_flag)]
        except:
            current_section_version2 = version2
        # 对本次要比较的版本字符转成整型进行比较
        if int(current_section_version1) > int(current_section_version2):
            return 1
        elif int(current_section_version1) < int(current_section_version2):
            return 2
    
        # 如果本次传来版本字符串中已没有版本号分隔符,那说明本次比较的版本号已是最后一位版本号,下次比较值赋空
        # 如本次传来的是5,那下次要比较的只能赋空
        try:
            other_section_version1 = version1[version1.index(split_flag)+1:]
        except:
            other_section_version1 = ""
        try:
            other_section_version2 = version2[version2.index(split_flag) + 1:]
        except:
            other_section_version2 = ""
    
        # 递归调用比较
        return compare_version(other_section_version1,other_section_version2)
    
    # 此函数调用compare_version(),打印比较结果
    def pick_up_latest_version(version1,version2):
        flag = compare_version(version1,version2)
        if flag == 0:
            print(f"version1 = {version1}, version2 = {version2}, the two version is equal")
        elif flag == 1:
            print(f"version1 = {version1}, version2 = {version2}, the latest version is version1 {version1}")
        elif flag == 2:
            print(f"version1 = {version1}, version2 = {version2}, the latest version is version2 {version2}")
  • 相关阅读:
    [转]Kqueue与epoll机制
    [转]Docker中的镜像
    [转]linux awk命令详解
    [转]Linux Shell 1>/dev/null 2>&1 含义
    file_get_contents(): SSL operation failed with code 1...解决办法和stream_context_create作用
    PHP abstract与interface之间的区别
    PHP基于Redis的全局订单号id
    Eclipse for php+Xdebug,搭建php单步调试环境
    Eclipse launch configuration----Eclipse运行外部工具
    MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转
  • 原文地址:https://www.cnblogs.com/lsdb/p/11026890.html
Copyright © 2011-2022 走看看