• 06-01字符串格式化.md


    字符串格式化

    字符串格式化是拼接字符串的一种手段

    字符串的几种连接方式

    • join和 + 拼接字符串难以控制格式

    str.join连接,将可迭代对象转换为字符串

    str.join连接,将可迭代对象转换为字符串
    注意:此操作会返回一个新的字符串对象,但不会操作原有可迭代对象

    In [73]: lst = ['i', 'am', 'comyn']
    
    In [74]: ' '.join(lst)   # join是字符串的方法,参数是可迭代对象,接收者是分隔符
    Out[74]: 'i am comyn'
    
    In [76]: ','.join(lst)
    Out[76]: 'i,am,comyn'
    
    In [77]: ''.join(lst)
    Out[77]: 'iamcomyn'
    

    +号连接,返回一个新的字符串

    In [1]: 'i' + 'love' + 'python'                                                                                                                                      
    Out[1]: 'ilovepython'
    

    printf style字符串格式化

    • printf style字符串格式化:从C语言继承过来的。
    • printf style格式化对从其他语言, 尤其是C语言转过来的, 非常容易接受, 但是并不是Python所推荐的方法
    s = 'i love %s'    # 待格式化的字符串, 当一个字符串存在占位符的时候, 占位符:%加一个格式控制符
    
    In [6]: s = 'i love %s'
    
    In [7]: s % ('python', )   # 传入参数顺序的替换占位符, 返回替换后的字符串。原串不变的
    Out[7]: 'i love python'
    
    In [10]: 'i love %s, i am %d' % ('python', 18)   # 多少个占位符需要传入多少个值
    Out[10]: 'i love python, i am 18'
    
    IIn [11]: 'i love %s, i am %d' % ('python', )   # 如果少传会抛出TypeError
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-11-6aabfc9d03a3> in <module>()
    ----> 1 'i love %s, i am %d' % ('python', )
    
    TypeError: not enough arguments for format string
    
    格式说明符:
        d:int类型, 数字
        i:int类型, 数字
        o:有符号的八进制数
        u:int类型
        x:小写16进制
        X:大写16进制
        e:小写的科学计数法
        E:大写的科学计数法
        f:浮点数
        F:浮点数
        G:指数或浮点数(根据显示长度)
        g:指数和浮点数(根据显示长度)
        r:
        s:
        %:代表占位符的开始
    
    In [15]: s = 'i love %s, i am %d'
    
    In [16]: s % ('python', 18)
    Out[16]: 'i love python, i am 18'
    
    In [17]: s % ('python', '18')   # 如果类型不匹配就会抛出TypeError
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-17-d1dde78cf999> in <module>()
    ----> 1 s % ('python', '18')
    
    TypeError: %d format: a number is required, not str
    
    In [18]: s % (18, 18)   # 当占位符是%s, 其实隐式的调用了str()
    Out[18]: 'i love 18, i am 18'
    
    In [19]: '%r' % 18   # %r隐式调用了repr()
    Out[19]: '18'
    
    In [21]: print('%s')
    %s
    
    In [22]: print('%s %d')
    %s %d
    

    format字符串格式化

    1. format方法使用大括号做为占位符:'i love {}'.format('python')
    2. 可以有多个大括号和对应的多个值。当传入的值比大括号少时报错IndexError,当传入的值比大括号多时则忽略掉多余的值
    3. 位置参数:s = 'i love {1}, i am {0}'
      • 参数可以通过指定位置方式多次使用:'{0} {0}'.format('hahahaha')
    4. 关键字参数:'i love {lang} i am {age}'.format(lang='python', age=18)
    5. 同时支持位置参数和关键字参数
      • 位置参数和关键字参数混用的时候, 位置参数必须在前面, 关键字参数在后面
    6. 占位符和参数不匹配, 会抛出异常(上个是参数个数)
      • {} 按照顺序,使用位置参数
      • {数字 i} 会把位置参数当成一个列表 args, args[i]; 当i不是args的索引的时候, 抛出IndexError
      • {关键字 k} 会把关键字参数当成一个字典kwargs, 使用kwargs[k]; 当k不是kwargs的key时,会抛出KeyError
    7. 转义:'{{}}'.format()
    8. 使用建议
      • python 2.6版本, 不能省略大括号里的数字或者关键字
      • 通常使用2.6(含)之后的版本用Format方法, 2.6之前使用printf style
    In [24]: s = 'i love {}'   # format方法使用大括号做为占位符
    
    In [25]: s.format('python')   # 当调用format方法时,format传入的参数会替代大括号
    Out[25]: 'i love python'
    
    In [26]: s = 'i love {} i am {}'
    
    In [28]: s.format('python', 18 )  # format方法的参数个数是可变的
    Out[28]: 'i love python i am 18'
    
    In [29]: s = 'i love {1}, i am {0}'   # 可以在占位符加数字指定format参数的位置
    
    In [30]: s.format(18, 'python')
    Out[30]: 'i love python, i am 18'
    
    In [31]: '{0} {0}'.format('hahahaha')    # 参数可以通过指定位置方式多次使用
    Out[31]: 'hahahaha hahahaha'
    
    In [32]: 'i love {lang} i am {age}'.format(lang='python', age=18)   # 可以在占位符里加标示符,来使用关键字参数
    Out[32]: 'i love python i am 18'
    
    In [33]: 'my name is {0} i love {lang} i am {age}'.format('comyn', lang='python', age=18)   # 同时支持位置参数和关键字参数
    Out[33]: 'my name is comyn i love python i am 18'
    
    位置参数和关键字参数混用的时候, 位置参数必须在前面, 关键字参数在后面
    
    In [34]: '{} {}'.format(18)   # 占位符和参数个数不匹配,会抛出异常
    ---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    <ipython-input-34-21db8d47c754> in <module>()
    ----> 1 '{} {}'.format(18)
    
    IndexError: tuple index out of range
    
    In [35]: '{} {lang}'.format(18)
    ---------------------------------------------------------------------------
    KeyError                                  Traceback (most recent call last)
    <ipython-input-35-afb26cfd80bf> in <module>()
    ----> 1 '{} {lang}'.format(18)
    
    KeyError: 'lang'
    
    In [36]: '{1} {2}'.format(0, 1, 2)   # 占位符和参数个数不匹配, 不抛出异常的场景
    Out[36]: '1 2'
    
    In [108]: '{1}, {2}, {3}'.format(0, 1, 2)     # 占位符个数匹配了, 依然会抛出异常
    ---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    <ipython-input-108-8745c3f7069b> in <module>()
    ----> 1 '{1}, {2}, {3}'.format(0, 1, 2)
    
    IndexError: tuple index out of range
    
    占位符和参数不匹配, 会抛出异常(上个是参数个数)
        {} 按照顺序,使用位置参数
        {数字 i} 会把位置参数当成一个列表 args, args[i]; 当i不是args的索引的时候, 抛出IndexError
        {关键字 k} 会把关键字参数当成一个字典kwargs, 使用kwargs[k]; 当k不是kwargs的key时,会抛出KeyError
    
    
    In [39]: '{{}}'.format()   # 转义出{}
    Out[39]: '{}'
    
    In [42]: '{{}} {}'.format(18)
    Out[42]: '{} 18'
    
    In [44]: '{{{}}}'.format(18)   # 一层转义
    Out[44]: '{18}'
    
    In [45]: '{{{{{}}}}}'.format(18)   # 两层转义
    Out[45]: '{{18}}'
    
    format还有更多用法, 其他用法请参考官方文档
    python 2.6版本, 不能省略大括号里的数字或者关键字
    通常使用2.6(含)之后的版本用Format方法, 2.6之前使用printf style
    
  • 相关阅读:
    [Codeforces809D] Hitchhiking in the Baltic States
    [Codeforces1148H] Holy Diver
    [PKUWC2018]猎人杀
    [Codeforces566C] Logistical Questions
    越野赛车问题
    Suffix Array
    第05组(65) 需求分析报告
    第05组(65) 团队展示
    第三次作业
    结对编程作业
  • 原文地址:https://www.cnblogs.com/cishi/p/12984493.html
Copyright © 2020-2023  润新知