专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Python » 化零为整:探索 Python 第 9 部分: 化零为整 »正文

化零为整:探索 Python 第 9 部分: 化零为整

来源: 发布时间:星期四, 2009年1月8日 浏览:26次 评论:0
  本文举例源代码或素材下载

  返璞归真

  许多流行玩具都以这样个概念为基础:简单积木这些简单积木可通过多种方式组合在起构造出全新作品 —— 有时甚至完全令人出乎意料概念同样适用于现实生活中建筑领域将基本原材料组合在形成有用建筑物平凡无奇材料、技术和工具简化了新建筑物建造过程同样也简化了对新踏入此领域人员培训

  相同基本概念也适用于计算机开发技术包括以 Python 编程语言编写本文介绍了使用 Python 创建基本构件 (building block) 思路方法可用于解决更为复杂问题这些基本构件可能小而简单也可能庞大而复杂无论采用哪种形式我们这场游戏就是定义基本构件然后使用它们来创建专属于您杰作

  :封装逻辑

  在本系列前几篇文章中您通常不得不重复输入所有代码即便它和上行代码完全相同此要求特例就是变量使用:化了变量内容的后就可以随时重用显而易见使用方法普及对我们大有好处

  描述杰出最流行箴言的就是他们很懒惰这并不表示杰出员不努力工作 —— 而是说他们喜欢灵活工作思路方法除非绝对必要否则从不反复做任何相同事情这也就意味着在您需要编写代码的前首先考虑如何实现重用Python 中有多种可实现重用途径但最简单技术莫过于使用也称为思路方法 或子例程

  和绝大多数现代编程语言类似Python 支持使用思路方法将组语句封装在从而可在必要时重复使用清单 1 给出了段简单伪代码为您展示如何在 Python 中编写思路方法

  清单 1. 定义伪代码

def myFunction(optional input data):
  initialize any local data
  actual statements that do the work
  optionally any results


  如您所见在 Python 中基本组成部分是包装器代码指明将被重用系列 Python 语句可接受输入参数输入参数在紧接着名(在本例中为 myFunction)的后圆括号内提供还可返回值(更为正式说法是:对象)包括像 tuple 这样 Python 容器

  在真正着手构建的前让我们先来看看有关伪代码些简单却重要要点:

  请注意名中所用大小写:大多数都是小写但在使用多个单词连接成名时后接各单词首字母应大写(例如myFunction 中 F)这就是所谓驼峰式大小写风格 (camel casing)是 Python 和其他编程语言中广泛采用种技术可使名称更易阅读

  定义中语句采用了缩进式排版体由 Python 语句块构成它们也必须像循环或条件语句那样缩进

  定义行也称为思路方法签名 (method signature)以 def 开头(def 是 这个单词缩写)

  思路方法签名以冒号结尾表示下面代码行是

  至此您或许已认可了使用思路方法好处那么让我们投入进去开始编写“Discover Python, Part 6: Programming in Python, For the fun of it” 中使用了个 for 循环来创建乘法表清单 2 展示了同样概念但本例中创建用于封装乘法表计算背后逻辑

  清单 2. 第

>>> def timesTable:
...   for row in range(1, 6):
...     for col in range(1, 6):
...       pr "%3d " % (row * col),
...     pr
...
>>> timesTable
 1  2  3  4  5
 2  4  6  8  10
 3  6  9  12  15
 4  8  12  16  20
 5  10  15  20  25
>>> t = timesTable
>>> type(t)
<type 'function'>
>>> t
<function timesTable at 0x64c30>
>>> t
 1  2  3  4  5
 2  4  6  8  10
 3  6  9  12  15
 4  8  12  16  20
 5  10  15  20  25


  timesTable 定义起来非常简单它不接受任何输入参数也不返回任何结果体几乎和 “Discover Python, Part 6” 中语句完全相同(但该文章中乘法表为从 1 到 10)为了 思路方法并使其发挥作用只需输入名后接圆括号即可本例中还输出了乘法表

  在 Python 中类对象和整型变量和容器对象相同因而您可以将指派给个变量(切记在 Python 中变量是动态类型化)在清单 2 中我们将 timesTable 指派给变量 t接下来两行代码表示变量 t 确实指向最后我们使用变量 t timesTable

  :动态更改逻辑

  清单 2 中 timesTable 不复杂但也不是特别有用更有用举例允许您指定用于生成乘法表行数和列数 —— 换言的允许您在时动态地更改操作方式定义中使用两个输入参数即可实现这功能如清单 3 所示

  清单 3. 更好乘法表

