英语原文共 11 页,剩余内容已隐藏,支付完成后下载完整资料
用于科学计算的Python
就其本身而言,对于用其他语言编写的科学代码来说,python是一种优秀的“指导”语言。然而,有了附加的基本工具,python就可以转换成一种适合科学和工程代码的高级语言,这种语言的速度通常足以立即发挥作用,但也足够灵活,可以通过附加的扩展来加快速度。
Python是一种解释性语言,具有表达性语法,有些人将其与可执行伪代码进行了比较。这可能是我在1996年爱上这门语言的部分原因,当时我正在寻找一种方法,在非常大的数据集上建立算法原型,这种方法压倒了我熟悉的其他解释计算环境的能力。随着我很快学会用Python提供的语法和对象表达复杂的思想,我对用Python编程的兴趣增加了。
用高级语言编写代码可以大大提高工作效率的想法并不新鲜。许多科学家和工程师在职业生涯的早期,通常会接触到一个或多个解释性的科学计算环境,因为他们可以帮助他们编写非琐碎的计算程序,而不会陷入语法和编译时间滞后的困境。python可以以这种方式使用,但它的独特特性为科学家和工程师提供了一个更好的环境,使他们能够更好地选择一种高级语言来编写科学应用程序。在本期特刊的其余文章中,您将发现大量关于为什么Python作为科学计算平台出色的原因。作为一种小开胃菜,请考虑一下这一列表的一般特征:
- 自由的开源许可证允许您根据自己的需要销售、使用或分发基于python的应用程序,无需额外的权限。
- 事实上,python在这么多平台上运行,您不必担心编写可移植性有限的应用程序,这也有助于避免供应商锁定。
- 该语言干净的语法和复杂的结构让您可以按照情况的要求,以过程或完全面向对象的方式进行编写。
- 强大的交互式解释器允许实时代码开发和实况实验,从而消除了从代码到测试开发过程中耗费时间和生产力的编译步骤。
- 使用自己的COM代码扩展python的能力意味着可以教会python以硬件允许的速度做任何事情。
- 您可以将python嵌入到现有的应用程序中,这意味着您可以立即在旧的可信应用程序上添加易于使用的贴面。
- 能够与系统上的各种其他软件进行交互,有助于充分利用您已经掌握的软件技能。
- 其大量的库模块(包括在标准库中停止的模块和通过额外下载的模块)意味着您可以快速构建复杂的程序,例如解决偏微分方程的Web服务器、具有自动负载平衡的分布式图像处理库,或从通过互联网,将结果发布到数据库,并通过电子邮件向您发送进度报告。
- 所有StandardGUI工具包都存在Python绑定,这意味着您可以在构建用户界面时应用快速开发技术。
- Python社区以向专门针对python的邮件列表、新闻组和IRC通道上的用户查询提供快速、有用的响应而闻名。
- 可在www.python.org/pypi上找到已分类的python模块的存储库,以及易于安装的简化软件管理的“eggs”。
有了这种对Python有用性的小小体验,让我们深入研究并尝试了解一点关于语言本身的内容。这个概述必须简洁。因为python是一种通用编程语言,所以有许多书和专门用于它的Internet站点提供了大量附加信息(请参阅“有用的参考资料”侧栏)。Python的帮助功能还提供了其他信息。
有用的参考资料
·D. Ascher et al., Numerical Python, tech. report UCRL-MA-128569,Lawrence Livermore Natrsquo;l Lab., 2001; http://numpy.scipy.org.
·P.F. Dubois, K. Hinsen, and J. Hugunin, “Numerical Python,” Computers in Physics, vol. 10, no. 3, 1996, pp. 262–267.
·E. Jones et al., “SciPy: Open Source Scientific Tools for Python,”2001; www.scipy.org.
·T.E. Oliphant, Guide to NumPy, Trelgol, 2006; www.trelgol.org.
·M. Pilgrim, Dive into Python, 2004; www.diveintopython.org.
·G. van Rossum and F.L. Drake, eds., Python Reference Manual, Python Software Foundation, 2006; http://docs.python.org/ref/ref.html.
清洁语法
Python作为科学家和工程师的计算语言的一个重要因素是其清晰的语法,可以使代码易于理解和维护。这些语法的一些细节包括由缩进定义的代码块,名称空间(模块)的广泛使用,易于阅读的循环结构(包括列表推导),异常处理和文档字符串。请考虑以下代码,该代码计算输入列表上的sinc函数:
from math import sin, pi def sinc(x):
lsquo;rsquo;rsquo;Compute the sinc function: sin(pi*x)/(pi*x)lsquo;rsquo;rsquo;
try:
val = (x*pi) return sin(val)/val
except ZeroDivisionError: return 1.0
output = [sinc(x) for x in input]
只需一点解释,这段代码完全可以理解。它显示了命名空间的使用,因为sin函数和pi常量保存在一个单独的模块中,必须“导入”才能使用。 (或者,我们可以使用import math和math.sin以及math.pi来引用对象)。模块是带有Python代码的文件(带有“.py”后缀)或专门为导入Python而构建的编译共享库。每个模块都包含一个命名空间,允许以一种允许代码从简单脚本扩展到复杂应用程序的方式对类似函数,类和变量进行分组。
此代码还演示了异常处理:try / except语法允许在分割失败时进行单独处理。另请注意,定义函数的代码块是缩进的,但不提供代码开头或结尾的指示。此功能可确保计算机和人类阅读器具有相同的代码级别概念,而虚假角色不会占用宝贵的屏幕空间。
函数定义之后的代码中的字符串是函数docstring,在自动文档工具(如pydoc和epydoc)的输出中生成帮助消息或记录函数时非常有用。输出列表通过称为列表推导的紧凑循环结构从输入序列生成。这个可读构造看起来几乎像可执行英语,因为它创建了一个新列表,其元素是输入序列中每个x的sinc(x)输出。
Python的主要功能之一是动态类型。请注意,从未指定sinc函数输入的类型 - 我们需要的是sin函数对其进行处理。在这种情况下,数学模块的sin函数不处理复数,但是cmath模块可以处理,因此我们可以根据需要使用它来替换数学模块。
有用的内置对象
Python中的所有内容都是特定类型(或类型)的对象;构造类型的标准方法是使用函数调用。但是,某些类型是由内置的简化语法构成的。内置标量类型是整数(无限大),浮点(双精度)和复数(双精度实部和虚部)。语法自动构造标量,如以下交互式解释器会话所示:
gt;gt;gt; type(1), type(1.0), type(1.0j), type(rsquo;onersquo;)
(lt;type rsquo;intrsquo;gt;, lt;type rsquo;floatrsquo;gt;, lt;type
rsquo;complexrsquo;gt;, lt;type rsquo;strrsquo;gt;)
gt;gt;gt;标记表示解释器已准备好接收代码。用逗号分隔项会自动构造一个称为元组的不可变(不可更改的一次构造)序列。在这个例子中,我还演示了一个字符串对象的创建,这是另一个在Python代码中广泛使用的不可变对象。 Python中的另一个序列是可变(可以更改)列表。列表可以包含任何Python对象的序列(包括额外的列表);因此,我们可以使用列表来构造简单的多维数组:
gt;gt;gt; a = [[rsquo;anrsquo;, rsquo;ecleticrsquo;, 3],[5.0,
rsquo;nothingrsquo;]]
gt;gt;gt; print a[1][0]
5.0
这是存储和使用小型数组的高效,快捷方式。但是,对于较大的阵列,NumPy更适合管理内存和速度要求(我将在后面详细讨论NumPy)。
Python的字典提供了一个非常有用的容器对象,它允许我们使用键查找值。例如,
gt;gt;gt; a = {2: rsquo;tworsquo;, rsquo;onersquo;:1}
gt;gt;gt; print a[rsquo;onersquo;], a[2]
1 two
:之前的对象是键,而:之后的对象是值。密钥必须是不可变的,以便快速执行查找步骤。字典对于存储数据以供以后使用密钥检索很有用,这是科学计算中的常见需求 - 我们甚至可以构建一个带字典的非常简单的稀疏矩阵存储方案。
文件对象对大多数科学计算项目也很重要。我们使用open命令构造这样的对象:
gt;gt;gt; fid = open(rsquo;simple.txtrsquo;,rsquo;wrsquo;)
gt;gt;gt; fid.write(“This is a string written to the file.”)
gt;gt;gt; fid.close()
此示例显示如何打开文件,向其写入一个简单的字符串,然后再次关闭它(我们也可以通过删除fid变量来关闭它)。要从文件中读取,我们使用文件对象的read方法返回带有文件字节的字符串。在这个例子中,我还演示了只要我们打开和关闭具有相同引用样式的特定字符串,double(“)和single()引号都可以分隔字符串常量。
函数和类
除了提供干净的语法之外,Python还通过将代码分成逻辑组(如模块,类(新对象定义)和函数)来构建可维护代码。正如我之前提到的,模块是一组Python代码,它们组合在一起形成一个文件(带有“.py”扩展名),它通常包含许多相关的函数或类。在模块上使用import命令后,我们可以使用点表示法来访问模块中定义的函数,类和变量:
gt;gt;gt; import numpy as N
gt;gt;gt; print N.linalg.inv([[1,2],[1,3])
[[ 3., -2.],
[-1., 1.]])
此代码段从numpy模块的linalg子模块调用inv函数(我将其重命名为当前会话的局部变量N)。 inv函数适用于任何嵌套序列,并查找二维数组的逆“矩阵”。
函数通常使用语法def funcname(...):lt;indented blockgt;定义。对于简单的函数,我们也可以使用lambda表达式,它允许我们编写一行(匿名)函数。这是一个lambda表达式,它使用递归公式来计算阶乘:
f = lambda x: (xlt;1) or x*f(x-1)
此函数接受一个参数并返回一个应该是整数输入的阶乘的对象。它起作用,因为如果第一个操作数为true,则或者操作不会计算第二个操作数。匿名函数偶尔会有用,但定义函数的标准方法是使用def语法:
def sum_and_mean(x, sumfunc=sum, norm=None):
if norm is None:
norm = len(x)
y = sumfunc(x) return y, y/float(norm)
此函数还说明了使用关键字参数来定义可选函数参数的默认值,以及使用元组从函数返回多个结果。调用函数时,可以解压缩生成的元组,从而给出函数返回多个参数的外观:
tot, ave = sum_and_mean([1, 4, 10, 3.0])
Python适合许多不同类型的人的大脑,部分原因是它支持过程和面向对象的编程风格。在每个模块中,您可以定义函数以实现行为或通过定义类来创建新对象。这些新对象可以具有方法和属性,包括教授Python如何解释特定于对象的语法的特殊方法(例如中缀运算符)。这是一个继承自列表对象的简单类,但重新定义了 , - 和*中缀运算符,以表示逐元素加法,减法和乘法:
class vector(list):
def __add__(self, other): res = [x y for x,y in zip(self, other)]
return vector(res)
def __sub__(self, other):
res = [x-y for x,y in zip(self, other)]
return vector(res)
def __mul__(self, other): res = [x*y for x,y in zip(self, other)]
return vector(
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[20031],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、文献综述、任务书、外文翻译、程序设计、图纸设计等资料可联系客服协助查找。