- 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'
了。
字符串是以英文的单引号'
或双引号"
括起来的任意文本,比如'abc'
,"xyz"
等等,引号一定是成对出现的。请注意,''
或""
本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'
只有a
,b
,c
这3个字符。如果'
本身也是一个字符,那就可以用""
括起来,比如"I'm OK"
包含的字符是I
,'
,m
,空格,O
,K
这6个字符。
与数一样,字符串也是值:
>>> "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 Files\fnord\foo\bar\baz\frozz\bozz')
C:\Program Files\fnord\foo\bar\baz\frozz\bozz
如你所见,原始字符串用前缀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 Files\foo\bar' '\\')
C:\Program Files\foo\bar\
拓展阅读请注意,指定原始字符串时,可使用单引号或双引号将其括起,还可使用三引号将其括起。
关于更多的关于字符串的详细说明,可以阅读《如何使用字符串》
3. 常量所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:
PI = 3.14159265359
但事实上PI
仍然是一个变量,Python根本没有任何机制保证PI
不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量PI
的值,也没人能拦住你。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)