数据类型-字符串

在python中,字符由单引号,双引号,引起来的形式,称之为字符串。python不支持单字符类型,单个字符在python中也被认为是字符串。python字符串是不可变的。在所有编程语言中,字符串几乎无所不在,编程的本质就是对数据的加工处理,对字符串处理的能力是编程最重要的能力之一。

标准序列操作(索引、切片、加法、乘法、成员资格检查、长度、最小值和最大值)都适用于字符串,但别忘了字符串是不可变的,因此所有的元素赋值和切片赋值都是非法的。

  1. #字符串相加
  2. a = '世界'
  3. b = '你好'
  4. print(a + b)
  5. 结果:
  6. 世界你好
  7. #字符串相乘
  8. a = '坚强'
  9. print(a * 8)
  10. 结果:
  11. 坚强坚强坚强坚强坚强坚强坚强坚强
  12. #字符串索引
  13. name = 'meet'
  14. # 索引 0123
  15. print(name[0])
  16. 结果:
  17. m
  18. name = 'meet'
  19. # 索引 -4-3-2-1
  20. print(name[-1])
  21. 结果:
  22. t
  23. #字符串切片
  24. name = 'meet'
  25. # 索引 0123
  26. print(name[0:3])
  27. 结果:
  28. mee
  29. name = 'meet'
  30. # 索引 0123
  31. print(name[0:3:2])
  32. 结果:
  33. me
  34. #字符串长度、最大值、最小值、成员资格检查
  35. In [1]: len('nihao')
  36. Out[1]: 5
  37. In [3]: max('aznihao')
  38. Out[3]: 'z'
  39. In [4]: min('aznihao')
  40. Out[4]: 'a'
  41. In [8]: 'i' in 'andcisoaqew'
  42. Out[8]: True

设置字符串的格式

传统的方式

Python提供了多种字符串格式设置方法。以前,主要的解决方案是使用字符串格式设置运算符——百分号。这个运算符的行为类似于C语言中的经典函数printf:在%左边指定一个字符串(格式字符串),并在右边指定要设置其格式的值。指定要设置其格式的值时,可使用单个值(如字符串或数字),可使用元组(如果要设置多个值的格式),还可使用字典,其中最常见的是元组。

  1. >>> format = "Hello, %s. %s enough for ya?"
  2. >>> values = ('world', 'Hot')
  3. >>> format % values
  4. 'Hello, world. Hot enough for ya?'

上述格式字符串中的%s称为转换说明符,指出了要将值插入什么地方。s意味着将值视为字符串进行格式设置。如果指定的值不是字符串,将使用str将其转换为字符串。

  1. name = input('请输入姓名:')
  2. age = input('请输入年龄:')
  3. job = input('请输入职业:')
  4. hobby = input('请输入爱好:')
  5. msg = '''
  6. ------------ info of barry Li ----------
  7. Name : %s
  8. Age : %s
  9. job : %s
  10. Hobbie: %s
  11. ------------- end ----------------
  12. '''
  13. print(msg%(name,age,job,hobby))

%d或者%i表示数字格式

  1. name = input('>>>')
  2. s1 = '1234%d'%int(name)
  3. s2 = '1234%i'%int(name)
  4. print(s1)
  5. print(s2)
  6. 结果:
  7. >>>89
  8. 123489
  9. 123489
  10. # %d和%i这种格式化只能用数字来填补占位

%f表示浮点数格式

  1. >>> print("this number is %f") % 100.105
  2. this number is 100.105000
  3. >>> print("this number is %.3f") % 100.105
  4. this number is 100.105 #小数点后3位
  5. >>> print("this number is %.2f") % 100.105 #小数点后2位
  6. this number is 100.11

%%

  1. num = input('>>>')
  2. s= '目前学习进度:%s%%'%num
  3. print(s)
  4. 结果:
  5. >>>80
  6. 目前学习进度:80%
  7. # 如果我们字符串中想要显示单独的%就需要用来个%%来转义,不然程序会认为那是一个占位

新的字符串格式化方法:format

每个值都被插入字符串中,以替换用花括号括起的替换字段。要在最
终结果中包含花括号,可在格式字符串中使用两个花括号(即{{或}})来指定。

在最简单的情况下,替换字段没有名称或将索引用作名称。

  1. >>> "{}, {} and {}".format("first", "second", "third")
  2. 'first, second and third'
  3. >>> "{0}, {1} and {2}".format("first", "second", "third")
  4. 'first, second and third'

索引无需像上面这样按顺序排列。

  1. >>> "{3} {0} {2} {1} {3} {0}".format("be", "not", "or", "to")
  2. 'to be or not to be'

还可以使用关键字参数

  1. >>> from math import pi
  2. >>> "{name} is approximately {value}.".format(value=pi, name="π")
  3. 'π is approximately 3.141592653589793.'
  4. >>> "{name} is approximately {value:.2f}.".format(value=pi, name="π")
  5. 'π is approximately 3.14.'

