# 练习18.命名, 变量, 代码, 函数
标题包含的内容够多的吧?接下来我要教你“函数(function)”了!说到函数,不一样的人会对它有不一样的理解和使用方法,不过我只会教你现在能用到的最简单的使用方式。
函数可以做三样事情:
> 1. 它们给代码片段命名,就跟“变量”给字符串和数字命名一样。
> 1. 它们可以接受参数,就跟你的脚本接受`argv`一样。
> 1. 通过使用 #1 和 #2,它们可以让你创建“微型脚本”或者“小命令”。
python中你可以使用`def`新建函数。我将让你创建四个不同的函数,它们工作起来和你的脚本一样。然后我会演示给你各个函数之间的关系。
~~~
# this one is like your scripts with argv
def print_two(*args):
arg1, arg2 = args
print "arg1: %r, arg2: %r" % (arg1, arg2)
# ok, that *args is actually pointless, we can just do this
def print_two_again(arg1, arg2):
print "arg1: %r, arg2: %r" % (arg1, arg2)
# this just takes one argument
def print_one(arg1):
print "arg1: %r" % arg1
# this one takes no arguments
def print_none():
print "I got nothin'."
print_two("Zed","Shaw")
print_two_again("Zed","Shaw")
print_one("First!")
print_none()
~~~
让我们把地一个函数`print_two`分解一下,这个函数和你写脚本的方式差不多,因此你看上去应该会觉着比较眼熟:
> 1.首先我们告诉Python创建一个函数,我们使用到的命令是`def`,也就是“定义(define)”的意思。
> 1. 紧接着def的是函数的名称。本例中它的名称是`print_two`,但名字可以随便取,就叫`peanuts`也没关系。但函数名最好能够体现出函数的功能来。
> 1. 然后我们告诉函数我们需要`*args`,这和脚本的`argv`非常相似,参数必须放在圆括号 () 中才能正常工作。
> 1. 接着我们用冒号`:`结束本行,然后开始下一行缩进。
> 1. 冒号以下,使用4个空格缩进的行都是属于`print_two`这个函数的内容。 其中第一行的作用是将参数解包,这和脚本参数解包的原理差不多。
> 1. 为了演示它的工作原理,我们把解包后的每个参数都打印出来,这和我们在之前脚本练习中所作的类似。
函数`print_two`的问题是:它并不是创建函数最简单的方法。在 Python 函数中我们可以跳过整个参数解包的过程,直接使用`()`里边的名称作为变量名。这就是`print_two_again`实现的功能。
接下来的例子是`print_one`,它向你演示了函数如何接受单个参数。
最后一个例子是`print_none`,它向你演示了函数可以不接收任何参数。
> **Warning:**如果你不太能看懂上面的内容也别气馁。后面我们还有更多的练习向你展示如何创建和使用函数。现在你只要把函数理解成“迷你脚本”就可以了。
## 你看到的结果
运行上面的脚本会看到如下结果:
~~~
$ python ex18.py
arg1: 'Zed', arg2: 'Shaw'
arg1: 'Zed', arg2: 'Shaw'
arg1: 'First!'
I got nothin'.
$
~~~
你应该已经看出函数是怎样工作的了。注意到函数的用法和你以前见过的 `exists`、`open`,以及别的“命令”有点类似了吧?其实我只是为了让你容易理解才叫它们“命令”,它们的本质其实就是函数。也就是说,你也可以在自己的脚本中创建你自己的“命令”。
## 附加题
为自己写一个`函数注意事项`以供后续参考。你可以写在一个索引卡片上随时阅读,直到你记住所有的要点为止。注意事项如下:
> 1. 函数定义是以 `def` 开始的吗?
> 1. 函数名称是以字符和下划线 `_`组成的吗?
> 1. 函数名称是不是紧跟着括号 `(` ?
> 1. 括号里是否包含参数?多个参数是否以逗号隔开?
> 1. 参数名称是否有重复?(不能使用重复的参数名)
> 1. 紧跟着参数的是不是括号和冒号 `):` ?
> 1. 紧跟着函数定义的代码是否使用了 4 个空格的缩进 (indent)?
> 1. 函数结束的位置是否取消了缩进 (“dedent”)?
当你运行(或者说“使用use”或“调用call”)一个函数时,记得检查下面的点:
> 1. 调运函数时是否使用了函数的名称?
> 1. 函数名称是否紧跟着 `(`?
> 1. 括号后有无参数?多个参数是否以逗号隔开?
> 1. 函数是否以 `)` 结尾?
按照这两份检查表里的内容检查你的代码,直到你不需要检查表为止。
最后,将下面这句话阅读几遍:
~~~
‘运行函数(run)’、‘调用函数(call)’、和‘使用函数(use)’是同一个意思
~~~
## 常见问题
### Q:什么字符允许用在函数名上?
> 和变量命名规则相同。不能以数字开头,并且只能包含字母数字和下划线。
### Q:`*args` 中的星号`*`是干嘛的?
> 它告诉python把函数的所有参数组织一个列表放在`args`里。类似你之前用过的`argv`,只不过`*args`是用在函数里的,
### 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)
- 下一步