>>> from env_helper import info; info()
页面更新时间: 2023-04-15 21:14:43
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-7-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

1.3. Python 字符串

字符串是 Python 中最常用的数据类型。我们可以使用引号( '" )来创建字符串。

创建字符串很简单,只要为变量分配一个值即可。例如:

>>> var1 = 'Hello World!'
>>> var2 = "Runoob"

1.3.1. 字符串连接和复制

根据操作符之后的值的数据类型,操作符的含义可能会改变。例如,在操作两 个整型或浮点型值时, + 是相加操作符。 但是,在用于两个字符串时,它将字符串 连接起来,成为“字符串连接”操作符。

在交互式环境中输入以下内容:

>>> 'Alice' + 'Bob'
'AliceBob'

该表达式求值为一个新字符串,包含了两个字符串的文本。但是,如果你对一个字符串和一个整型值使用加操作符,Python就不知道如何处理,它将显示一条错误信息:

>>> 'Alice' + 42
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

Cell In [4], line 1
----> 1 'Alice' + 42


TypeError: can only concatenate str (not "int") to str

错误信息 Can't convert 'int’ object to str implicitly 表示 Python 认为,你试图将一个整数连接到字符串 'Alice' 。 代码必须显式地将整数转换为字符串,因为Python不能自动完成转换。

在用于两个整型或浮点型值时, * 操作符表示乘法。 但 * 操作符用于一个字符串 值和一个整型值时,它变成了“字符串复制”操作符。

在交互式环境中输入一个字符串乘一个数字,看看效果。

>>> 'Alice' * 5
'AliceAliceAliceAliceAlice'

该表达式求值为一个字符串,它将原来的字符串重复若干次,次数就是整型的 值。字符串复制是一个有用的技巧,但不像字符串连接那样常用。

* 操作符只能用于两个数字(作为乘法),或一个字符串和一个整型(作为字符 串复制操作符)。否则,Python将显示错误信息。

Python不理解这些表达式是有道理的:你不能把两个单词相乘,也很难将一个任意字符串复制小数次。

1.3.2. Python 访问字符串中的值

Python 不支持单字符类型,单字符也在Python也是作为一个字符串使用。

Python 访问子字符串,可以使用方括号来截取字符串,如下实例:

>>> var1 = 'Hello World!'
>>> print ("var1[0]: ", var1[0])
var1[0]:  H
>>> var2 = "Runoob"
>>> print ("var2[1:5]: ", var2[1:5])
var2[1:5]:  unoo
>>> a = "Hello"
>>> b = "Python"
>>>
>>> print("a + b 输出结果:", a + b)
>>> print("a * 2 输出结果:", a * 2)
>>> print("a[1] 输出结果:", a[1])
>>> print("a[1:4] 输出结果:", a[1:4])
a + b 输出结果: HelloPython
a * 2 输出结果: HelloHello
a[1] 输出结果: e
a[1:4] 输出结果: ell

in 关键字的用法类似于操作系统,用于判断一个某个元素是否在一个列表或字符串中。

>>> if( "H" in a) :
>>>     print("H 在变量 a 中")
>>> else :
>>>     print("H 不在变量 a 中")
H 在变量 a 

not 关键字用于取反, 用法如下。

>>> if( "M" not in a) :
>>>     print("M 不在变量 a 中")
>>> else :
>>>     print("M 在变量 a 中")
M 不在变量 a 

1.3.3. Python字符串格式化

Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

>>> "我叫%s,今年%d岁!" % ('小明', 10)
'我叫小明,今年10岁!'

Python 字符串格式化符号:

  • %c : 格式化字符及其ASCII码 ;

  • %s : 格式化字符串 ;

  • %d : 格式化整数 ;

  • %u : 格式化无符号整型 ;

  • %o : 格式化无符号八进制数 ;

  • %x : 格式化无符号十六进制数 ;

  • %X : 格式化无符号十六进制数(大写) ;

  • %f : 格式化浮点数字,可指定小数点后的精度 ;

  • %e : 用科学计数法格式化浮点数 ;

  • %E : 作用同%e,用科学计数法格式化浮点数 ;

  • %g : %f和%e的简写 ;

  • %G : %f 和 %E 的简写 ;

  • %p : 用十六进制数格式化变量的地址 ;

格式化操作符辅助指令:

  • * 定义宽度或者小数点精度 ;

  • - 用做左对齐 ;

  • + 在正数前面显示加号( + ) ;

  • <SP> 在正数前面显示空格 ;

  • | 在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) ;

  • 0 显示的数字前面填充’0’而不是默认的空格 ;

  • % ‘%%’输出一个单一的’%’ ;

  • (var) 映射变量(字典参数) ;

  • m.n. m 是显示的最小总宽度, n 是小数点后的位数(如果可用的话) ;

1.3.4. Unicode 字符串

Python 3 中,所有的字符串都是Unicode字符串。

Python 2 中,普通字符串是以8位ASCII码进行存储的,而Unicode字符串则存储为16位unicode字符串,这样能够表示更多的字符集。 使用的语法是在字符串前面加上前缀 u

1.3.5. 单引号字符串以及对引号转义

与数一样,字符串也是值:

>>> "Hello, world!"
'Hello, world!'

在这个示例中,有一点可能让你颇感意外:Python在打印字符串时,用单引号将其括起,而 我们使用的是双引号。这有什么差别吗?其实没有任何差别。

>>> 'Hello, world!'
'Hello, world!'

这里使用的是单引号,结果却完全相同。既然如此,为何同时支持单引号和双引号呢?因为在有些情况下,这可能会有用。

>>> "Let's go!"
"Let's go!"
>>> '"Hello, world!" she said'
'"Hello, world!" she said'

在上述代码中,第一个字符串包含一个单引号(就这里而言,可能称之为撇号更合适),因 此不能用单引号将整个字符串括起,否则解释器将报错(做出这样的反应是正确的)。

>>> 'Let's go!'
  Cell In [16], line 1
    'Let's go!'
              ^
SyntaxError: unterminated string literal (detected at line 1)

在这里,字符串为 'Let' ,因此Python不知道如何处理后面的 s(更准确地说是当前行余下的 内容)。

第二个字符串包含双引号,因此必须使用单引号将整个字符串括起,原因和前面一样。 实际上,并非必须这样做(这样做只是出于方便考虑)。可使用反斜杠( \ )对引号进行转义,如 下所示:

>>> 'Let\'s go!'
"Let's go!"

这样Python将明白中间的引号是字符串的一部分,而不是字符串结束的标志。虽然如此, Python打印这个字符串时,还是使用了双引号将其括起。与你预期的一样,对于双引号可采用同 样的处理手法。

>>> "\"Hello, world!\" she said"
'"Hello, world!" she said'

像这样对引号进行转义很有用,且在有些情况下必须这样做。例如,在字符串同时包含单引 号和双引号(如’Let's say “Hello, world!”’)时,如果不使用反斜杠进行转义,该如何办呢?

1.3.6. Python三引号

Python 三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。实例如下:

>>> para_str = """这是一个多行字符串的实例
>>> 多行字符串可以使用制表符
>>> TAB ( \t )。
>>> 也可以使用换行符 [ \n ]。
>>> """
>>> para_str
'这是一个多行字符串的实例n多行字符串可以使用制表符nTAB ( t )。n也可以使用换行符 [ n ]。n'

三引号让程序员从引号和特殊字符串的泥潭里面解脱出来,自始至终保持一小块字符串的格式是所谓的 WYSIWYG (所见即所得)格式的。

>>> print(para_str)
这是一个多行字符串的实例
多行字符串可以使用制表符
TAB (        )。
也可以使用换行符 [
 ]。

1.3.7. 字符串表示 str 和 repr

Python打印所有的字符串时,都用引号将其括起。你可能通过前面的示例发现了这一点。 这是因为Python打印值时,保留其在代码中的样子,而不是你希望用户看到的样子。 但如果你使用 print ,结果将不同。

>>> "Hello, world!"
'Hello, world!'
>>> print("Hello, world!")
Hello, world!

如果再加上表示换行符的编码 \n ,差别将更明显。

>>> "Hello,\nworld!"
'Hello,nworld!'
>>> print("Hello,\nworld!")
Hello,
world!

通过两种不同的机制将值转换成了字符串。

你可通过使用函数 str()repr() 直接使用这两种机制。 使用 str() 能以合理的方式将值转换为用户能够看懂的字符串。 例如,尽可能将特殊字符编码 转换为相应的字符。

>>> print(str("Hello,\nworld!"))
Hello,
world!

然而,使用 repr() 时,通常会获得值的合法 Python 表达式表示。

>>> print(repr("Hello,\nworld!"))
'Hello,nworld!'