# 练习19.函数和变量
函数这个概念也许承载了太多的信息量,不过别担心。只要坚持做这些练习,对照上个练习中的检查点检查一遍这次的联系,你最终会明白这些内容的。
有一个你可能没有注意到的细节,我们现在强调一下:函数里边的变量和脚本里边的变量之间是没有关系的。下面的这个练习可以让你对这一点有更多的思考:
~~~
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 use 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`传递很多的参数,然后在函数里把它们打印出来。我们可以在函数里用变量名,可以在函数里做运算,甚至可以将变量和运算结合起来。
从一方面来说,函数的参数和我们的生成变量时用的`=`赋值符类似。事实上,如果你可以用`=`给一个东西命名,你也就可以将其作为参数传递给一个函数。
## 你看到的结果
你应该研究一下脚本的输出,和你想象的结果对比一下看有什么不同。
~~~
$ 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 use 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. 倒着将脚本读完,在每一行上面添加一行注解,说明这行的作用。
> 1. 从最后一行开始,倒着阅读每一行,读出所有的重要字符来。
> 1. 自己编至少一个函数出来,然后用10种方法运行这个函数。
## 常见问题
### Q: 怎么可能有10中方法来运行一个函数?
> 信不信由你,理论上有无数种方法去调用一个函数。看看你对函数、变量、用户输入有多少想象力和创造力。
### Q:有没有一种方法分析一下这个函数是做什么的,这样能让我更方便的理解它?
> 有很多种方法可以做到,但是尽量采用给每行增加注释的方式。另一种方式是大声的读出代码。第三种方式是将代码打印在纸上,并添加图片和注释用来解释代码实现了什么功能。
### Q: 如果我希望用户输入芝士和饼干的数量,我该怎么做?
> 你可以使用`int()`把你从`raw_input()`获取的参数转化为数字。
### Q: 在函数中能否改变变量`cheese_count`和`amount_of_cheese`的值?
> 当然不能, 这些变量是独立的,在函数体之外。 他们被作为零食变量传递给函数是为了保证函数的正常运行,当函数退出的时候,这些临时变量也就消失了。继续学习本书,你会更明白这些。
### Q: 定义一个和函数名相同名字的全局变量是不是不好?
> 当然不好, 如果你这么做了,后面你就搞不清你在说变量还是函数了。 但有时候你可能必须要用相同的名字,否则你可能会遇到一些难题。但是不管怎么说,尽量避开这种做法。
### Q: 函数可以限制参数的传递个数?
> 这取决于你python的版本以及你用什么电脑,即使有这个限制的数字也是非常大的。为了使函数方便使用,实际的限制大约时5个参数,也就是说当函数参数超过5个的时候,函数就会变得不方便使用。
### Q:你能在一个函数中调用另一个函数吗?
> 可以,本书后面有一个制作游戏的例子就是这么做的。
- 序言
- 前言
- 简介
- 0:安装和准备
- 1:第一个程序
- 2:注释和“#”井号
- 3:数字和数学计算
- 4:变量和命名
- 5:更多的变量和打印
- 6:字符串和文本
- 7:更多的打印(输出)
- 8:打印, 打印
- 9:打印, 打印, 打印
- 10:那是什么?
- 11:提问
- 12:提示别人
- 13:参数, 解包, 变量
- 14:提示和传递
- 15:读文件
- 16:读写文件
- 17:更多文件操作
- 18:命名, 变量, 代码, 函数
- 19:函数和变量
- 20:函数和文件
- 21:函数的返回值
- 22:到目前为止你学到了什么?
- 23:阅读代码
- 24:更多的练习
- 25:更多更多的练习
- 26:恭喜你,可以进行一次考试了
- 27:记住逻辑
- 28:布尔表达式
- 29:IF 语句
- 30:Else 和 If
- 31:做出决定
- 32:循环和列表
- 33:while循环
- 34:访问列表元素
- 35:分支和函数
- 36:设计和调试
- 37:复习符号
- 38:列表操作
- 39:字典,可爱的字典
- 40:模块, 类和对象
- 41:学会说面向对象
- 42:对象、类、以及从属关系
- 43:基本的面向对象的分析和设计
- 44:继承Vs.包含
- 45:你来制作一个游戏
- 46:项目骨架
- 47:自动化测试
- 48:更复杂的用户输入
- 49:写代码语句
- 50:你的第一个网站
- 51:从浏览器获取输入
- 52:开始你的web游戏
- 来自老程序员的建议
- 下一步
- 附录A:命令行教程
- 简介
- 安装和准备
- 路径, 文件夹, 名录 (pwd)
- 如果你迷路了
- 创建一个路径 (mkdir)
- 改变当前路径 (cd)
- 列出当前路径 (ls)
- 删除路径 (rmdir)
- 目录切换(pushd, popd)
- 生成一个空文件(Touch, New-Item)
- 复制文件 (cp)
- 移动文件 (mv)
- 查看文件 (less, MORE)
- 输出文件 (cat)
- 删除文件 (rm)
- 退出命令行 (exit)
- 下一步