在Python 3.6中,如果变量与替换字段同名,还可使用一种简写。在这种情况下,可使用f字符串——在字符串前面加上f。

  1. >>> from math import e
  2. >>> f"Euler's constant is roughly {e}."
  3. "Euler's constant is roughly 2.718281828459045."

再看一个例子:

  1. >>> name = "蔡徐坤"
  2. >>> print(f'篮球天才{name}')
  3. 篮球天才蔡徐坤

打印出花括号

  1. In [13]: "{{这将把花括号打印出来}}".format()
  2. Out[13]: '{这将把花括号打印出来}'

替换字段由如下部分组成,其中每个部分都是可选的。

  • 字段名:索引或标识符,指出要设置哪个值的格式并使用结果来替换该字段。除指定值外,还可指定值的特定部分,如列表的元素。
  • 转换标志:跟在叹号后面的单个字符。当前支持的字符包括r(表示repr)、s(表示str) 和a(表示ascii)。如果你指定了转换标志,将不使用对象本身的格式设置机制,而是使用指定的函数将对象转换为字符串,再做进一步的格式设置。
  • 格式说明符:跟在冒号后面的表达式(这种表达式是使用微型格式指定语言表示的)。格式说明符让我们能够详细地指定最终的格式,包括格式类型(如字符串、浮点数或十六进制数),字段宽度和数的精度,如何显示符号和千位分隔符,以及各种对齐和填充方式。

字段名部分可使用索引,还可使用句点表示法来访问导入的模块中的方法、属性、变量和函数

  1. >>> fullname = ["Alfred", "Smoketoomuch"]
  2. >>> "Mr {name[1]}".format(name=fullname)
  3. 'Mr Smoketoomuch'
  4. >>> import math
  5. >>> tmpl = "The {mod.__name__} module defines the value {mod.pi} for π"
  6. >>> tmpl.format(mod=math)
  7. 'The math module defines the value 3.141592653589793 for π'

转换标志

  1. In [19]: print("{pi!s} {pi!r} {pi!a}".format(pi="π"))
  2. π 'π' '\u03c0'

上述三个标志(s、r和a)指定分别使用str、repr和ascii进行转换。函数str通常创建外观普通的字符串版本(这里没有对输入字符串做任何处理)。函数repr尝试创建给定值的Python表示(这里是一个字符串字面量)。函数ascii创建只包含ASCII字符的表示。

转换值类型

  1. #将数值转换成浮点数
  2. >>> "The number is {num:f}".format(num=42)
  3. 'The number is 42.000000'
  4. #将数值转换成二进制
  5. >>> "The number is {num:b}".format(num=42)
  6. 'The number is 101010'
  7. #将数值转换成八进制
  8. >>> "The number is {num:o}".format(num=42)
  9. 'The number is 52'
  10. #将数值转换成十六进制
  11. >>> "The number is {num:x}".format(num=42)
  12. 'The number is 2a'
  13. #将数值表示为百分比值(乘以100,按说明符f设置格式,再在后面加上%)
  14. >>> "The number is {num:%}".format(num=0.42)
  15. 'The number is 42.000000%'

宽度、精度和千位分隔符

宽度是使用整数指定的:

  1. >>> "{num:10}".format(num=3)
  2. ' 3'
  3. >>> "{num:10}".format(num="Bob")
  4. 'Bob '

精度也是使用整数指定的,但需要在它前面加上一个表示小数点的句点。

  1. >>> from math import *
  2. >>> "{pi:10.2f}".format(pi=pi)
  3. ' 3.14'
  4. >>> "将其精确到小数点后3位:{:.3f}".format(5.6786)
  5. '将其精确到小数点后3位:5.679'

实际上,对于其他类型也可指定精度,但是这样做的情形不太常见。

  1. >>> "{:.5}".format("Guido van Rossum")
  2. 'Guido'

可使用逗号来指出你要添加千位分隔符

  1. >>> 'One googol is {:,}'.format(2**32)
  2. 'One googol is 4,294,967,296'

同时指定其他格式设置元素时,这个逗号应放在宽度和表示精度的句点之间。

符号、对齐和用 0 填充

在指定宽度和精度的数前面,可添加一个标志。这个标志可以是零、加号、减号或空格,其中零表示使用0来填充数字。

  1. >>> from math import pi
  2. >>> '{:010.2f}'.format(pi)
  3. '0000003.14'

要指定左对齐、右对齐和居中,可分别使用<、>和^。

  1. #左对齐
  2. >>> '{:<10.2f}'.format(pi)
  3. '3.14 '
  4. #居中对齐
  5. >>> '{:^10.2f}'.format(pi)
  6. ' 3.14 '
  7. #右对齐
  8. >>> '{:>10.2f}'.format(pi)
  9. ' 3.14'

