2.3.3 使用制表符或换行符来添加空白
在编程中,空白泛指任何非打印字符,如空格、制表符和换行符。你可使用空白来组织输出, 以使其更易读。
要在字符串中添加制表符,可使用字符组合t,如下述代码的1处所示
代码语言:javascript复制>>> print("Python")
>>> print("tPython")
Python
要在字符串中添加换行符,可使用字符组合n:
代码语言:javascript复制>>> print("Languages:nPythonnCnJavaScript")
Languages:
Python
C
JavaScript
还可在同一个字符串中同时包含制表符和换行符。字符串"nt"让Python换到下一行,并在 下一行开头添加一个制表符。下面的示例演示了如何使用一个单行字符串来生成四行输出:
代码语言:javascript复制>>> print("Languages:ntPythonntCntJavaScript")
Languages:
Python
C
JavaScript
在接下来的两章中,你将使用为数不多的几行代码来生成很多行输出,届时制表符和换行符 将提供极大的帮助。
2.3.4 删除空白
在程序中,额外的空白可能令人迷惑。对程序员来说,'python'和'python '看起来几乎没 什么两样,但对程序来说,它们却是两个不同的字符串。Python能够发现'python '中额外的空 白,并认为它是有意义的——除非你告诉它不是这样的。
空白很重要,因为你经常需要比较两个字符串是否相同。例如,一个重要的示例是,在用户 登录网站时检查其用户名。但在一些简单得多的情形下,额外的空格也可能令人迷惑。所幸在 Python中,删除用户输入的数据中的多余的空白易如反掌。
Python能够找出字符串开头和末尾多余的空白。要确保字符串末尾没有空白,可使用方法 rstrip()。
代码语言:javascript复制>>> favorite_language = 'python '
>>> favorite_language
'python '
>>> favorite_language.rstrip()
'python'
>>> favorite_language
'python '
存储在变量favorite_language中的字符串末尾包含多余的空白(见1)。你在终端会话中向 Python询问这个变量的值时,可看到末尾的空格(见2)。对变量favorite_language调用方法 rstrip()后(见3),这个多余的空格被删除了。然而,这种删除只是暂时的,接下来再次询问favorite_language的值时,你会发现这个字符串与输入时一样,依然包含多余的空白(见4)。 要永久删除这个字符串中的空白,必须将删除操作的结果存回到变量中:
代码语言:javascript复制>>> favorite_language = 'python '
>>> favorite_language = favorite_language.rstrip()
>>> favorite_language
'python'
为删除这个字符串中的空白,你需要将其末尾的空白剔除,再将结果存回到原来的变量中(见 1)。在编程中,经常需要修改变量的值,再将新值存回到原来的变量中。这就是变量的值可能 随程序的运行或用户输入数据而发生变化的原因。
你还可以剔除字符串开头的空白,或同时剔除字符串两端的空白。为此,可分别使用方法 lstrip()和strip():
代码语言:javascript复制>>> favorite_language = ' python '
>>> favorite_language.rstrip()
' python'
>>> favorite_language.lstrip()
'python '
>>> favorite_language.strip()
'python'
在这个示例中,我们首先创建了一个开头和末尾都有空白的字符串(见1)。接下来,我们 分别删除末尾(见2)、开头(见3)和两端(见4)的空格。尝试使用这些剥除函数有助于你 熟悉字符串操作。在实际程序中,这些剥除函数最常用于在存储用户输入前对其进行清理。
2.3.5 使用字符串时避免语法错误
语法错误是一种时不时会遇到的错误。程序中包含非法的Python代码时,就会导致语法错误。 例如,在用单引号括起的字符串中,如果包含撇号,就将导致错误。这是因为这会导致Python将 第一个单引号和撇号之间的内容视为一个字符串,进而将余下的文本视为Python代码,从而引发 错误。
下面演示了如何正确地使用单引号和双引号。请将该程序保存为apostrophe.py,再运行它:
apostrophe.py
代码语言:javascript复制message = "One of Python's strengths is its diverse community."
print(message)
撇号位于两个双引号之间,因此Python解释器能够正确地理解这个字符串:
代码语言:javascript复制One of Python's strengths is its diverse community.
然而,如果你使用单引号,Python将无法正确地确定字符串的结束位置:
代码语言:javascript复制message = 'One of Python's strengths is its diverse community.'
print(message)
而你将看到如下输出:
代码语言:javascript复制File "apostrophe.py", line 1
message = 'One of Python's strengths is its diverse community.'
^
SyntaxError: invalid syntax
从上述输出可知,错误发生在第二个单引号后面(见1)。这种语法错误表明,在解释器看 来,其中的有些内容不是有效的Python代码。错误的来源多种多样,这里指出一些常见的。学习 编写Python代码时,你可能会经常遇到语法错误。语法错误也是最不具体的错误类型,因此可能 难以找出并修复。受困于非常棘手的错误时,请参阅附录C提供的建议。
注意 编写程序时,编辑器的语法突出功能可帮助你快速找出某些语法错误。看到Python代码 以普通句子的颜色显示,或者普通句子以Python代码的颜色显示时,就可能意味着文件 中存在引号不匹配的情况。
2.3.6 Python 2 中的 print 语句
在Python 2中,print语句的语法稍有不同:
代码语言:javascript复制>>> python2.7
>>> print "Hello Python 2.7 world!"
Hello Python 2.7 world!
在Python 2中,无需将要打印的内容放在括号内。从技术上说,Python 3中的print是一个函 数,因此括号必不可少。有些Python 2 print语句也包含括号,但其行为与Python 3中稍有不同。 简单地说,在Python 2代码中,有些print语句包含括号,有些不包含。
2.4 数字
在编程中,经常使用数字来记录游戏得分、表示可视化数据、存储Web应用信息等。Python 根据数字的用法以不同的方式处理它们。鉴于整数使用起来最简单,下面就先来看看Python是如 何管理它们的。
2.4.1 整数
在Python中,可对整数执行加( )减(-)乘(*)除(/)运算。
代码语言:javascript复制>>> 2 3
5
>>> 3 - 2
1
>>> 2 * 3
6
>>> 3 / 2
1.5
在终端会话中,Python直接返回运算结果。Python使用两个乘号表示乘方运算:
代码语言:javascript复制>>> 3 ** 2
9
>>> 3 ** 3
27
>>> 10 ** 6
1000000
Python还支持运算次序,因此你可在同一个表达式中使用多种运算。你还可以使用括号来修 改运算次序,让Python按你指定的次序执行运算,如下所示:
代码语言:javascript复制>>> 2 3*4
14
>>> (2 3) * 4
20
在这些示例中,空格不影响Python计算表达式的方式,它们的存在旨在让你阅读代码时,能 迅速确定先执行哪些运算。
2.4.2 浮点数
Python将带小数点的数字都称为浮点数。大多数编程语言都使用了这个术语,它指出了这样 一个事实:小数点可出现在数字的任何位置。每种编程语言都须细心设计,以妥善地处理浮点数, 确保不管小数点出现在什么位置,数字的行为都是正常的。
从很大程度上说,使用浮点数时都无需考虑其行为。你只需输入要使用的数字,Python通常 都会按你期望的方式处理它们:
代码语言:javascript复制>>> 0.1 0.1
0.2
>>> 0.2 0.2
0.4
>>> 2 * 0.1
0.2
>>> 2 * 0.2
0.4
但需要注意的是,结果包含的小数位数可能是不确定的:
代码语言:javascript复制>>> 0.2 0.1
0.30000000000000004
>>> 3 * 0.1
0.30000000000000004
所有语言都存在这种问题,没有什么可担心的。Python会尽力找到一种方式,以尽可能精确 地表示结果,但鉴于计算机内部表示数字的方式,这在有些情况下很难。就现在而言,暂时忽略 多余的小数位数即可;在第二部分的项目中,你将学习在需要时处理多余小数位的方式。
2.4.3 使用函数 str()避免类型错误
你经常需要在消息中使用变量的值。例如,假设你要祝人生日快乐,可能会编写类似于下面 的代码:
birthday.py
代码语言:javascript复制age = 23
message = "Happy " age "rd Birthday!"
print(message)
你可能认为,上述代码会打印一条简单的生日祝福语:Happy 23rd birthday!。但如果你运行 这些代码,将发现它们会引发错误:
代码语言:javascript复制Traceback (most recent call last):
File "birthday.py", line 2, in <module>
message = "Happy " age "rd Birthday!"
TypeError: Can't convert 'int' object to str implicitly
这是一个类型错误,意味着Python无法识别你使用的信息。在这个示例中,Python发现你使 用了一个值为整数(int)的变量,但它不知道该如何解读这个值(见1)。Python知道,这个变 量表示的可能是数值23,也可能是字符2和3。像上面这样在字符串中使用整数时,需要显式地指 出你希望Python将这个整数用作字符串。为此,可调用函数str(),它让Python将非字符串值表示 为字符串:
代码语言:javascript复制age = 23
message = "Happy " str(age) "rd Birthday!"
print(message)
这样,Python就知道你要将数值23转换为字符串,进而在生日祝福消息中显示字符2和3。经 过上述处理后,将显示你期望的消息,而不会引发错误:
代码语言:javascript复制Happy 23rd Birthday!
大多数情况下,在Python中使用数字都非常简单。如果结果出乎意料,请检查Python是否按 你期望的方式将数字解读为了数值或字符串。
2.4.4 Python 2 中的整数
在Python 2中,将两个整数相除得到的结果稍有不同
代码语言:javascript复制>>> python2.7
>>> 3 / 2
1
Python返回的结果为1,而不是1.5。在Python 2中,整数除法的结果只包含整数部分,小数部 分被删除。请注意,计算整数结果时,采取的方式不是四舍五入,而是将小数部分直接删除。
在Python 2中,若要避免这种情况,务必确保至少有一个操作数为浮点数,这样结果也将为 浮点数:
代码语言:javascript复制>>> 3 / 2
1
>>> 3.0 / 2
1.5
>>> 3 / 2.0
1.5
>>> 3.0 / 2.0
1.5
从Python 3转而用Python 2或从Python 2转而用Python 3时,这种除法行为常常会令人迷惑。 使用或编写同时使用浮点数和整数的代码时,一定要注意这种异常行为。
2.5 注释
在大多数编程语言中,注释都是一项很有用的功能。本书前面编写的程序中都只包含Python 代码,但随着程序越来越大、越来越复杂,就应在其中添加说明,对你解决问题的方法进行大致 的阐述。注释让你能够使用自然语言在程序中添加说明。
2.5.1 如何编写注释
在Python中,注释用井号(#)标识。井号后面的内容都会被Python解释器忽略,如下所示: comment.py
代码语言:javascript复制# 向大家问好
print("Hello Python people!")
Python解释器将忽略第1行,只执行第2行
代码语言:javascript复制Hello Python people!
2.5.2 该编写什么样的注释
编写注释的主要目的是阐述代码要做什么,以及是如何做的。在开发项目期间,你对各个部 分如何协同工作了如指掌,但过段时间后,有些细节你可能不记得了。当然,你总是可以通过研 究代码来确定各个部分的工作原理,但通过编写注释,以清晰的自然语言对解决方案进行概述, 可节省很多时间。 要成为专业程序员或与其他程序员合作,就必须编写有意义的注释。当前,大多数软件都是 合作编写的,编写者可能是同一家公司的多名员工,也可能是众多致力于同一个开源项目的人员。 训练有素的程序员都希望代码中包含注释,因此你最好从现在开始就在程序中添加描述性注释。 作为新手,最值得养成的习惯之一是,在代码中编写清晰、简洁的注释。 如果不确定是否要编写注释,就问问自己,找到合理的解决方案前,是否考虑了多个解决方 案。如果答案是肯定的,就编写注释对你的解决方案进行说明吧。相比回过头去再添加注释,删 除多余的注释要容易得多。从现在开始,本书的示例都将使用注释来阐述代码的工作原理。