geekdoc-python-zh/docs/pythonland/08.md

15 KiB
Raw Permalink Blame History

Python 字符串:使用文本

原文:https://python.land/introduction-to-python/strings

所以我们看到了数字,但是文字呢?这个页面是关于 Python 字符串的,它是在 Python 中存储和使用文本的首选 Python 数据类型。所以,在 Python 中,一段文本叫做字符串,你可以对字符串进行各种操作。不过还是先从基础做起吧!

目录

什么是 Python 字符串?

以下是字符串的正式定义:

String

A string in Python is a sequence of characters

更简单地说,字符串就是一段文本。字符串不仅仅是 Python 的事情。这是计算机科学领域中一个众所周知的术语,在大多数其他语言中也有同样的意思。现在我们知道了什么是字符串,我们将看看如何创建一个字符串。

如何创建 Python 字符串

Python 字符串需要引号才能被识别,如下所示:

>>> 'Hello, World'
'Hello, World'

因为有引号Python 认为这是一个字符序列,而不是一个命令、数字或变量。

就像数字一样,我们之前学过的一些运算符也适用于 Python 字符串。用下面的表达试试看:

>>> 'a' + 'b'
'ab'
>>> 'ab' * 4
'abababab'
>>> 'a' - 'b'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'

这是上面代码中发生的情况:

  • 加号运算符将两个 Python 字符串粘合在一起。
  • 乘法运算符将我们的 Python 字符串重复给定的次数。
  • 减号运算符不适用于 Python 字符串,会产生错误。如果你想删除一个字符串的一部分,还有其他的方法,稍后你会学到。

单引号还是双引号?

我们使用了单引号,但是 Python 也接受字符串两边的双引号:

>>> "a" + "b"
'ab'

请注意,这不是两个相邻的单引号。该字符通常位于键盘上的回车键旁边(美国键盘布局)或 2 键上(英国键盘布局)。其他国家可能会有所不同。你需要同时按 shift 和这个键才能得到双引号。

从它的回答可以看出Python 本身似乎更喜欢单引号。它看起来更清晰Python 尽量做到清晰易读。那么为什么两者都支持呢?因为它允许你使用包含引号的字符串。

在下面的第一个例子中,我们使用双引号。因此,单词中的单引号没有问题,它是。然而在第二个例子中我们尝试使用单引号。Python 看到单词中的引号是并认为这是字符串的结尾下面的字母“s”导致语法错误。语法错误是命令或指令中错误放置的字符或字符串会导致执行失败。

换句话说Python 不理解该处的 s因为它认为字符串已经结束并因错误而失败:

>>> mystring = "It's a string, with a single quote!"
>>> mystring = 'It's a string, with a single quote!'
  File "<stdin>", line 1
    mystring = 'It's a string, with a single quote!'
                   ^
SyntaxError: invalid syntax

Python 用^符号指出遇到错误的确切位置。Python 错误往往非常有帮助,所以仔细观察它们,您通常能够指出哪里出错了。

如果你注意到了,这个网站上的语法高亮器甚至会因为无效的语法而变得混乱!

逃避

这个问题其实还有另外一个办法,叫做逃避。您可以用反斜杠对特殊字符进行转义,如引号:

>>> mystring = 'It\'s an escaped quote!'
>>> mystring
"It's an escaped quote!"

也可以对双引号字符串中的双引号进行转义:

>>> mystring = "I'm a so-called \"script kiddie\""
>>> mystring
'I\'m a so-called "script kiddie"'

这里,您再次看到 Python 对单引号字符串的偏好。尽管我们使用了双引号Python 还是使用单引号将字符串返回给我们。它仍然是同一个字符串,只是表示方式不同。一旦你开始打印字符串到屏幕上,你就会看到证据。

那么应该用哪一个呢?很简单:总是选择需要最少转义的选项,因为这些转义会降低 Python 字符串的可读性。

多行字符串

Python 也有使用三重引号创建多行字符串的语法。我指的是三个双引号或三个单引号;两者都可以,但我将用双引号来证明:

>>> """This is line 1,
... this is line 2,
... this is line 3."""
'This is line 1,\nthis is line 2,\nthis is line 3.'

如您所见Python 将字符串作为常规的单行字符串回显。在这个字符串中,您可能已经注意到了\n字符:这是 Python 和许多其他编程语言对特殊字符(如换行符)进行转义的方式。下表列出了几个你会遇到的最常见的转义序列:

转义序列 什么是做
\n 换行符(换行符是用 return 键生成的)。前进到下一个
\r 回车:将您带回到行的开始,而不前进到下一行
\t 制表符
\ 斜杠字符本身:因为它被用作转义序列的开始所以我们也需要转义这个字符。但是如果您忘记对它进行转义Python 是相当宽容的。

常见的转义形式的特殊字符

有趣的事实:像 Linux 这样基于 Unix 的操作系统使用\n作为新行,回车被自动包含,而 Windows 使用\r\n。这已经并将成为许多 bug 的原因。所以如果你在 Windows 上,你会看到很多\r\n

使用三重引号进行转义

三重引号的好处是你可以在其中使用单引号和双引号。因此,您可以使用三重引号干净地创建既包含单引号又包含双引号的字符串,而无需进行转义:

>>> line = """He said: "Hello, I've got a question" from the audience"""

字符串操作

字符串附带了几个您可以执行的方便的内置操作。我在这里只给你看几个,因为我不想过多地转移你对教程的注意力。

在 REPL有时可以使用自动完成功能。这取决于你使用的安装程序和操作系统。我不知道确切的原因但你最好的办法就是试一试

Thank you for reading my tutorials. I write these in my free time, and it requires a lot of time and effort. I use ads to keep writing these free articles, I hope you understand! Support me by disabling your adblocker on my website or, alternatively, buy me some coffee. It's much appreciated and allows me to keep working on this site!

在下一个代码片段中,我们创建了一个字符串mystring,在下一行中,我们键入它的名称,然后按两次选项卡键:

