完成需求主要有两种方式:语句和表达式(函数、算术表达式等)。相信大部分读者已经知道这两者的区别了,不过不管怎样,我们还是再回顾一下。语句用关键字组成命令,类似于告诉解释器一个命令。你告诉它做什么,它就帮你做。语句可以有输出,也可以没有输出。让我们用语句来完成程序员经常谈论的第一个编程示例,。
>>> print 'Hello World!' Hello World!
表达式没有关键字。它们可以是使用数学运算符的算术表达式,也可以是使用括号调用的函数。它们可能会或可能不会接受用户输入,有些可能会或可能不会有输出。(未指定返回值的函数将自动返回 None,这相当于 NULL。)以下是函数 abs() 的示例,它接受数字输入并输出该数字的绝对值。
>>> abs(4) 4 >>> abs(-4) 4
本章我们将分别介绍语句和表达式。我们先来学习一下语句。
1.1 程序输出、语句和“!”
有些语言,比如 C,通过函数,比如 () 将数据输出到屏幕。然而,在大多数解释型脚本语言中,都是使用语句进行输出。很多脚本语言使用 echo 命令来输出程序结果。
核心笔记:在交互式解释器中显示变量的值
通常,当您想要查看变量的内容时,您会在代码中使用 语句。但是在交互式解释器中,您可以使用 语句显示变量的字符串表示,或者仅使用变量名称来查看该变量的原始值。
在下面的例子中,我们将一个字符串分配给一个变量,首先显示变量的内容,然后使用变量名显示它。
>>> myString = 'Hello World!' >>> print myString Hello World! >>> myString 'Hello World!'
请注意,当您仅使用变量名时,您打印的字符串用单引号括起来。这样非字符串对象就可以在屏幕上显示为字符串 - 也就是说,它显示对象的字符串表示,而不仅仅是字符串本身。引号表示您刚输入的变量的值是一个字符串。随着您对 的了解越来越多,您将知道语句调用 str() 函数来显示对象,而交互式解释器调用 repr() 函数来显示对象。
下划线( _ )在解释器中有特殊含义,表示最后一个表达式的值。因此上述代码执行后,下划线变量将包含该字符串。
>>> _ Hello World!
该语句与字符串格式运算符(%)结合,可以实现字符串替换功能,与C语言中的()函数十分相似。
>>> print "%s is number %d!" % ("Python",1) Python is number 1!
%s 表示用字符串替换,而 %d 表示用整数替换。另一个常用的是 %f,表示用浮点类型替换。本章中我们还会看到更多类似的例子。它非常灵活,因此即使将数字传递给 %s,也不会像其他严格语言那样导致严重后果。有关字符串格式化运算符的更多信息,请参见第 6.4.1 节。 该语句还支持将输出重定向到文件。该功能从 .0 开始添加。符号 >> 用于重定向输出。以下示例将输出重定向到标准错误输出。
import sys print >> sys.stderr, 'Fatal error: invalid input!'
以下是将输出重定向到日志文件的示例。
logfile = open('/tmp/mylog.txt', 'a') print >> logfile, 'Fatal error: invalid input!' logfile.close()
1.2 程序输入与()内置函数
获取用户输入的数据的最简单方法是使用 () 内置函数。它读取标准输入并将读取的数据分配给指定的变量。您可以使用 int() 内置函数将用户输入的字符串转换为整数。
>>> user = raw_input('Enter login name: ') Enter login name: root >>> print 'Your login is:', user Your login is: root
以上示例仅适用于文本输入。以下是输入数字字符串(并将字符串转换为整数)的示例:
>>> num = raw_input('Now enter a number: ') Now enter a number: 1024 >>> print 'Doubling your number: %d' % (int(num) * 2) Doubling your number: 2048
int() 内置函数将数字字符串转换为整数值,以便对其进行数学运算。有关 () 内置函数的更多信息,请参阅第 6.5.3 节。
核心说明:从交互式解释器获取帮助
在学习过程中,如果对某个不熟悉的函数需要帮助,只需要调用该函数内置的help()函数,通过函数名作为help()的参数,就可以得到相应的帮助信息。
>>> help(raw_input) Help on built-in function raw_input in module __builtin__: raw_input(...) raw_input([prompt]) -> string
从标准输入读取一个字符串,并自动删除字符串末尾的换行符。如果用户输入了 EOF 字符(Unix:Ctrl+D,:Ctrl+Z+),则会触发该操作。在 Unix 平台上,只要可用,就会使用 GNU 库。如果提供了提示字符串参数,则显示字符串时会自动删除字符串末尾的换行符。(此段是 help() 的输出,翻译是为了方便读者理解而解释的——译者注)
核心风格:始终在函数之外执行用户交互
初学者在需要显示信息或获取用户输入时很容易想到使用语句和()内置函数。但是,我们建议函数应该保持其明确性,即它们应该只接受参数并返回结果。从用户那里获取所需的数据,然后调用函数对其进行处理,从函数中获取返回值,然后将结果显示给用户。这样你就可以在其他地方使用你的函数,而不必担心自定义输出。此规则的一个例外是,如果函数的基本功能是获取用户输出或只是打印信息,那么在函数内部使用语句或()是可以的。更重要的是,将函数分为两类,一类是执行事情并且不需要返回值(例如与用户交互或设置变量的值),另一类是执行一些计算并最终返回结果。如果输出是函数的目的,那么在函数体内部使用语句也是一个可以接受的选择。
1.3 注意事项
与大多数脚本和 Unix 语言一样,# 符号用于表示注释。从 # 到行末的所有内容都是注释。
>>> # one comment ... print 'Hello World!' # another comment Hello World!
有一种特殊的注释,称为文档字符串。您可以在模块、类或函数的开头添加字符串,以用作在线文档,这是 Java 程序员非常熟悉的功能。
def foo(): "This is a doc string." return True
与普通注释不同,文档字符串可以在运行时访问,也可以用于自动生成文档。
1.4 操作符
与大多数其他语言一样,标准算术运算符以您熟悉的方式工作。
+ - * / // % **
加法、减法、乘法、除法和取余都是标准运算符。除法运算符有两种,单斜杠表示传统除法,双斜杠表示浮点除法(对结果进行四舍五入)。传统除法意味着如果两个操作数都是整数,它将执行向下取整除法(取小于商的最大整数)(有关“向下取整除法”的更多信息,请参阅第 5 章 - 译者注),而浮点除法是真正的除法,与操作数的类型无关。您可以在第 5 章中了解有关传统除法、真除法和浮点除法的更多信息。
还有一个指数运算符,即双星号 (**)。尽管我们一直在强调这些运算符的算术性质,但请注意,有些运算符已重载用于其他数据类型,例如字符串和列表。让我们看一个例子。
>>> print -2 * 4 + 3 ** 2 1
如您所见,运算符的优先级与您预期的一样:+ 和 − 具有最低优先级,*、/、// 和 % 具有较高优先级,一元运算符 + 和 − 具有较高优先级,指数运算具有最高优先级。首先计算 (3**2),然后计算 (-2*4),然后将两个结果相加。
当然,也有标准的比较运算符,它们根据表达式的真假返回布尔值。
< <= > >= == != <>
尝试一下,看看这些比较会产生什么结果。
>>> 2 < 4 True >>> 2 == 4 False >>> 2 > 4 False >>> 6.2 <= 6 False >>> 6.2 <= 6.2 True >>> 6.2 <= 6.20001 True
目前支持两种“不等于”比较运算符 != 和 ,分别是 C 风格和 ABC/ 风格。后者正在逐步淘汰,因此我们建议使用前者。
还提供逻辑运算符。
and or not
逻辑运算符允许您将任意表达式连接在一起并生成布尔值。
>>> 2 < 4 and 2 == 4 False >>> 2 > 4 or 2 < 4 True >>> not 6.2 <= 6 True >>> 3 < 4 < 5 True
最后一个例子在其他语言中通常是非法的,但它支持这样的表达方式,既简洁又美观。它实际上是以下表达式的缩写:
>>> 3 < 4 and 4 < 5
核心风格:使用括号增强代码可读性
在许多情况下,使用括号是个好主意,而不使用括号可能会导致程序产生不正确的结果,或者使代码的可读性降低并使读者感到困惑。括号不是语言所必需的,但为了提高可读性,使用括号总是值得的。维护您代码的任何人都会感谢您,当您再次阅读自己的代码时,您也会感谢自己。