>>> def timesTable2(nrows=5, ncols=5):
...   for row in range(1, nrows + 1):
...     for cols in range(1, ncols + 1):
...       pr "%3d " % (row * cols),
...     pr
...
>>> timesTable2(4, 6)
 1  2  3  4  5  6
 2  4  6  8  10  12
 3  6  9  12  15  18
 4  8  12  16  20  24
>>> timesTable2 
 1  2  3  4  5
 2  4  6  8  10
 3  6  9  12  15
 4  8  12  16  20
 5  10  15  20  25
>>> timesTable2(ncols=3)
 1  2  3
 2  4  6
 3  6  9
 4  8  12
 5  10  15


  两个乘法表定义非常相近但清单 3 中有用得多(通过清单 3 中 3 次即可看出这点)添加此附加功能思路方法非常简单:提供名为 nrows 和 ncols 两个输入参数允许在时更改乘法表大小这两个参数随后会被提供给生成乘法表两个 for 循环

  有关 timesTable2 要点就是两个输入参数有默认值签名中为参数提供默认值思路方法是在参数名后添加等号和值例如 nrows=5默认参数使获得了更高灵活性在您可以包含两个输入参数也可以仅包含个输入参数甚至可以个参数都不包含但这种思路方法可能会导致某些问题如果您在期间未指定全部参数则必须显式地写出您所指定参数名称以使 Python 解释器能够正确地最后正体现了这它显式地了带有 ncols=3 timesTable2 创建了个 5 行(默认值)3 列(所提供值)乘法表

  :返回数据

  使用思路方法时人们最希望获得结果并非总是乘法表您可能希望完成次计算并将计算结果值返回给代码有时要实现这两个目需要分别不返回任何数据思路方法(子例程)和返回值思路方法()但在 Python 中您无需担心这些语义问题通过使用 语句几乎可以相同方式实现这两个目(参见清单 4)

  清单 4. 在中返回个值

>>> def stats(data):
...   sum = 0.0
...   for value in data:
...     sum value
...   (sum/len(data))
...
>>> stats([1, 2, 3, 4, 5])   # Find the mean value from a list
3.0
>>> stats((1, 2, 3, 4, 5))   # Find the mean value from a tuple
3.0
>>> stats
Traceback (most recent call last):
 File "<stdin>", line 1, in ?
TypeError: stats takes exactly 1 argument (0 given)
>>> stats("12345")
Traceback (most recent call last):
 File "<stdin>", line 1, in ?
 File "<stdin>", line 4, in stats
TypeError: unsupported operand type(s) for : 'float' and 'str'


  这个简单遍历 data(假设 data 为个容纳有数字数据 Python 容器)计算组数据平均值然后返回值定义接受个输入参数平均值通过 语句传回当您带有包含数字 1 到 5 list 或 tuple 返回值会显示在屏幕上如果不带任何参数、带非容器数据类型或带内含非数字数据容器就会导致出错(在此类情况下抛出是很有意义更高级处理思路方法应包含恰当检查和处理以应对这些情况但这不在本文讨论范围内)

  此举例已经非常有用但还可使它更强大如清单 5 所示在 Python 中可返回任何有效对象类型包括容器类型在内因此您可以计算多个数量并轻松地将多个结果返回给语句

  清单 5. 返回复合值