可以使用填充字符来扩充对齐说明符,这样将使用指定的字符而不是默认的空格来填充。

  1. #用*号字符填充,并左对齐
  2. >>> '{:*>20.2f}'.format(pi)
  3. '****************3.14'
  4. #用*号字符填充,并居中对齐
  5. >>> '{:*^20.2f}'.format(pi)
  6. '********3.14********'
  7. #用*号字符填充,并右对齐
  8. >>> '{:*<20.2f}'.format(pi)
  9. '3.14****************'

总结如图

4. 数据类型:字符串 - 图1

字符串格式设置实例

  1. # 根据指定的宽度打印格式良好的价格列表
  2. width = int(input('Please enter width: '))
  3. price_width = 10
  4. item_width = width - price_width
  5. header_fmt = '{{:{}}}{{:>{}}}'.format(item_width, price_width)
  6. fmt = '{{:{}}}{{:>{}.2f}}'.format(item_width, price_width)
  7. print('=' * width)
  8. print(header_fmt.format('Item', 'Price'))
  9. print('-' * width)
  10. print(fmt.format('Apples', 0.4))
  11. print(fmt.format('Pears', 0.5))
  12. print(fmt.format('Cantaloupes', 1.92))
  13. print(fmt.format('Dried Apricots (16 oz.)', 8))
  14. print(fmt.format('Prunes (4 lbs.)', 12))
  15. print('=' * width)

这个程序的运行情况类似于下面这样:

  1. Please enter width: 50
  2. ==================================================
  3. Item Price
  4. --------------------------------------------------
  5. Apples 0.40
  6. Pears 0.50
  7. Cantaloupes 1.92
  8. Dried Apricots (16 oz.) 8.00
  9. Prunes (4 lbs.) 12.00
  10. ==================================================

字符串方法

字符串的方法太多了,这里只介绍一些最有用的。

1. center

方法center通过在两边添加填充字符(默认为空格)让字符串居中。

  1. >>> '中华人民共和国万岁'.center(40)
  2. ' 中华人民共和国万岁 '
  3. >>> '中华人民共和国万岁'.center(40,'*')
  4. '***************中华人民共和国万岁****************'

2. find

方法find在字符串中查找子串。如果找到,就返回子串的第一个字符的索引,否则返回-1。

  1. >>> 'With a moo-moo here, and a moo-moo there'.find('moo')
  2. 7
  3. >>> title = "Monty Python's Flying Circus"
  4. >>> title.find('Monty')
  5. 0
  6. >>> title.find('Python')
  7. 6
  8. >>> title.find('Flying')
  9. 15
  10. >>> title.find('Zirquss')
  11. -1

还可指定搜索的起点和终点(它们都是可选的)。

  1. >>> subject = '$$$ Get rich now!!! $$$'
  2. >>> subject.find('$$$')
  3. 0
  4. >>> subject.find('$$$',1) #规定起点为1
  5. 20
  6. >>> subject.find('!!!')
  7. 16
  8. >>> subject.find('!!!',0,16) #指定起点和终点
  9. -1

3. join

join是一个非常重要的字符串方法,其作用与split相反,用于合并序列的元素。

  1. >>> seq = [1,2,3,4,5]
  2. >>> sep = '+'
  3. >>> sep.join(seq) #尝试合并一个数字列表
  4. Traceback (most recent call last):
  5. File "<stdin>", line 1, in <module>
  6. TypeError: sequence item 0: expected str instance, int found
  7. >>> seq = ['1','2','3','4','5']
  8. >>> sep.join(seq) #合并一个字符串列表
  9. '1+2+3+4+5'
  10. >>> dirs = '', 'usr','bin','env'
  11. >>> dirs
  12. ('', 'usr', 'bin', 'env')
  13. >>> '/'.join(dirs) #Linux的目录格式
  14. '/usr/bin/env'
  15. >>> print('C:' + '\\'.join(dirs)) #Windows的目录格式
  16. C:\usr\bin\env

所合并序列的元素必须都是字符串。

4. lower和upper

方法lower返回字符串的小写版本

  1. >>> 'Trondheim Hammer Dance'.lower()
  2. 'trondheim hammer dance'

方法upper返回字符串的大写版本

  1. >>> 'Trondheim Hammer Dance'.upper()
  2. 'TRONDHEIM HAMMER DANCE'

在你编写代码时,如果不想区分字符串的大小写(即忽略大小写的差别),这将很有用。

  1. >>> name = 'Gumby'
  2. >>> names = ['gumby','smith','jones']
  3. >>> if name.lower() in names: print('Found it!')
  4. ...
  5. Found it!

