Python中表示字符串可以用单引号、双引号乃至三引号,它们有什么区别呢?本文记录了我对Python中字符串的若干疑问。

1. Python中单引号和双引号表示的字符串有何区别?

在Python中既可以使用单引号表示字符串,也可以使用双引号表示字符串,它们没有区别。如下所示:

1
2
3
4
s1 = 'hello'
s2 = "world"

print(s1 + " " + s2)

输出:

1
hello world

Python不像Java中那样,单引号表示字符,双引号表示字符串。所以Python的语法拥有了更高的灵活性。例如,单引号和双引号可以嵌套使用,以使得字符串更直观。例如,我们需要得到一个字符串:“He said “you are so beautiful””,如下所示:

1
2
3
4
# 如果只能使用双引号:
print("He said \"you are so beautiful\"")
# 如果嵌套使用单引号和双引号:
print('He said "you are so beautiful"')

上述示例得到的输出结果一致:

1
2
He said "you are so beautiful"
He said "you are so beautiful"

2. Python中三引号字符串的作用

Python中还可以使用三引号(包括了'''""",这俩也没有区别),其作用之一就是写代码注释。

假设我们在Java中一个类的头部需要写一些注释,它大概是这样的:

1
2
3
4
/**
 * 这是一些注释
 * @author hongmao
 */

那么在Python中如果我们要写类似的注释,则可以这么做:

1
2
3
4
"""
这是一些注释
@author hongmao
"""

三引号在Python中除了记日志之外,还有一个作用就是保留一些字符串的格式。例如,我们想获得如下输出:

1
2
3
4
成绩单:
张三 85
李四 90
王二 78

我们可以怎么做呢?

尝试方案一:

1
2
3
4
5
s = "成绩单:" \
    "张三 85" \
    "李四 90" \
    "王二 78"
print(s)

输出结果:

1
成绩单:张三 85李四 90王二 78

结论:失败,在Python中使用\来拼接换行字符串,但仅是拼接字符串而已,并不会做换行。

尝试方案二:

1
2
s = "成绩单:\n张三 85\n李四 90\n王二 78"
print(s)

输出结果:

1
2
3
4
成绩单:
张三 85
李四 90
王二 78

结论:成功,但是字符串很丑,既不美观也不直观,稍有差错可能还会酿成大祸。

尝试方案三:

1
2
3
4
5
6
s = """成绩单:
张三 85
李四 90
王二 78
"""
print(s)

输出结果:

1
2
3
4
成绩单:
张三 85
李四 90
王二 78

结论:成功,且字符串既美观又直观

3. 如何表示不转义字符串?

如前一节中方案二的示例:

1
2
s = "成绩单:\n张三 85\n李四 90\n王二 78"
print(s)

这样可以按预期打印出换行的字符串,但是如果我们有需求输入\n但又不希望它换行呢?

方案一,加\n之前加转义符\,如下所示:

1
2
s = "成绩单:\\n张三 85\\n李四 90\\n王二 78"
print(s)

输出结果:

1
成绩单:\n张三 85\n李四 90\n王二 78

但是,这样一来,字符串就变得很丑,且如果少写了一个转义符的话问题就大了,所以可以尝试方案二,使用在字符串前添加r

1
2
s = r"成绩单:\n张三 85\n李四 90\n王二 78"
print(s)

输出结果:

1
成绩单:\n张三 85\n李四 90\n王二 78

4. Python中字符串前还可以加哪些字母?分别有何含义?

上一节已经已经提到了字符串前面可以加r表示此字符串无需转义,除此之外还有以下几种:

  • u,表示该字符串以unicode格式编码,通常在Python2中用在中文字符串前,防止因编码问题造成乱码,而Python3中字符串默认即为unicode字符串。

  • b,该字符串是bytes类型。

    Python3中bytes和str相互转化的方法为:

    1
    2
    
    str.encode('utf-8')
    bytes.decode('utf-8')
    
  • f,用来格式化字符串。例如:

    1
    2
    3
    
    username = "hongmao"
    age = 18
    print(f"I'm {username}, {age} years old")