• python数值与字符串高级用法


    python数值与字符串高级用法

    1.概述

    这篇是一篇没有尽头的文章,每当过段时间,再次打开就会看到不一样的内容,有新东西在更新啊。是啊,之所以取名为高级用法,就是因为它是连载的,一个个有趣的知识点就像是一个个故事。每读一遍都有新的收获。

    2.数值

    2.1.美化数值

    在定义数值字面量时,如果数字特别长可以通过插入_分隔符来让他变得更易读

    # 格式化数值:在定义数值字面量时,如果数字特别长,可以通过插入_分隔符来变得更易读
    # 以千为分隔单位,输出结果(num值为:10000)
    num = 1_000_0
    print(f'num值为:{num}')
    # 输出结果
    num值为:10000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.2.布尔值也是数字

    布尔值的True和False这两个值可以直接当做1和0来使用,利用这个特点,最常用来简化统计总数操作。

    # 统计列表中一共有多少个偶数
    number = [1, 2, 3, 4, 5]
    count = sum(i % 2 == 0 for i in number)
    print(f'输出统计被2整除的总数:{count}')
    
    • 1
    • 2
    • 3
    • 4

    2.3.浮点数

    浮点数是双精度,当计算浮点数时会出现补0的结果,可以使用decimal模块提供的方法代替普通浮点数做运算,它的结果不会损失精度。

    # 使用浮点数进行计算时,结果显示一个近似值 0.30000000000000004,为了解决这个为题我们可以使用decimal.Decimal()模块提供的
    # 方法做运算,他不会损失精度。
    f1 = 0.1
    f2 = 0.2
    print(f'f1浮点数加上f2浮点数的和是:{f1}+{f2} =', f1 + f2)
    
    from decimal import Decimal
    
    # 注意 Decimal的参数必须是字符串类型,否则计算结果就会失效。
    # 结果:0.3
    print(f'使用decimal模块方法对浮点数做运算,计算结果为:', Decimal(str(f1)) + Decimal(str(f2)))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.字符串

    3.1.字符串格式化

    python语言有三种主要的字符串格式化方法

    # C语言格式化风格
    username, score = 'zhanghua', 18
    print('C语言格式化风格: Welcome %s, you score is %d' % (username, score))
    
    # str.format格式化风格
    username, score = 'zhanghua', 18
    print('str.format格式化风格:Welcome {}, you score is {:d}'.format(username, score))
    
    # str.format通过索引重复使用同一个变量
    username, score = 'zhanghua', 18
    print('str.format重复使用变量方式:you are {0}? Yes I am {0}, you score is {1}'.format(username, score))
    
    # f-string 格式化风格
    username, score = 'zhanghua', 18
    print(f'f-string格式化风格:Welcome {username}, you score is {score}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.2.字符串方法

    1.拼接字符串 str.join

    假如要拼接字符串,首先创建一个空列表,然后把需要拼接的字符串都放假列表,最后调用str.join来拼接字符串

    words = []
    str = 'abcdefg'
    for i in str:
        words.append(i)
    print('-'.join(words))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.判断字符串是否包含数字 str.isdigit

    # 判断字符串是否只包含数字
    only_str_contain_num = '123'
    print(only_str_contain_num.isdigit())
    
    • 1
    • 2
    • 3

    3.分隔字符串 str.partition

    str.partition(sep) 方法的功能是按照分隔符sep切分字符串,返回一个包含三个成员的数组(分隔符前的内容,分隔符,分隔符后的内容)。

    # 假如将字符串按照分隔符:切分字符串,如果有冒号则输出冒号后面的值,如果没有则输出空。使用split方法需要判断是否有冒号,
    # 使用split方法需要对参数做判断。
    def extract_value(s: str):
        item = s.split(':')
        # 因为字符串不一定包含冒号,所以需要对字符串长度进行判断。
        if len(item) == 2:
            print(item[1])
        else:
            print('')
    
    extract_value('name:zhangsan')
    extract_value('name')
    
    # 使用partition方法则一行就能完成任务,代码非常的优雅。
    def extract_vale2(s: str):
        # 当s包含分隔符:时,元组最后一个成员刚好是value
        # 若是没有分隔符,最后一个字符串默认是空字符串
        return s.partition(':')[-1]
    
    print(extract_vale2('name : zhangsan'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4.替换多个字符 str.translate

    str.translate(table)方法可以按照规则一次性替换多个字符,比使用replace方法更简单。

    # translate(table)方法一次性替换多个字符,比replace方法更简单
    s = '这是中文,为什么要用英文符号.'
    # 创建替换规则表
    table = s.maketrans(',.', ',。')
    print(s.translate(table))
    # 使用replace需要两次才能替换完成。
    s1 = s.replace(',', '-')
    print(s1.replace('.', '!'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.3.字符串与字节串

    字符串:字符串是给人看的,对应python中的str类型,str使用Unicode标准,可通过.encode()方法编码为字节串
    字节串:二进制字符串是给机器看的,对应python的bytes类型。bytes一定包含某种字符串编码格式,默认为UTF-8,可通过.decode()方法解码为字符串。

    # 字符串与字节串转换
    str_obj = 'Hello 世界'
    print('字符串', type(str_obj))
    
    bin_str = str_obj.encode('UTF-8')
    print('字节串', type(bin_str))
    
    # 创建字面量字节串,只需要在字符串前加一个字母b做前缀
    bin_obj = b'Hello'
    print('定义字面量字节串:', bin_obj)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4.编程建议

    4.1.用字符代替数字改善代码可读性

    当代码中出现很多数字,且数字代表的意义不是数字本身而是其他的含义,比如1代表普通用户,2代表临时用户,3代表VIP用户,像这样的数字在代码中会让阅读代码的读者感觉晦涩难懂,没有可读性。

    通常使用常量和枚举类代替数字,提升代码的可读性。下面举个常量和枚举类代替数字的例子。
    使用常量和枚举类代替数字的好处:

    • 更易读:所有人都不需要记忆某个数字代表什么
    • 更健壮:降低输错数字或字母产生bug的可能性
    def add_daily_points(user):
        '''
        用户每天完成第一次登录后,为其增加积分。这段代码用数字代表了不同的含义,
        阅读这段代码的时候根本无法从数字中了解代码逻辑,阅读晦涩难懂。
        :param user:
        :return:
        '''
    
        # 代码中用数字表示不同类型的用户和不同类型的积分,无法从代码中看出它的含义,阅读代码晦涩难懂。这样的代码需要优化
        if user.type == 13:
            return
        if user.type == 3:
            user.points += 120
            return
        user.points += 100
        return
        
    '''
    常量代表不同类型的积分,枚举类将不同类型的用户进行分类。
    下面优化后的代码阅读起来简单易懂,提升了代码的阅读性。
    '''
    
    # python里没有真正的常量常量类型,一般把大写的字母全局变量当常量来用
    # 用户每日奖励积分数量
    DAILY_POINTS_REWARDS = 100
    # VIP用户每日额外奖励分数
    VIP_EXTRA_POINTS = 20
    
    from enum import Enum
    
    class UserType(int, Enum):
        '''
        在定义枚举类型时,如果同时继承基础类型,比如int,str 枚举类就能同时
        充当该基础类型使用。比如这里UserType就当int使用。
        '''
        # VIP用户
        VIP = 3
        # 小黑屋用户
        BANNED = 13
    
    def add_daily_pointsd(user):
        if user.type == UserType.BANNED:
            return
        if user.type == UserType.VIP:
            user.points = DAILY_POINTS_REWARDS + VIP_EXTRA_POINTS
            return
        user.points = DAILY_POINTS_REWARDS
        return
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    4.2.不必预计算字面量表达式

    # 不必预计算字面量表达式,当我们需要用到复杂计算的数字字面量时,不需要提前计算出结果,保留整个算式即可。
    
    def do_something(delta_seconds):
        # 提前计算出11天是多少秒,这就是预计算字面量。对于读者来说并不知道这个数字是怎么来的,还需要加上注释。
        if delta_seconds < 950400:
            return
    
        # 所以建议不必预计算字面量的值,下面是优化后的代码.当我们需要用到复杂计算的数字字面量时,请保留整个算式把。
        # 这样做对性能没有任何影响,会让代码更易阅读。
        if delta_seconds < 11 * 24 * 3600:
            return 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.3.使用特殊数字

    4.4.改善超长字符串可读性

    4.5.别让了r开头的字符串内容方法

    4.6.不要害怕字符串拼接

  • 相关阅读:
    java毕业设计藏宝阁游戏交易系统Mybatis+系统+数据库+调试部署
    linux 安装配置github
    53. 寻宝(第七期模拟笔试)(最小生成树练习)
    Java多线程探究【三线程同步】
    font-spider 压缩字体使用
    Supervisor启动并管理Celery相关进程
    Spring Boot 2.x源码系列【5】启动流程深入解析之准备环境
    Postman —— postman实现参数化
    构建curl 静态库 vs2012win7可用
    Python中zip函数的使用方法
  • 原文地址:https://blog.csdn.net/m0_38039437/article/details/126293220