第2章-关于字符串

python中有几种数据类型。您可能看到最多的主要数据类型是string、integer、float、list、dict和tuple。在本章中,我们将介绍字符串数据类型。您会惊讶地发现,在python中,您可以对字符串进行很多现成的操作。还有一个字符串模块,您可以导入它来访问更多的功能,但在本章中我们将不再讨论这个问题。相反,我们将涵盖以下主题:

  • 如何创建字符串

  • 字符串连接

  • 字符串方法

  • 字符串切片

  • 字符串替换

如何创建字符串

字符串通常以三种方式之一创建。您可以使用单引号、双引号或三引号。让我们看看!

>>> my_string = "Welcome to Python!"
>>> another_string = 'The bright red fox jumped the fence.'
>>> a_long_string = '''This is a
multi-line string. It covers more than
one line'''

三重引号行可以用三个单引号或三个双引号完成。不管怎样,它们都允许程序员在多行上写字符串。如果打印出来,您会注意到输出保留了换行符。如果需要在字符串中使用单引号,请用双引号将其括起来。请参见以下示例。

>>> my_string = "I'm a Python programmer!"
>>> otherString = 'The word "python" usually refers to a snake'
>>> tripleString = """Here's another way to embed "quotes" in a string"""

上面的代码演示了如何将单引号或双引号放入字符串。实际上还有另一种创建字符串的方法,即使用 str 方法。工作原理如下:

>>> my_number = 123
>>> my_string = str(my_number)

如果在解释器中键入上述代码,您会发现已将整数值转换为字符串,并将该字符串赋给变量。 my_string .这被称为 铸造 .您可以将一些数据类型转换为其他数据类型,如将数字转换为字符串。但是你也会发现你不能总是做相反的事情,比如把“abc”这样的字符串转换成整数。如果这样做,最终会出现如下示例中的错误:

>>> int('ABC')
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
ValueError: invalid literal for int() with base 10: 'ABC'

我们将在后面的章节中讨论异常处理,但是正如您可能从消息中猜到的,这意味着您不能将文本转换为整数。但是,如果你做到了

>>> x = int("123")

那就没问题了。

应该注意,字符串是Python不可变类型之一。这意味着您不能在创建后更改字符串的内容。让我们换一个看看会发生什么:

>>> my_string = "abc"
>>> my_string[0] = "d"
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
TypeError: 'str' object does not support item assignment

在这里,我们试图将第一个字符从“a”改为“d”;但是这会导致一个类型错误,阻止我们这样做。现在,您可能会认为,通过将一个新字符串赋给更改了字符串的同一个变量。让我们看看这是不是真的:

>>> my_string = "abc"
>>> id(my_string)
19397208
>>> my_string = "def"
>>> id(my_string)
25558288
>>> my_string = my_string + "ghi"
>>> id(my_string)
31345312

通过检查对象的ID,我们可以确定每当我们为变量分配一个新值时,它的标识都会改变。

注意,在python 2.x中,字符串只能包含 ASCII 字符。如果你需要的话 统一码 在python 2.x中,则需要在字符串前面加上 u . 下面是一个例子:

my_unicode_string = u"This is unicode!"

上面的示例实际上不包含任何Unicode,但它应该为您提供一般的概念。在python 3.x中,所有字符串都是Unicode。

字符串连接

串联是一个大单词,意思是将两个事物组合在一起或添加在一起。在这种情况下,我们想知道如何将两个字符串添加到一起。正如您可能怀疑的那样,此操作在Python中非常简单:

>>> string_one = "My dog ate "
>>> string_two = "my homework!"
>>> string_three = string_one + string_two

“+”运算符将两个字符串连接为一个。

字符串方法

字符串是Python中的对象。实际上,Python中的所有内容都是一个对象。但是,你还没有准备好。如果您想进一步了解Python是一种面向对象的编程语言,那么您需要跳到这一章。同时,足够了解字符串中内置了自己的方法。例如,假设您有以下字符串:

>>> my_string = "This is a string!"

现在您希望使这个字符串完全大写。要做到这一点,你所要做的就是 上() 方法,如下所示:

>>> my_string.upper()

如果你打开了你的翻译,你也可以这样做:

>>> "This is a string!".upper()

还有许多其他的字符串方法。例如,如果您希望所有内容都是小写的,您将使用 下() 方法。如果要删除所有前导空格和尾随空格,则将使用 条带() .要获取所有字符串方法的列表,请在解释器中键入以下命令:

>>> dir(my_string)

您应该会看到如下内容:

['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

可以安全地忽略以双下划线开头和结尾的方法,例如 __add__ .它们不是每天都用于Python编码。把注意力集中在其他人身上。如果你想知道他们中的一个做了什么,就问问 help .例如,假设你想学习什么 资本化 是的。为了找出答案,你可以输入

>>> help(my_string.capitalize)

这将返回以下信息:

有关内置函数的帮助大写:

大写(…)

s.capitalize()->字符串

返回字符串s的副本,其中只有第一个字符大写。

你刚刚了解了一个叫做 自省 。 python允许对所有对象进行简单的内省,这使得它非常容易使用。基本上,内省允许您询问Python关于它自己的问题。在前面的一节中,您学习了铸造。您可能想知道如何判断变量的类型(即int或string)。你可以让 Python 告诉你!

>>> type(my_string)
    <type 'str'>

如您所见,my_string变量的类型为str!

字符串切片

在现实世界中,你会发现自己经常做的一个主题是字符串切片。我很惊讶,在我的日常工作中,我经常需要知道如何做到这一点。让我们来看看切片如何使用以下字符串:

>>> my_string = "I like Python!"

可以使用切片访问字符串中的每个字符。例如,如果我只想抓取第一个字符,我可以这样做:

>>> my_string[0:1]

这将获取字符串中的第一个字符,但 not 包括第二个字符。是的,python是基于零的。如果我们把每个字符在一张表中的位置映射出来,会更容易理解:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

I

L

K

E

P

Y

T

H

O型

N号

你说什么?

因此我们有一个14个字符的字符串,从0开始,经过13个字符。让我们再做几个例子,让这些概念更好地进入我们的头脑。

>>> my_string[:1]
'I'
>>> my_string[0:12]
'I like Pytho'
>>> my_string[0:13]
'I like Python'
>>> my_string[0:14]
'I like Python!'
>>> my_string[0:-5]
'I like Py'
>>> my_string[:]
'I like Python!'
>>> my_string[2:]
'like Python!'

正如您从这些示例中看到的,我们可以通过只指定切片的开始(即,我的u字符串)来完成切片。 [2:] ,切片的结尾(即我的字符串 [:1] )或者两者都有 [0:13] )。我们甚至可以使用从字符串末尾开始的负值。所以我们在这里做的例子是 [0:-5] 从零开始,但在字符串结尾之前结束5个字符。

你可能想知道你会在哪里用这个。我发现自己使用它来分析文件中的固定宽度记录,或者偶尔分析遵循非常具体命名约定的复杂文件名。我还使用它来解析二进制类型文件中的值。如果您了解切片以及如何有效地使用它,任何需要进行文本文件处理的工作都将变得更容易。

还可以通过索引访问字符串中的单个字符。下面是一个例子:

>>> print(my_string[0])

上面的代码将打印出字符串中的第一个字符。

字符串格式化

字符串格式(也称为替换)是将值替换为基字符串的主题。大多数情况下,您将在字符串中插入字符串;但是,您也会发现自己也经常在字符串中插入整数和浮点数。完成这项任务有两种不同的方法。我们将从旧的做事方式开始,然后转向新的。

是旧的代替弦的方法

学习如何做到这一点的最简单方法是看几个例子。现在我们开始:

>>> my_string = "I like %s" % "Python"
>>> my_string
'I like Python'
>>> var = "cookies"
>>> newString = "I like %s" % var
>>> newString
'I like cookies'
>>> another_string = "I like %s and %s" % ("Python", var)
>>> another_string
'I like Python and cookies'

你可能已经猜到了, %s 是上面代码中的重要部分。它告诉python您可能很快就会插入文本。如果在字符串后面加上百分号和另一个字符串或变量,那么python将尝试将其插入到字符串中。您可以通过放置多个 %s 在你的绳子里。在上一个示例中您将看到这一点。请注意,当您插入多个字符串时,必须用括号将要插入的字符串括起来。

现在,让我们看看如果没有插入足够的字符串会发生什么:

>>> another_string = "I like %s and %s" % "Python"
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
TypeError: not enough arguments for format string

哎呀!我们没有传递足够的参数来格式化字符串!如果仔细看上面的示例,您会发现它有两个%s实例,因此要在其中插入字符串,您必须传递相同数量的字符串!现在我们准备学习如何插入整数和浮点。让我们看看!

>>> my_string = "%i + %i = %i" % (1,2,3)
>>> my_string
'1 + 2 = 3'
>>> float_string = "%f" % (1.23)
>>> float_string
'1.230000'
>>> float_string2 = "%.2f" % (1.23)
>>> float_string2
'1.23'
>>> float_string3 = "%.2f" % (1.237)
>>> float_string3
'1.24'

上面的第一个例子很明显。我们创建一个接受三个参数的字符串,然后将它们传入。只是为了以防万一,您还没有弄清楚,不,在第一个示例中,python实际上没有做任何添加。对于第二个示例,我们传入一个浮点。请注意,输出包含大量的额外零。我们不希望这样,所以我们告诉python在第三个示例(“%.2f”)中将其限制在两个小数位。最后一个示例向您展示,如果您将一个大于两位小数的浮点数传递给python,它将为您做一些取整。

现在让我们看看如果传递坏数据会发生什么:

>>> int_float_err = "%i + %f" % ("1", "2.00")
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
TypeError: %d format: a number is required, not str

在这个例子中,我们传递给它两个字符串,而不是一个整数和一个浮点。这会引发一个类型错误,并告诉我们python需要一个数字。这指的是不传递整数,所以让我们修复它,看看它是否修复了问题:

>>> int_float_err = "%i + %f" % (1, "2.00")
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
TypeError: float argument required, not str

不。我们得到相同的错误,但不同的消息告诉我们应该传递一个浮点。正如您所看到的,python为我们提供了关于哪里出了问题以及如何修复它的非常好的信息。如果您适当地修正了输入,那么您应该能够运行这个示例。

让我们继续讨论字符串格式的新方法!

模板和新的字符串格式方法

这个新方法实际上是作为字符串模板添加回python 2.4中的,但是通过 格式 python 2.6中的方法。所以这不是一个新的方法,只是更新。无论如何,让我们从模板开始!

>>> print("%(lang)s is fun!" % {"lang":"Python"})
Python is fun!

这看起来很奇怪,但基本上我们改变了 %s 进入之内 %(朗)S ,基本上是包含变量的%s。第二部分实际上被称为python字典,我们将在下一节学习它。基本上,它是一个key:value对,所以当Python在字符串和传入字典的key中看到key“lang”时,它会用它的值替换该key。让我们再看一些例子:

>>> print("%(value)s %(value)s %(value)s !" % {"value":"SPAM"})
SPAM SPAM SPAM !
>>> print("%(x)i + %(y)i = %(z)i" % {"x":1, "y":2})
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
KeyError: 'z'
>>> print("%(x)i + %(y)i = %(z)i" % {"x":1, "y":2, "z":3})
1 + 2 = 3

在第一个示例中,您会注意到我们只传递了一个值,但它被插入了3次!这是使用模板的优点之一。第二个例子有一个问题,我们忘记传递一个键,即“z”键。第三个例子纠正了这个问题并显示了结果。现在让我们看看如何使用字符串的格式方法来做类似的事情!

>>> "Python is as simple as {0}, {1}, {2}".format("a", "b", "c")
'Python is as simple as a, b, c'
>>> "Python is as simple as {1}, {0}, {2}".format("a", "b", "c")
'Python is as simple as b, a, c'
>>> xy = {"x":0, "y":10}
>>> print("Graph a point at where x={x} and y={y}".format(**xy))
Graph a point at where x=0 and y=10

在前两个示例中,您可以看到如何按位置传递项。如果我们重新排列顺序,就会得到稍微不同的输出。最后一个例子使用了一个字典,就像我们在上面的模板中使用的一样。但是,我们必须使用双星号来提取字典,以使它在这里正确工作。

使用字符串还可以执行许多其他操作,例如指定宽度、对齐文本、转换为不同的基数等等。请务必查看下面的一些参考资料以了解更多信息。

总结

在这一章中我们已经讲了很多。让我们回顾一下:

首先我们学习了如何创建字符串本身,然后我们继续讨论字符串连接的主题。之后,我们研究了字符串对象提供给我们的一些方法。接下来我们研究了字符串切片,最后我们学习了字符串替换。

在下一章中,我们将进一步研究三种Python的内置数据类型:列表、元组和字典。我们开始吧!