>>> def stats(data):
...   sum = 0.0
...   for value in data:
...     sum value
...   mean = sum/len(data)
...   sum = 0.0
...   for value in data:
...     sum (value - mean)**2
...   variance = sum/(len(data) - 1)
...   (mean, variance)
...
>>> stats([1, 2, 3, 4, 5])
(3.0, 2.5)
>>> (m, v) = stats([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> pr m, v
5.0 7.5


  为了从中返回多个值要将其括在个括号中并以逗号分隔 —— 换句话说创建并返回个 tuple新 stats 体要略加修改以计算数字序列样本方差最后正如 stats 两次所示tuple 值可作为个 tuple 存取也可将其解包为各自分量

  模块:简化代码重用

  至此您或许已相信了代码重用价值但即便是使用您依然需要在打算使用时重新输入例如当您打开个新 Python 解释器时必须键入的前所创建所有幸运您可以使用模块 将相关(和其他 Python 对象)封装在将其保存在个文件中然后将这些已定义好导入到新 Python 代码内包含于 Python 解释器的中

  为介绍在 Python 中使用模块思路方法我们将重用清单 5 中 stats 思路方法有两个选择:您可以从和本文相关压缩文件中提取名为 test.py 文件也可以在编辑器中键入然后将文件保存为 test.py完成上步后在您保存 test.py 目录中启动个新 Python 解释器然后输入如清单 6 所示语句

  清单 6. 使用模块

>>> import test
>>> test.stats([1, 2, 3, 4, 5, 6, 7, 8, 9])
(5.0, 7.5)
>>> from test import stats
>>> (m, v) = stats([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> pr m, v
5.0 7.5


  第行 import test 打开文件 test.py 并处理文件中各条语句这里仅定义了 stats 但若需要您还可定义更多 stats 应以模块名 test 作为前缀的所以使用这种复杂名称是出于作用域 方面考虑作用域表示内名称有效范围为告知 Python 您要是哪个 stats 思路方法就必须提供完整名称点非常重要您可能拥有多个名称相同对象作用域规则可帮助 Python 判断您想使用对象

  第 3行 from test import stats 也打开了文件 test.py但它隐式地将 stats 思路方法置入当前文件作用域内以使您能够直接 stats (无需使用模块名)明智地使用 from ... import ... 语法可使您更简洁但过度使用也会导致混淆甚至出现更糟糕作用域冲突不要滥用您新武器!

  模块库

  使用 Python 编程语言个主要好处就是大型内置式标准库可作为 Python 模块访问常用模块举例如下:

  math 包含有用数学

  sys 包含用于和 Python 解释器交互数据和思路方法

  .gif' /> 包含数据类型和相关

  datetime 包含有用日期和时间处理

  由于这些都是内置模块因此您可以通过帮助解释器来了解更多相关内容如清单 7 所示

  清单 7. 获得有关 math 模块帮助信息

>>> help(math)
Traceback (most recent call last):
 File "<stdin>", line 1, in ?
NameError: name 'math' is not d
>>> import math   # Need to import math module in order to use it
>>> help(math)
Help _disibledevent= stats([1, 2, 3, 4, 5, 6, 7, 8, 9])
pr "The mean and variance of the values "
"from 1 to 9 inclusive are ",m, v


  观察上例您应该会产生几分好感将 Python 置于文件内并使其运行是如此简单本例和 test.py 文件中代码的间惟差异就是包含了第在基于 UNIX 操作系统中本行会使 Python 解释器自动启动并在终止前处理文件中语句本举例中其他行定义了 stats 并输出了结果

  要运行本文件中语句您需要启动个 Python 解释器并让它去读取和处理文件内容为实现这您必须首先将清单 9 中举例输入到个名为 mystats.py 文件中也可从和本文相关压缩文件中提取文件进入包含此文件目录然后按清单 10 中所示命令执行注意对于 Microsoft® Windows® 操作系统而言仅应使用第条命令;其他命令是供 UNIX 系统(如 Linux® 或 Mac OS X)使用

  清单 10. 执行 Python

rb% python mystats.py
The mean and variance of the values from 1 to 9 inclusive are 5.0 7.5
rb% chmod +x mystats.py
rb% ./mystats.py
The mean and variance of the values from 1 to 9 inclusive are 5.0 7.5


  清单 10 中命令展示了运行个包含于文件的中 Python 思路方法条命令以文件名 Python 解释器无论使用哪种系统安装 Python、Python 解释器位于哪个目录下这种思路方法都有效第 2条命令 chmod 使包含 Python 文件成为可执行文件第 3条命令告诉操作系统运行这是通过使用 env 实现这是种独立于操作系统技术用于定位和运行 —— 本例中是 Python 解释器

  重用和缩减

  本文介绍了如何在 Python 中编写可重用代码讨论了如何在 Python 中使用思路方法或可重用块思路方法可接受输入参数也可返回数据包括容器数据类型在内这种功能使思路方法成为种可处理大量问题强大途径本文还介绍了模块模块可使您将相关思路方法及数据合并入个有组织层次结构中而此结构可方便地在其他 Python 中重用最后还介绍了如何将所有这些内容组合在起以创建个功能完整、独立 Python 您已经看到代码重用也就意味着您工作量缩减对于员而言懒惰是种优势而非陋习

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: