• python教程(六)·字符串


    我们已经学习了字符串的使用方法,我们还学习了使用索引和分片操作字符串,经历了这么长的时间,相信大家也有所掌握;本节将讨论并学习字符串的格式化与字符串的常用方法

    字符串格式化

    字符串是序列的一种,所以所有的通用序列操作当然都适用啦,这里就不再重复了,下面我们来探讨字符串的格式化

    何为字符串格式化?字符串格式化就是指把数据按照一定的格式组成一个字符串,这貌似很难说清楚,下面来看个例子:

    现有下列变量:

    year = 2018
    month = 3
    day = 9
    

    我们要输出格式为“年|月|日”的字符串,那么我们可以使用加号+来进行拼接字符串:

    output = str(year) + '|' + str(month) + '|' + str(day)
    print(output)
    

    我们将year、month、day三个变量按照一定的格式组成了一个字符串,这样的过程就可以称为字符串格式化。

    然而,今天我们来探讨的不是以这种拼接方式实现的字符串格式化,而是以用数据填充模板的方式来实现,也就是我们给出一个模板“年|月|日”,我们只需要提供三个值,年、月、日,然后就生成我们想要的字符串。

    python支持的字符串格式方式有两种,下面来一一介绍

    传统方式

    第一种字符串格式化使用百分号%来实现,在%的左边是格式化字符串,也就是我们的模板,右边是我们用来格式化的数据(元组类型),也就是用来填充的值,举例如下:

    >>> year = 2018
    >>> month = 3
    >>> day = 9
    >>> output = '%s|%s|%s' % (year, month, day)
    >>> print(output)
    2018|3|9
    >>> 
    

    模板字符串中的%s叫做转换说明符,也叫占位符,就是用来占着位置,等待被替换成提供的值,s表示这个位置将替换成字符串,如果值不是字符串,就使用str函数转换成字符串,完整的转换说明符,由以下部分按顺序组成:

    1. %字符:这是转换说明符的开始
    2. 转换标志(可选):-表示左对齐,+表示在数值前加上正负号,空格表示正数之前保留空格,0表示转换值后位数不足就用0填充
    3. 最小字段宽度(可选):转换后的值不能短于该值指定的宽度,如果该位置写的是*,则宽度由%右边的元组提供
    4. .后跟精度值(可选):如果转换的是浮点数,精度值就表示小数点后的位数,如果转换的是字符串,精度值就表示最大的字段宽度,如果为*,那么该值由%右边的元组提供
    5. 转换类型:看下表:
    转换类型 含义 例子
    d或i 有符号的十进制整数 '%d' % 123 => '123'
    o 无符号的八进制整数 '%o' % 8 => '10'
    u 无符号十进制整数 '%u' % 123 => '123'
    x 无符号十六进制整数(小写) '%x' % 123 => '7b'
    X 无符号十六进制整数(大写) '%x' % 123 => '7B'
    e 科学计数法表示的浮点数(小写) '%e' % 123.456 => '1.234560e+02'
    E 科学计数法表示的浮点数(小写) '%E' % 123.456 => '1.234560E+02'
    f,F 十进制浮点数 '%f' % 123.456 => '123.456000''%F' % 123.456 => '123.456000'
    g 如果指数大于-4或者小于精度值则和e相同,其它情况与f相同
    G 如果指数大于-4或者小于精度值则和E相同,其它情况与F相同
    c 单字符串(ASCII码值或则单字符字符串) '%c' % 65 => 'A''%c' % 'a' => 'a'
    r 字符串(使用repr函数转换任意python对象) 'hello %r!' % 'world' => "hello 'world'!"
    s 字符串(使用str函数转换任意python对象 'hello %s!' % 'world' => 'hello world!'

    看到这个表相信大家都晕了,告诉大家一个秘密,我从来没有记住这个表!⊙▽⊙

    因为一般来说,大多数的值都是可以转换成字符串的,所以最常用的转换说明符也就一个%s(~ ̄▽ ̄)~

    虽然不需要记住那么多的转换类型,但有些细节还是要记住的!

    字段宽度和精度

    字段宽度是转换后的值所占的最少字符个数,精度就是转换后的小数位数(对于浮点数),或者转换后最大字符个数(对于字符串),这两个参数都是整数或者星号*,它们之间用点.分隔(如果只指定宽度不指定精度就不必要使用点.),举例如下:

    >>> '%9f' % 1.0 # 字段宽度为9
    ' 1.000000'
    >>> '%9.1f' % 1.0 # 字段宽度为9精度为1
    '      1.0'
    >>> '%.2f' % 1.1 # 精度为2
    '1.10'
    

    可以看到,转换后的字符串宽度不足时,默认在左边用空格填充

    使用星号*的时候,需提供相应的宽度或精度:

    >>> '%.*s' % (5, 'hello world!')  # 精度为5
    'hello'
    

    标志

    紧接着%,我们可以使用一个标志,这个标志可以是0+-或者空格

    • 0表示数字的填充符使用0:
      >>> '%09f' % 1.0
      '01.000000'
      
    • +表示给数值加上正负号:
      >>> '%+d' % 12
      '+12'
      >>> '%+d' % -12
      '-12'
      
    • -表示左对齐数值:
      >>> '%-9f' % 1.0
      '1.000000 '
      
    • 空格表示在正数前加上空格:
      >>> '% d' % 12
      ' 12'
      >>> '% d' % -12
      '-12'
      

    补充%%表示百分号%本身

    学过C语言的都知道,这种传统的字符串格式化方式和C语言的字符串格式化方式大同小异,但是这种方式正逐渐被python抛弃,python官方推荐下面这种新的字符串格式化方式

    更先进的方式

    python的字符串有一个format方法,这个方法正是使用新版字符串格式化的渠道,下面是用法:

    基本用法:使用{}做占位符,按顺序填充参数:

    >>> 'hello {}, I am {}'.format('world', 'Lee')
    'hello world, I am Lee'
    

    使用数字指定参数的位置(从0开始):

    >>> 'Between {0} and {1}, I like {0}'.format('apple', 'banana')
    'Between apple and banana, I like apple'
    

    使用关键字参数指定参数:

    >>> 'I am {name}, and my age is {age}.'.format(name='Lee', age=18)
    'I am Lee, and my age is 18.'
    >>> d = {'name': 'Lee', 'age': 18}  # 使用字典
    >>> 'I am {name}, and my age is {age}.'.format(**d)  # 展开字典
    'I am Lee, and my age is 18.'
    

    还可以通过列表索引来指定参数:

    >>> lst = ['Lee', 18]
    >>> 'I am {0[0]}, and my age is {0[1]}.'.format(lst)
    'I am Lee, and my age is 18.'
    

    花括号{}中使用冒号:分隔,左边指定字段名(数字,关键字等),右边按顺序指定:

    1. 填充字符:用于填充的字符,默认为空格
    2. 对齐方式
      • ^ 居中
      • < 左对齐
      • > 右对齐
    3. 正负号
      • + 给数字加上正负号
      • - 只给负数加上负号(默认)
      • 空格 给正数加上空格
    4. 宽度:指定最小字段宽度,以0开始表示用0填充
    5. 精度:在宽度字段后添加一个点.再写此字段,表示小数点后的位数(对于浮点数),或者最大字段宽度(对于字符串)
    6. 转换类型:大致与传统方式相同

    补充:两个{表示{本身,两个}表示}本身。

    读者可以参照这篇文章,写得比较详细:Python 中 str.format() 方法详解


    字符串方法

    了解了这么多的字符串格式化方式,该介绍几个字符串常用方法了。

    要记住字符串是不可变的,所以下面介绍到的方法都不会改变原来的字符串!

    find

    find方法用于在一个字符串中查找一个子串,返回第一个匹配字串的首字符索引,如果没有找到就返回-1,举例如下:

    >>> 'hello Lee'.find('Lee')
    6
    >>> 'hello Lee'.find('jack')
    -1
    

    还可以指定查找的起点、终点(不包含):

    >>> s = 'hello Lee'
    >>> s.find('Lee', 7)  # 指定起点
    -1
    >>> s.find('Lee', 0, 9)  # 指定起点和终点
    6
    

    replace

    replace方法用于返回替换后的字符串,如:

    >>> 'hello world!'.replace('world', 'Lee')  # 用'Lee'替换'world'
    'hello Lee!'
    

    translate

    和replace方法类似,但是可以同时替换多个字符,用法如下:

    >>> table = str.maketrans('hw', 'HW') # 制作映射表,h=>H,w=>W
    >>> table
    {104: 72, 119: 87}
    >>> 'hello world'.translate(table)
    'Hello World'
    

    strip

    该方法用于去除两侧指定的字符串(默认为空白符,即空格、制表符、换行符等),如:

    >>> ' hello world     '.strip()
    'hello world'
    >>> '**hello world***'.strip('*')
    'hello world'
    

    补充:lstrip只作用于字符串左端,rstrip只作用于字符串右端

    split和join

    split方法用来讲字符串分割成序列,如:

    >>> s = 'Guangdong, Zhejiang, Shanghai'
    >>> s.split(',')  # 用逗号','作为分割符
    ['Guangdong', ' Zhejiang', ' Shanghai']
    >>> s.split()  # 默认使用空白符(空格、制表符、换行符等)作为分割符
    ['Guangdong,', 'Zhejiang,', 'Shanghai']
    >>> s.split(',', 1)  # 分割1次  
    ['Guangdong', ' Zhejiang, Shanghai']
    

    补充:rsplit从右边开始分割

    join用于将序列连接成字符串,如:

    >>> ','.join(['hello', 'world'])
    'hello,world'
    

    lower和upper

    lower方法和upper方法分别返回转换成小写和大写的字符串,如:

    >>> 'AbcD'.lower()
    'abcd'
    >>> 'AbcD'.upper()
    'ABCD'
    

    本节内容较多,好好消化吧!

    不知道下一次有时间更新又是什么时候咯 ヾ( ̄▽ ̄)Bye~Bye~

  • 相关阅读:
    最近发现一个网站
    2017-0206 委托封装的方法的参数类型
    迈向Angular 2
    趣学CCNA 路由与交换
    HCNA 2017年01月26日
    在linux中使用phpize安装php扩展模块
    接口和抽象类
    C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V110Microsoft.CppCommon.targets(611,5): error MSB
    抽象类和抽象方法
    java数组与内存控制
  • 原文地址:https://www.cnblogs.com/featherl/p/10503658.html
Copyright © 2020-2023  润新知