zoukankan      html  css  js  c++  java
  • 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~

  • 相关阅读:
    POJ 3114 Tarjan+Dijkstra
    278. First Bad Version
    209. Minimum Size Subarray Sum
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    710. Random Pick with Blacklist
    767. Reorganize String
    524. Longest Word in Dictionary through Deleting
    349. Intersection of Two Arrays
    350. Intersection of Two Arrays II
  • 原文地址:https://www.cnblogs.com/featherl/p/10503658.html
Copyright © 2011-2022 走看看