练习3
写一个函数,用欧几里德方法寻找两个数的一个共同因数。工作过程是这样的:
1. 假设两个数,a和b,a大于b
2. 重复以下步骤直到b变成0:
1. a变为b的值
2. b变成没有改变值之前的a除以没有改变值之前的b的余数
3. 返回a的最后一个值
提示:
* 使用a和b作为函数的参数
* 简单的设定a大于b
* x除以z的余数用表达式 x % z 来计算
* 两个变量可以象这样一起赋值:x, y = y, y+1。这里x被赋以值y(这意味着,y的值此前已经指定)而且y被递增了1。
7. 深入函数
上面的练习怎么做?难吗?还不太清楚函数?别担心--我还没完成我的话题呢。
我们构建函数时使用的萃取方法称为过程抽象,许多编程语言把关键字过程同函数一样使用。事实上,这两个概念是不一样的,但是在python中它们都被称为函数(因为它们或多或少以同样的方式定义和使用)。
函数和过程(在其它语言中)的区别在哪里呢?嗯--就像你在前面的段落里看到的那样,函数可以返回一个值。区别就是过程并不返回这样的值。许多时候,用这种方法把函数划分为两种类型--返回值的和不返回值的--是很有用的。
不返回值的函数(过程)可以用作子程序或例行程序。我们调用这些函数,它们制造某些原料,就象泡沫鲜奶之类的。我们可以在很多地方使用这个函数而不需要重写它的代码(这被称为代码再利用--以后你还会知道,它意义不仅仅在这里)。
这样的函数(或过程)的另一个有用性体现在--它改变了环境(例如,把糖和奶油混在一起搅拌,它们的整个外部状态就变化了)让我们看个例子:
def hello(who):
print "Hello, ", who
hello("world")
# Prints out "Hello, world"
打印出内容是它一方面的作用,因为这是这个函数唯一需要做的事,它其实是一个典型的所谓过程。但是……它事实上没有改变它的运行环境,是不是?它怎样才能改变呢?让我们试一下:
# The *wrong* way of doing it
age = 0
def setAge(a):
age = a
setAge(100)
print age
# Prints "0"
错在哪儿?错在函数setAge创建了它自己的也被命名为age的局部变量,它只在setAge函数内部可用。那如何才可以避免出现这个问题呢?我们可以使用全局变量。
注意:全局变量在python中不常用。它们容易引起不好的代码组织结构,被称为意大利面代码。我这里使用它们是为了引出更复杂一点的技术问题--如果你可以请尽量避免使用它们。
[color=#FF0000]未译完。。。[/color]
rockety 回复于:2005-06-06 09:27:59
[color=red]译完了的,只是不小心,没在我的blog上贴全,而且也没有给出缩进。:oops: 今天一并更正了。感谢wolfg转贴,并给出了正确的缩进。以下是其余部分:[/color]
通过告诉解释器一个变量是全局的(用象global age这样的表达式做),我们事实上
告诉了它在函数之外使用这个变量,而不是重新创建一个新的局部变量。(所以,和局部
相反它是全局的。)因此上面的程序可以象这样重写:
# The correct, but not-so-good way of doing it
age=0
def setAge(a):
global age
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 译文 教程 入门 不错 我们 可以 一个 函数 这样 使用 |
注册
个人空间