>>> mystring = "Hello world"
>>> mystring.
mystring.capitalize(    mystring.find(          mystring.isdecimal(     mystring.istitle(       mystring.partition(     mystring.rstrip(        mystring.translate(
mystring.casefold(      mystring.format(        mystring.isdigit(       mystring.isupper(       mystring.replace(       mystring.split(         mystring.upper(
mystring.center(        mystring.format_map(    mystring.isidentifier(  mystring.join(          mystring.rfind(         mystring.splitlines(    mystring.zfill(
mystring.count(         mystring.index(         mystring.islower(       mystring.ljust(         mystring.rindex(        mystring.startswith(
mystring.encode(        mystring.isalnum(       mystring.isnumeric(     mystring.lower(         mystring.rjust(         mystring.strip(
mystring.endswith(      mystring.isalpha(       mystring.isprintable(   mystring.lstrip(        mystring.rpartition(    mystring.swapcase(
mystring.expandtabs(    mystring.isascii(       mystring.isspace(       mystring.maketrans(     mystring.rsplit(        mystring.title(

如果一切顺利,您应该得到一个可以在字符串上执行的操作的大列表。如果不行,你可以在官方 Python 手册中查看这些操作的列表(每个都有解释)。你可以自己尝试一下:

>>> mystring.lower()
'hello world'
>>> mystring.upper()
'HELLO WORLD'

对这些操作的解释可以在官方 Python 文档中找到,但是我们也将在这里讨论一些。

获取字符串长度

一个常见的操作是获取字符串长度。与上面的操作不同,这可以通过 Python 的len()函数来完成,如下所示:

>>> len("I wonder how long this string will be...")
40
>>> len(mystring)
11

事实上,len()函数可以用在 Python 中的许多对象上,稍后您将会了解到。如果函数对你来说是新的,你很幸运,因为我们的下一页将解释 Python 中的函数是什么,以及你如何自己创建一个函数。

拆开一根绳子

另一个常见的操作是拆分字符串。为此,我们可以使用内置操作之一,方便地称为 split。让我们简单地从两个单词之间的空格字符开始:

'Hello world'.split(' ')
['Hello', 'world']

拆分操作有一个参数:要拆分的字符序列。输出是一个包含所有独立单词的 Python 列表

按空白分割

一个常见的用例是分割空白符。问题是空白可以是很多东西。你可能已经知道的三个常见的例子是:

  • 空格字符
  • 制表符
  • newlines

但是还有很多,更复杂的是,空白不仅仅指这些字符中的一个,也可以是它们的整个序列。例如,三个连续的空格和一个制表符形成一片空白。

正是因为这是程序员中如此常见的操作并且因为很难完美地完成它Python 为它提供了一个方便的快捷方式。调用不带任何参数的 split 操作会在空格处拆分字符串,如下所示:

>>> 'Hello \t\n there,\t\t\t stranger.'.split()
['Hello', 'there,', 'stranger.']

正如您所看到的无论空白字符是什么以及有多少Python 仍然可以为我们将这个字符串拆分成单独的单词。

替换字符串的一部分

让我们再来看一个内置的字符串操作:replace 函数。它用于替换一个或多个字符或字符序列:

>>> 'Hello world'.replace('H', 'h')
'hello world'
>>> 'Hello world'.replace('l', '_')
'He__o wor_d
>>> 'Hello world'.replace('world', 'readers')
'Hello readers'

反转字符串

一个常见的赋值是反转一个 Python 字符串。不过,没有相反的操作,你可能已经注意到了,当你用字符串研究像lower() and upper() that comes这样的操作列表时。这并不完全是初学者的东西,所以如果你按顺序阅读教程,现在可以跳过这一步。

我们可以把一个字符串当作一个列表来高效地反转一个字符串。列表将在本教程稍后介绍(参见 for 循环)。事实上,你可以把一个字符串看作一系列字符。更重要的是,你可以这样对待它。像mystring[2]这样的列表索引操作就像它们在列表上工作一样:

>>> mystring = 'Hello world'
>>> mystring[2]
'l'
>>> mystring[0]
'H'

注意,在 Python 中,像在所有计算机语言中一样,我们从 0 开始计数。

切片操作符的工作方式与列表中的完全相同。切片的细节可以在 Python 列表页面找到,这里不再赘述。如果您来自其他语言,您可能会将其与 Java 中的substring()操作进行比较,后者允许您检索字符串的特定部分。

Python 中的切片使用切片操作符,看起来是这样的:mystring[start:stop:step_size]。我们使用切片的关键特征是步长。我们通过给切片操作符一个-1 的负步长从末尾到开头遍历字符串。通过将开始和结束位置留空Python 假设我们想要对整个字符串进行切片。

因此,我们可以使用切片来反转 Python 字符串,如下所示:

>>> mystring = 'Hello world'
>>> mystring[::-1]
'dlrow olleH'

切片在我关于列表的文章中有更详细的解释。

链接呼叫

到目前为止,我们使用的是单一操作。但是,我们也可以将这些操作链接在一起:

>>> 'Hello world'.replace('world', 'student').upper()
'HELLO STUDENT'

这里发生了什么事?第一个操作(替换)产生一个字符串。这个字符串和所有字符串一样,再次为我们提供了相同的操作。所以我们可以直接在结果上调用下一个操作(upper)。这是一个方便的快捷方式,您将在其他代码中经常使用和遇到。

您也可以通过首先将结果赋给一个变量来显式地实现这一点:

>>> student_greeting = 'Hello world'.replace('world', 'student')
>>> student_greeting.upper()
'HELLO STUDENT'

用 f 字符串格式化 Python 字符串

一个常见的模式是需要将一些文本字符串合并在一起,或者在字符串中使用一个变量。有几种方法可以做到这一点,但最现代的方法是使用 f 字符串,格式化字符串的缩写。

在深入细节之前,我们先来看一个例子:

>>> my_age = 40
>>> f'My age is {my_age}'
My age is 40

f 字符串看起来像一个添加了 f 前缀的普通字符串。这个 f 告诉 Python 扫描字符串中的花括号。在这些花括号中,我们可以放入任何我们想要的 Python 表达式。在上面的例子中,我们只是包含了变量 my_age。f-string 提供了一种优雅的方式来将表达式的结果包含在字符串中。

这里还有几个例子,你也可以在 REPL 亲自尝试一下:

>>> f'3 + 4 = {3+4}'
'3 + 4 = 7'
>>> my_age = 40
>>> f'My age is, unfortunately, not {my_age-8}'
'My age is, unfortunately, not 32'

快速打印变量

f-string 允许我们快速打印变量的名称和内容。这在调试代码时非常有用。下面的代码片段展示了这一点:

https://crumb.sh/embed/suDyy7G5k9Y

了解更多信息

我在这里只是触及一些基本问题。如果你是按照教程从头到尾,你可以继续下一个主题,因为你现在知道的已经够多了。如果您想了解更多关于 f 弦的信息,请尝试以下资源: