- 1. 变量(variable)
- 2. 字符串
- 2.1 单引号字符串以及对引号转义
- 2.2 拼接字符串
- *2.3 字符串表示 str 和repr
- 2.4 长字符串、原始字符串和字节
- 拓展阅读
- 3. 常量
视频:观看
1. 变量(variable)计算机编程就是告诉计算机如何做。
变量是表示(或指向)特定值的名称。
>>> x = 3
这称为赋值(assignment),我们将值3赋给了变量x。换而言之,就是将变量x与值3关联起来。
不同于其他一些语言,使用Python变量前必须给它赋值,因为Python变量没有默认值。
注意 在Python中,名称(标识符)只能由字母、数字和下划线(_)构成,且不能以数字打头。因此Plan9是合法的变量名,而9Plan不是
t_007 = 'T007'
变量t_007是一个字符串。
An = True
变量An是一个布尔值True。
在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,例如:
# -*- coding: utf-8 -*- a = 'ABC' a = 8 print(a)
请不要把赋值语句的等号等同于数学的等号。比如下面的代码:
x = 10 x = x + 2
如果从数学上理解x = x + 2那无论如何是不成立的,在程序中,赋值语句先计算右侧的表达式x + 2,得到结果12,再赋给变量x。由于x之前的值是10,重新赋值后,x的值变成12。
最后,理解变量在计算机内存中的表示也非常重要。当我们写:
a = 'ABC'
时,Python解释器干了两件事情:
- 在内存中创建了一个'ABC'的字符串;
- 在内存中创建了一个名为a的变量,并把它指向'ABC'。
也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码:
# -*- coding: utf-8 -*- a = 'ABC' b = a a = 'XYZ' print(b)
最后一行打印出变量b的内容到底是'ABC'呢还是'XYZ'?如果从数学意义上理解,就会错误地得出b和a相同,也应该是'XYZ',但实际上b的值是'ABC',让我们一行一行地执行代码,就可以看到到底发生了什么事:
执行a = 'ABC',解释器创建了字符串'ABC'和变量a,并把a指向'ABC':
执行b = a,解释器创建了变量b,并把b指向a指向的字符串'ABC':
执行a = 'XYZ',解释器创建了字符串’XYZ’,并把a的指向改为'XYZ',但b并没有更改:
所以,最后打印变量b的结果自然是'ABC'了。
2. 字符串字符串是以英文的单引号'或双引号"括起来的任意文本,比如'abc',"xyz"等等,引号一定是成对出现的。请注意,''或""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I,',m,空格,O,K这6个字符。
2.1 单引号字符串以及对引号转义与数一样,字符串也是值:
>>> "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!' SyntaxError: invalid syntax
在这里,字符串为Let',因此Python不知道如何处理后面的s(更准确地说是当前行余下的内容)。
第二个字符串包含双引号,因此必须使用单引号将整个字符串括起。实际上,并非必须这样做(这样做只是出于方便考虑)。可使用反斜杠()对引号进行转义,如下所示:
>>> 'Let's go!' "Let's go!"
这样Python将明白中间的引号是字符串的一部分,而不是字符串结束的标志。虽然如此,Python打印这个字符串时,还是使用了双引号将其括起。与你预期的一样,对于双引号可采用同样的处理手法。
>>> ""Hello, world!" she said" '"Hello, world!" she said'
像这样对引号进行转义很有用,且在有些情况下必须这样做。例如,在字符串同时包含单引号和双引号(如’Let’s say “Hello, world!”')时,如果不使用反斜杠进行转义,该如何办呢?
2.2 拼接字符串注意 厌烦了反斜杠?在大多数情况下,可通过使用长字符串和原始字符串(可结合使用这两种字符串)来避免使用反斜杠。
为处理前述不太正常的示例,来看另一种表示这个字符串的方式:
>>> "Let's say " '"Hello, world!"' 'Let's say "Hello, world!"'
我依次输入了两个字符串,而Python自动将它们拼接起来了(合并为一个字符串)。这种机制用得不多,但有时候很有用。然而,仅当你同时依次输入两个字符串时,这种机制才管用。
>>> x = "Hello, " >>> y = "world!" >>> x y SyntaxError: invalid syntax
换而言之,这是一种输入字符串的特殊方式,而非通用的字符串拼接方法。那么应该如何拼接字符串呢?就像将数相加一样,将它们相加:
>>> "Hello, " + "world!" 'Hello, world!' >>> x = "Hello, " >>> y = "world!" >>> x + y 'Hello, world!'*2.3 字符串表示 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能以合理的方式将值转换为用户能够看懂的字符串。例如,尽可能将特殊字符编码转换为相应的字符。然而,使用repr时,通常会获得值的合法Python表达式表示。
>>> print(repr("Hello,nworld!"))
'Hello,nworld!'
>>> print(str("Hello,nworld!"))
Hello,
world!
2.4 长字符串、原始字符串和字节
有一些独特而有用的字符串表示方式。例如,有一种独特的语法可用于表示包含换行符或反斜杠的字符串(长字符串和原始字符串)。对于包含特殊符号的字符串,在Python 3中,所有的字符串都是Unicode字符串。Unicode ( https://www.unicode.org/ ) 是一种规范,旨在列出人类语言使用的每个字符,并为每个字符提供自己的唯一代码。Unicode 规范不断修订和更新,以添加新的语言和符号。
- 长字符串
要表示很长的字符串(跨越多行的字符串),可使用三引号(而不是普通引号)。
>>> print('''This is a very long string. It continues here.
And it's not over yet. "Hello, world!"
Still here.''')
还可使用三个双引号,如"““like this””"。引号是让解释器能够识别表示字符串开始和结束位置,因此字符串本身可包含单引号和双引号,无需使用反斜杠进行转义。
- 原始字符串
原始字符串不以特殊方式处理反斜杠。在常规字符串中,反斜杠扮演着特殊角色:它对字符进行转义,让你能够在字符串中包含原本无法包含的字符。例如,你已经看到可使用n表示换行符,从而像下面这样在字符串中包含换行符:
>>> print('Hello,nworld!')
Hello,
world!
这通常挺好,但在有些情况下,并非你想要的结果。如果你要在字符串中包含n呢?例如,你可能要在字符串中包含DOS路径C:nowhere。
>>> path = 'C:nowhere' >>> path 'C:nowhere'
这好像没问题,但如果将其打印出来,就会出现问题。
>>> print(path) C: owhere
这并非你想要的结果,不是吗?那该怎么办呢?可对反斜杠本身进行转义。
>>> print('C:\nowhere')
C:nowhere
这很好,但对于很长的路径,将需要使用大量的反斜杠。
>>> path = 'C:\Program Files\fnord\foo\bar\baz\frozz\bozz'
在这样的情况下,原始字符串可派上用场,因为它们根本不会对反斜杠做特殊处理,而是让字符串包含的每个字符都保持原样。
>>> print(r'C:nowhere') C:nowhere >>> print(r'C:Program Filesfnordfoobarbazfrozzbozz') C:Program Filesfnordfoobarbazfrozzbozz
如你所见,原始字符串用前缀r表示。看起来可在原始字符串中包含任何字符,这大致是正确的。一个例外是,引号需要像通常那样进行转义,但这意味着用于执行转义的反斜杠也将包含在最终的字符串中。
>>> print(r'Let's go!') Let's go!
另外,原始字符串不能以单个反斜杠结尾。换而言之,原始字符串的最后一个字符不能是反斜杠,除非你对其进行转义(但进行转义时,用于转义的反斜杠也将是字符串的一部分)。根据前一个示例,这一点应该是显而易见的。如果最后一个字符(位于结束引号前面的那个字符)为反斜杠,且未对其进行转义,Python将无法判断字符串是否到此结束。
>>> print(r"This is illegal") >>> SyntaxError: EOL while scanning string literal
这合乎情理,但如果要指定以反斜杠结尾的原始字符串(如以反斜杠结尾的DOS路径),该如何办呢?基本技巧是将反斜杠单独作为一个字符串,下面是一个简单的示例:
>>> print(r'C:Program Filesfoobar' '\') C:Program Filesfoobar
拓展阅读请注意,指定原始字符串时,可使用单引号或双引号将其括起,还可使用三引号将其括起。
关于更多的关于字符串的详细说明,可以阅读《如何使用字符串》
3. 常量所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:
PI = 3.14159265359
但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量PI的值,也没人能拦住你。



