原文链接:http://learnpythonthehardway.org/book/ex19.html
关于函数的使用可能大量让你头晕目眩的信息,但是不要担心你学不会它。你只要坚持做这些练习并且坚持按上一次练习中提到的检查列表来写函数,你最终将会学会使用它的。
有一个很小的细节你可能还没有意识到,现在我们将补充一下。就是你函数中的变量跟你脚本中的变量没有关联。下面这个例子可以帮助i思考这个问题:
def cheese_and_crackers(cheese_count ,boxes_of_crackers):
print "You have %d cheeses!" % cheese_count
print "You have %d boxes of crackers!" % boxes_of_crackers
print "Man that's enough for a party!"
print "Get a blanket.\n"
print "We can just give the function numbers directly:"
cheese_and_crackers(20 ,30)
print "OR ,we can user variables from our script:"
amount_of_cheese = 10
amount_of_crackers = 50
cheese_and_crackers(amount_of_cheese ,amount_of_crackers)
print "We can even do math inside too:"
cheese_and_crackers(10 + 20 ,5 + 6)
print "And we can combine the two ,variables and math:"
cheese_and_crackers(amount_of_cheese + 100 ,amount_of_crackers + 1000)
这个例子展示了我们能够成功传递需要打印的参数值到 cheese_and_crackers 函数的各种方法。我们可以直接给它传递数字,传递变量,传递数学表达式,甚至传递数学表达式和变量的结合形式。
在某种程度上来说,函数中的参数赋值有点类似 = 符号飞赋值方式。实际上,如果某个变量可以使用 = 操作符,那么一般你就可以将它作为一个参数传递到函数中。
输出的结果如下:
你应该通过把这本脚本输出的结果和你在脚本中写的每一个实例预想的结果对比中来学习。
c:\>python ex19.py
We can just give the function numbers directly:
You have 20 cheeses!
You have 30 boxes of crackers!
Man that's enough for a party!
Get a blanket.
OR ,we can user variables from our script:
You have 10 cheeses!
You have 50 boxes of crackers!
Man that's enough for a party!
Get a blanket.
We can even do math inside too:
You have 30 cheeses!
You have 11 boxes of crackers!
Man that's enough for a party!
Get a blanket.
And we can combine the two ,variables and math:
You have 110 cheeses!
You have 1050 boxes of crackers!
Man that's enough for a party!
Get a blanket.
研究训练:
1、返回执行的脚本为脚本中的每一行代码写上注释标明它们都做了什么?
2、从脚本的底部开始向上阅读每一行,读出里面所有重要的字符。
3、至少写一个你自己设计的函数,并且用十种不同的方式来调用这个函数。
学生遇见的常见问题:
怎么可能会有十种不同的方法来调用一个函数?
答:信不信由你,理论上来说有无限多种方式去调用任何函数。在这里,你创造性的像我在代码中8~12行中那样去做。
有没有一种方法可以分析一个函数的功能,这样的话我就可以更好的理解一个函数了?
答:除了对每一行代码写上描述它做了什么的注释外,还有很多不同的方式也可以帮你更好的理解函数。另一种方法就是大声的读出你的代码。还有一种方式就是将代码打印出来然后以图片和注释的方式写在纸上来标明它们做了什么事情。
如果我想要让用户来输入cheese 和 crackers的数量的话会怎么样?
答:你只需要记住你用 raw_input 函数获得的值需要用 int()函数来进行转换。
在13和14创建的变量是否改变了函数中的参数?
答:没有,这些变量是与函数分离的并不在函数中,它们只是当函数执行的时候传递给函数一个临时变量值给它。当函数退出的时候这些临时变量就被释放了,而其它都保持不变。继续学习这本书你会对这种问题越来越清晰。
将全局变量名(比如第13和14行的变量)写的和函数中的变量名一样是不是一种不好的习惯?
答:是的,因为那样的话你就不能确认你正在使用哪个变量。但是有时候你还是必须用同样的名称,或者你碰巧刚好用到一样的。无论如何你还是尽可能的避免把全局变量名写的和函数变量名一样。
12~19行是重写了 cheese_and_crackers 函数吗?
答:不,压根就没有重写。它只是调用了cheese_and_crackers 函数,从本质上来说它只是临时的跳到了这个函数的第一行开始调用这个函数,然后执行完这个函数的最后一行的后又跳回来继续往下执行。这并没有用任何东西去替换函数。
一个函数的参数个数有没有什么限制?
答:这一般取决于你的Python版本和你使用的电脑,但是一般来说允许的参数个数是非常大的。但实际上超过五个参数的函数使用就不是很方便了。
可以在一个函数中调用另一个函数吗?
答:可以 ,在这本书最后面写一个游戏的实例中就有这种使用方式。