第005课:变量与字符串

第005课:变量与字符串,第1张

index
    • 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解释器干了两件事情:

  1. 在内存中创建了一个'ABC'的字符串;
  2. 在内存中创建了一个名为a的变量,并把它指向'ABC'

也可以把一个变量a赋值给另一个变量b,这个 *** 作实际上是把变量b指向变量a所指向的数据,例如下面的代码:

# -*- coding: utf-8 -*-
a = 'ABC'
b = a
a = 'XYZ'
print(b)

最后一行打印出变量b的内容到底是'ABC'呢还是'XYZ'?如果从数学意义上理解,就会错误地得出ba相同,也应该是'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'只有abc这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I'm,空格,OK这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 规范不断修订和更新,以添加新的语言和符号。

  1. 长字符串
    要表示很长的字符串(跨越多行的字符串),可使用三引号(而不是普通引号)。
>>> print('''This is a very long string. It continues here. 
And it's not over yet. "Hello, world!" 
Still here.''') 

还可使用三个双引号,如"““like this””"。引号是让解释器能够识别表示字符串开始和结束位置,因此字符串本身可包含单引号和双引号,无需使用反斜杠进行转义。

  1. 原始字符串
    原始字符串不以特殊方式处理反斜杠。在常规字符串中,反斜杠扮演着特殊角色:它对字符进行转义,让你能够在字符串中包含原本无法包含的字符。例如,你已经看到可使用\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的值,也没人能拦住你。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/921212.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存