习题 19: 函数和变量 ************************************ 函数这个概念也许承载了太多的信息量,不过别担心。只要坚持做这些练习,对照上个练习\ 中的检查点检查一遍这次的联系,你最终会明白这些内容的。 有一个你可能没有注意到的细节,我们现在强调一下:函数里边的变量和脚本里边的变量\ 之间是没有连接的。下面的这个练习可以让你对这一点有更多的思考: .. literalinclude:: ex/ex19.py :linenos: 通过这个练习,你看到我们给我们的函数 ``cheese_and_crackers`` 很多的参数,然后在\ 函数里把它们打印出来。我们可以在函数里用变量名,我们可以在函数里做运算,我们甚至\ 可以将变量和运算结合起来。 从一方面来说,函数的参数和我们的生成变量时用的 ``=`` 赋值符类似。事实上,如果\ 一个物件你可以用 ``=`` 将其命名,你通常也可以将其作为参数传递给一个函数。 你应该看到的结果 =================== 你应该研究一下脚本的输出,和你想象的结果对比一下看有什么不同。 .. literalinclude:: ex/ex19.txt :language: console 加分习题 ============ 1. 倒着将脚本读完,在每一行上面添加一行注解,说明这行的作用。 2. 从最后一行开始,倒着阅读每一行,读出所有的重要字符来。 3. 自己编至少一个函数出来,然后用10种方法运行这个函数。 常见问题回答 ========================== 怎么能有 10 种不同的方式运行一个函数呢? 信不信由你,理论上有无穷多种方法运行一个函数。在这里,试着按我在 8-12 行的方式运行,当然你可以\ 随意创新。 有没有办法可以分析这个函数的功能以便我理解? 有很多方法,最简单的一个是在每一行代码上面添加注解,另外一个方法是大声朗读代码,还有一个\ 方法就是把代码打印出来,用笔画一些图示,并写一些注解说明。 怎样处理用户输入的数字,例如我想让用户输入克力架和奶酪的数量? 记住使用 ``int()`` 把 ``raw_input()`` 的值转为整数。 第 13 和 14 行创建的变量会不会改变函数中的变量? 不会。这些变量是在函数之外的,当它们被传递到函数中以后,函数会为这些变量创建一些临时的版本,\ 当函数运行结束后,这些临时变量就被丢弃了,一切又回到了从前。继续阅读本书,后面你会更清楚\ 这些概念。 把全局变量(如 13、14 行)的名称和函数变量的名称取成一样的,这样做是不是不好? 是的,因为这样的话你就无法确定哪个是哪个了。有时候你可能会必须使用同一个变量名,有时候你\ 会不小心使用了一样的变量名,不论如何,只要有可能,还是尽量避免变量名称相同吧。 第 12-19 行是不是覆写了函数 ``cheese_and_crackers``? 没有,完全没有。这只是函数调用而已。基本上就是这里会跳转到函数的第一行,然后等函数运行完\ 后再回到先前的位置。并没有把原函数怎么地。 函数的参数个数有限制吗? 取决于 Python 的版本和你的操作系统,不过就算有限,限值也是很大的。实际应用中,5 个参数就不少了,\ 再多就会让人头疼了。 可以在函数中调用函数吗? 可以。后面的习题中你会用这一技巧写一个游戏。