...函数:返回数据
给生成乘法表的两个 for 循环。
清单 4. 在函数中返回一个值
esTable2 函数,函数创建了一个 5 行(默认值)3 列(所提供的值)的乘法表。
ncols 的两个输入参数,允许在调用函数时更改乘法表的大小。这两个参数随后会被提供
将计算结果值返回给调用代码。有时要实现这两个目的,需要分别调用不返回任何数据的
使用方法时,人们最希望获得的结果并非总是乘法表。您可能希望完成一次计算,并
,甚至可以一个参数都不包含。但这种方法可能会导致某些问题。如果您在函数调用期间
高的灵活性,因为在您调用函数时,可以包含两个输入参数,也可以仅包含一个输入参数
调用方法(子例程)和返回值的方法(函数)。但在 Python 中,您无需担心这些语义问
未指定全部参数,则必须显式地写出您所指定的参数的名称,以使 Python 解释器能够正
提供默认值,方法是在参数名后添加等号和值,例如 nrows=5。默认参数使程序获得了更
关于 timesTable2 函数的另一要点就是两个输入参数有默认值。在函数签名中为参数
题,因为通过使用 return 语句,几乎可以相同的方式实现这两个目的(参见清单 4)。
确地调用函数。最后一个函数调用正体现了这一点,它显式地调用了带有 ncols=3 的 tim
3.0... sum = 0.0>>> def stats(data):... for value in data:... sum += value... return (sum/len(data))>>> stats([1, 2, 3, 4, 5]) # Find the mean value from a list3.0>>> stats()结果返回给调用语句。
清单 5. 返回复合值
算一组数据的平均值,然后返回值。函数定义接受一个输入参数。平均值通过 return 语
含恰当的错误检查和处理,以应对这些情况,但这不在本文讨论范围内。)
此示例已经非常有用,但还可使它更强大,如清单 5 所示。在 Python 中,函数可返回
句传回。当您调用带有包含数字 1 到 5 的 list 或 tuple 的函数时,返回值会显示在屏幕
这个简单的函数遍历 data(假设 data 为一个容纳有数字数据的 Python 容器),计
任何有效的对象类型,包括容器类型在内。因此,您可以计算多个数量,并轻松地将多个
的函数,就会导致出错。(在此类情况下抛出错误是很有意义的。更高级的处理方法应包
上。如果调用不带任何参数的函数、带非容器数据类型的函数或带内含非数字数据的容器
... sum = 0.0>>> stats(\>>> def stats(data): File \line 1, in ? File \line 1, in ? File \line 4, in statsTraceback (most recent call last):Traceback (most recent call last):TypeError: stats() takes exactly 1 argument (0 given)TypeError: unsupported operand type(s) for +=: 'float' and 'str' >>> stats((1, 2, 3, 4, 5)) # Find the mean value from a tuple...5.0 7.5 (3.0, 2.5)>>> print m, v... sum = 0.0解包为各自的分量。
... for value in data:... sum += value>>> stats([1, 2, 3, 4, 5])... mean = sum/len(data)... return (mean, variance)... variance = sum/(len(data) - 1)... sum += (value - mean)**2>>> (m, v) = stats([1, 2, 3, 4, 5, 6, 7, 8, 9]) 模块:简化代码重用
... for value in data:,创建并返回一个 tuple。新 stats 函数的函数体要略加修改,以计算数字序列的样本方
差。最后,正如 stats 函数的两次调用所示,tuple 值可作为一个 tuple 存取,也可将其
至此,您或许已相信了代码重用的价值。但即便是使用函数,您依然需要在打算使用
为了从一个函数中返回多个值,要将其括在一个括号中并以逗号分隔 —— 换句话说
函数时重新输入函数体。例如,当您打开一个新的 Python 解释器时,必须键入之前所创
建的所有函数。幸运的是,您可以使用模块 将相关函数(和其他 Python 对象)封装在
清单 6. 使用模块
5.0 7.5 (5.0, 7.5)>>> print m, v>>> import test含于 Python 解释器之中。
断您想使用的对象。
>>> from test import stats>>> test.stats([1, 2, 3, 4, 5, 6, 7, 8, 9]) 第三行 from test import stats 也打开了文件 test.py,但它隐式地将 stats 方法置
函数,但若需要,您还可定义更多的函数。调用 stats 函数时,应以模块名 test 作为函
为介绍在 Python 中使用模块的方法,我们将重用清单 5 中的 stats 方法。有两个
入当前文件的作用域内,以使您能够直接调用 stats 函数(无需使用模块名)。明智地使
一起,将其保存在一个文件中,然后将这些已定义好的函数导入到新 Python 代码内,包
第一行 import test 打开文件 test.py 并处理文件中的各条语句。这里仅定义了 stats
更糟糕的作用域冲突错误。不要滥用您的新武器!新的 Python 解释器,然后输入如清单 6 所示的语句。
>>> (m, v) = stats([1, 2, 3, 4, 5, 6, 7, 8, 9])用 from ... import ... 语法可使您的程序更简洁,但过度的使用也会导致混淆,甚至出现选择:您可以从与本文相关的压缩文件中提取名为 test.py 的文件,也可以在编辑器中键入函数,然后将文件保存为 test.py。完成上一步后,在您保存 test.py 的目录中启动一个数前缀。之所以使用这种复杂的名称,是出于作用域 方面的考虑,作用域表示一个程序内
。这一点非常重要,因为您可能拥有多个名称相同的对象。作用域规则可帮助 Python 判
名称的有效范围。为告知 Python 您要调用的是哪个 stats 方法,就必须提供完整的名称
所示。
模块库
块访问。常用模块示例如下:
FILENAME math>>> help(math)Help on module math: File \line 1, in ? math 包含有用的数学函数。
array 包含数组数据类型和相关函数。
datetime 包含有用的日期和时间处理函数。
sys 包含用于与 Python 解释器交互的数据和方法。
清单 7. 获得关于 math 模块的帮助信息>>> help(math) 使用 Python 编程语言的一个主要好处就是大型的内置式标准库,可作为 Python 模
由于这些都是内置模块,因此您可以通过帮助解释器来了解更多相关内容,如清单 7
python2.4/lib-dynload/math.soTraceback (most recent call last):NameError: name 'math' is not defined /System/Library/Frameworks/Python.framework/Versions/2.4/lib/>>> import math # Need to import math module in order to use it