一个与lower相关的方法是title。它将字符串转换为词首大写,即所有单词的首字母都大写,其他字母都小写。

  1. >>> "that's all, folks".title()
  2. "That'S All, Folks"

再看一个具体例子:

  1. # 字符串大小写做验证码
  2. y_z_m = 'O98k'
  3. y_z_m_input = input("请输入验证码(O98k)")
  4. user = input('请输入账号:')
  5. pwd = input('请输入密码:')
  6. if y_z_m == y_z_m_input:
  7. if user == 'barry' and pwd == '8520':
  8. print('登陆成功!')
  9. else:
  10. print('登录失败')
  11. else:
  12. print('验证码错误!')

5. replace

方法replace将指定子串都替换为另一个字符串,并返回替换后的结果。

  1. >>> test = 'This is a test'
  2. >>> new_test = test.replace('is','eez')
  3. >>> test
  4. 'This is a test'
  5. >>> new_test
  6. 'Theez eez a test'
  7. >>> test.replace('is','eez',1) #还可以执行替换的次数
  8. 'Theez is a test'

6. split

split是一个非常重要的字符串方法,其作用与join相反,用于将字符串拆分为序列。

  1. >>> str1 = '1+2+3+4+5'
  2. >>> str1.split('+')
  3. ['1', '2', '3', '4', '5']
  4. >>> str1
  5. '1+2+3+4+5'
  6. >>> '/usr/bin/env'.split('/')
  7. ['', 'usr', 'bin', 'env']
  8. >>> 'Using the default'.split()
  9. ['Using', 'the', 'default']

注意,如果没有指定分隔符,将默认在单个或多个连续的空白字符(空格、制表符、换行符等)处进行拆分。

7. strip

方法strip将字符串开头和末尾的空白(但不包括中间的空白)删除,并返回删除后的结果。

  1. >>> ' internal whitespace is kept '.strip()
  2. 'internal whitespace is kept'

与lower一样,需要将输入与存储的值进行比较时,strip很有用。假定用户输入用户名时不小心在末尾加上了一个空格。

  1. >>> names = ['gumby', 'smith', 'jones']
  2. >>> name = 'gumby '
  3. >>> if name in names: print('Found it!')
  4. ...
  5. >>> if name.strip() in names: print('Found it!')
  6. ...
  7. Found it!
  8. >>>

还可在一个字符串参数中指定要删除哪些字符。

  1. >>> '*** SPAM * for * everyone!!! ***'.strip(' *!')
  2. 'SPAM * for * everyone'
  3. >>>

这个方法只删除开头或末尾的指定字符,因此中间的星号未被删除。

8. translate

方法translate与replace一样替换字符串的特定部分,但不同的是它只能进行单字符替换。这个方法的优势在于能够同时替换多个字符,因此效率比replace高。这个方法的用途很多(如替换换行符或其他随平台而异的特殊字符)。

使用translate前必须创建一个转换表。要创建转换表,可对字符串类型str调用方法maketrans,这个方法接受两个参数:两个长度相同的字符串,它们指定要将第一个字符串中的每个字符都替换为第二个字符串中的相应字符。

  1. >>> table = str.maketrans('1234','ABCD')
  2. >>> '1234 and 1234 end 1234'.translate(table)
  3. 'ABCD and ABCD end ABCD'

调用方法maketrans时,还可提供可选的第三个参数,指定要将哪些字母删除。

  1. >>> table = str.maketrans('1234','ABCD',' ')
  2. >>> '1234 and 1234 end 1234'.translate(table)
  3. 'ABCDandABCDendABCD'

判断字符串是否满足特定的条件

很多字符串方法都以is打头,如isspace、isdigit和isupper,它们判断字符串是否具有特定的性质(如包含的字符全为空白、数字或大写)。如果字符串具备特定的性质,这些方法就返回True,否则返回False。

  1. >>> ' 123 '.isspace()
  2. False
  3. >>> 'liudehua'.isdigit()
  4. False
  5. >>> 'liudehua'.isupper()
  6. False
  7. >>> 'Liudehua'.isupper()
  8. False
判断字符串方法 说明
string.isalnum() 检查字符串中的字符是否都是字母或数字
string.isalpha() 检查字符串中的字符是否都是字母
string.isdecimal() 检查字符串中的字符是否都是十进制数
string.isdigit() 检查字符串中的字符是否都是数字
string.isidentifier() 检查字符串是否可用作Python标识符
string.islower() 检查字符串中的所有字母都是小写的
string.isnumeric() 检查字符串中的所有字符是否都是数字字符
string.isprintable() 检查字符串中的字符是否都是可打印的
string.isspace() 检查字符串中的字符是否都是空白字符
string.istitle() 检查字符串中位于非字母后面的字母都是大写的,且其他所有字母都是小写的
string.isupper() 检查字符串中的字母是否都是大写的