大多数程序都定义并收集某种数据,然后使用它们来做些有意义的事情。鉴于此,对数据进行分类大有裨益。我们将介绍的第一种数据类型是字符串。字符串虽然看似简单,但能够以很多不同的方式使用它们。
字符串就是一系列字符。在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号,如下所示:
"This is a string."
'This is also a string.'
2.2.1 修改大小写
对于字符串,可执行的最简单的操作之一是修改其中的单词的大小写。请看下面的代码,并尝试判断其作用:
# 我们又一个文件name.py
name = 'yuan shikai'
print(name.title())
将这个文件保存为name.py,再执行它。你将看到如下输出:
Yuan Shikai
在这个示例中,小写的字符串”yuan shikai”存储到了变量name中。在print()语句中,方法title()出现在这个变量的后面。方法是Python可对数据执行的操作。在name.title()中,name后面的句点(.)让Python对变量name执行方法title()指定的操作。每个方法后面都跟着一对括号,这是因为方法通常需要额外的信息来完成其工作。这种信息是在括号内提供的。函数title()不需要额外的信息,因此它后面的括号是空的。
title()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写。这很有用,因为你经常需要将名字视为信息。例如,你可能希望程序将值yuan、YUaN和yUAN视为同一个名字,并将它们都显示为Yuan。
还有其他几个很有用的大小写处理方法。例如,要将字符串改为全部大写或全部小写,可以像下面这样做:
name = "Yuan Shikai"
print(name.upper())
print(name.lower())
这些代码的输出如下:
YUAN SHIKAI
yuan shikai
在存储数据时,方法lower()很有用。很多时候,你无法依靠用户来提供正确的大小写,因此需要将字符串先转换为小写,再存储它们。以后需要显示这些信息时,再将其转换为最合适的大小写方式。
2.2.2 合并字符串(Concatenate Strings)
在很多情况下,都需要合并字符串。例如,你可能想将姓和名存储在不同的变量中,等要显示姓名时再将它们合而为一:
first_name = 'shikai'
family_name = 'yuan'
full_name = first_name + ' ' + family_name
print(full_name)
运行上面的代码,我们会看到输出:
shikai yuan
Python使用加号(+)来合并字符串。在这个示例中,我们使用+来合并first_name、空格和family_name,以得到完整的姓名。
这种合并字符串的方法称为拼接(Concatenation)。通过拼接,可使用存储在变量中的信息来创建完整的消息。如下面的例子:
first_name = "shikai"
family_name = "yuan"
full_name = first_name + " " + family_name
print("你好, " + full_name.title() + "!")
在这里,一个问候用户的句子中使用了全名,并使用了方法title()来将姓名设置为合适的格式。这些代码显示一条格式良好的简单问候语:
你好,Shikai Yuan!
2.2.3 使用制表符或换行符来添加空白
在编程中,空白(blank)泛指任何非打印字符,如空格(Space)、制表符(Tabular)和换行符(New Line)。你可使用空白来组织输出,以使其更易读。
要在字符串中添加制表符,可使用字符组合\t,如下述代码的所示:
print("hello")
输出:
>>>hello
print("\thello")
输出:
>>> hello
注:>>>并非输出内容,而是为了让后面的输出细节看得更清楚。
要在字符串中添加换行符,可使用字符组合\n:
print("Beauties:\nXishi\nWangzhaojun\nDiaochan\nYangyuhuan")
输出:
>>>Beauties:
>>>Xishi
>>>Wangzhaojun
>>>Diaochan
>>>Yangyuhuan
2.2.4 删除空白(Delete Blanks)
在程序中,额外的空白可能令人迷惑。对程序员来说,’python’和’python ‘看起来几乎没什么两样,但对程序来说,它们却是两个不同的字符串。Python能够发现’python ‘中额外的空白,并认为它是有意义的——除非你告诉它不是这样的。
空白很重要,因为你经常需要比较两个字符串是否相同。例如,一个重要的示例是,在用户登录网站时检查其用户名。但在一些简单得多的情形下,额外的空格也可能令人迷惑。所幸在Python中,删除用户输入的数据中的多余的空白易如反掌。
Python能够找出字符串开头和末尾多余的空白。要确保字符串末尾没有空白,可使用方法rstrip()。
best_language = 'python '
print(best_language+'number 1')
python number 1 注:输出加上‘number 1’只是为了让读者更清楚地看到‘python ’后面的空格。
print(best_language.rstrip()+'number 1')
pythonnumber 1
print(best_language+'number 1')
python number 1
存储在变量best_language中的字符串末尾包含多余的空白。你在终端会话中向Python询问这个变量的值时,可看到末尾的空格。对变量best_language调用方法rstrip()后,这个多余的空格被删除了。然而,这种删除只是暂时的,接下来再次询问best_language的值时,你会发现这个字符串与输入时一样,依然包含多余的空白。
best_language = 'python '
best_language = best_language.rstrip()
print(best_langauge+'number 1')
pythonnumber 1
你还可以剔除字符串开头的空白,或同时剔除字符串两端的空白。为此,可分别使用方法lstrip()和strip()。顾名思义,lstrip()可以将字符串最左边的空格删掉,而strip()可以讲字符串左右两端的空格都删除掉。他们的用法与rstrip()一模一样,因此不再赘述。
2.2.5 使用字符串时避免语法错误
语法错误(Syntax Error)是一种时不时会遇到的错误。程序中包含非法的Python代码时,就会导致语法错误。例如,在用单引号括起的字符串中,如果包含撇号,就将导致错误。这是因为这会导致Python将第一个单引号和撇号之间的内容视为一个字符串,进而将余下的文本视为Python代码,从而引发错误。
下面演示了如何正确地使用单引号和双引号。请将该程序保存为errortest.py,再运行它:
message = "one of Python's strengh is its simple syntax"
print(message)
撇号位于两个双引号之间,因此Python解释器能够正确地理解这个字符串:
>>>one of Python’s strengh is its simple syntax
然而,如果你使用单引号,Python将无法正确地确定字符串的结束位置:
message = 'one of Python's strengh is its simple syntax'
print(message)
运行上面的代码,你会看到输出:
File “errortest.py”, line 1
message = ‘one of Python’s strengh is its simple syntax’
^
SyntaxError: invalid syntax
从上述输出可知,错误发生在第二个单引号后面。这种语法错误表明,在解释器看来,其中的有些内容不是有效的Python代码。错误的来源多种多样,这里指出一些常见的。学习编写Python代码时,你可能会经常遇到语法错误。语法错误也是最不具体的错误类型,因此可能难以找出并修复。
注:编写程序时,编辑器的语法突出功能可帮助你快速找出某些语法错误。看到Python代码以普通句子的颜色显示,或者普通句子以Python代码的颜色显示时,就可能意味着文件中存在引号不匹配的情况。
2.2.6 字符串格式化(Formatting)
一般来讲,在Python中共有3种字符串格式化的方法。第一种是调用format()函数;第二种是类似于c语言printf的方式,使用%来做格式化;第三种是比较新的方式,使用f string来做格式化。接下去我会为大家一一展示。
2.2.6.1 Format方法
首先是第一种方法,调用format()函数,话不多少,直接上代码。
# formatting.py
name = 'Six'
age = 23
message = "Happy {}rd Birthday to {}!".format(age, name)
print(message)
运行formatting.py,可以看到输出:
Happy 23rd Birthday to Six!
在字符串中的花括号{}代表占位符,就是说我们之后要格式化的内容将会填充到花括号里面去。我们甚至可以非常灵活地改变占位符的前后顺序,如:
# formatting.py
name = 'Six'
age = 23
message = "Happy {1}rd Birthday to {0}!".format(name, age)
print(message)
上面的代码明确地告诉format这个函数,我要在{0}这个地方放入format的第一个参数,在{1}这个地方放入format的第二个参数,运行输出结果同样为为:
Happy 23rd Birthday to Six!
2.2.6.2 类似于C的%方法
这种方法和C语言中的printf函数很像,直接上代码:
# formatting.py
name = 'Six'
age = 23
message = "Happy %drd Birthday to %s!" % (age, name)
print(message)
运行结果输出:
Happy 23rd Birthday to Six!
上面的代码中,字符串中的%d表示这是一个整数占位符,%s表示这是一个字符串占位符。字符串后面跟着一个百分号(%),然后就是一个元组(Tuple),元组里面就是要格式化的变量,位置必须一一对应,因为这种方法没法像format方法一样强制调整占位符的顺序。这种格式化的方式比较老,也不方便,在Python2里面很常见,不建议大家继续使用这种方法。
2.2.6.3 F-String
在Python 3.6之后,出现了一种新的格式化方式,使用起来非常方便,这就是F-String。F-String也被叫做”Formatted String Literals”。
直接上代码:
# formatting.py
name = 'Six'
age = 23
message = f"Happy {age}rd Birthday to {name}!"
print(message)
运行formatting.py,输出:
Happy 23rd Birthday to Six!
就是这么简单,我甚至都不需要多余的补充解释。字符串的”前面加个f,表示这是一个f-string,就是这么简单粗暴。