题目
从标题看,终于有点变成的感觉了不是么?接下来 Zed 将要教我们从最简单的方法来使用函数。
新知识
函数是一段可以重复运行的代码片段,使用函数可以提高一段代码的重复重复利用性,减少代码量,并且提高效率。
python 中定义函数有特定个格式,总是以 def
开头,后跟一个空格后是函数的名字,紧跟名字的是一对括号和冒号,如果这个函数有参数的话需要写在括号内,多个函数用逗号隔开。然后,在另起一行,和 def
起始位置相距 4 个空格 (缩进 4 个空格)的地方开始写函数的功能,取消 4 个空格则表示函数定义结束。
例如一个把任意数字加一后打印的函数看起来可能像这样:
# 定义函数
def plus_one(number):
new_number = number + 1
print(new_number)
# 使用函数
plus_one(5)
# 结果将是
6
Zed 在《笨2》中写到:
函数可以做三样事情:
- 它们给代码片段命名,就像“变量”给字符串和数字明明一样。
- 它们可以接受参数,就跟你的脚本接受
argv
一样。- 通过使用 #1 和 #2,它们可以让你创建“微型脚本”或者“小命令”(好吧,这句话我琢磨了半天,终于想通了“通过使用第一条和第二条它们可以让你创建‘微型脚本’或者‘小命令’”)
加分练习
为自己写一个【函数注意事项】以供后续参考。注意事项如下:
- 函数定义是以
def
开始的么? - 函数名是以字符和下划线
_
组成的么? - 函数名是不是紧跟着括号
(
? - 括号里是否包含参数?多个参数是否以逗号
,
隔开? - 参数名是否有重复?(不能使用重复参数名)
- 紧跟着参数名的是不是括号和冒号
):
? - 紧跟着函数定义的代码是否使用了 4 个空格的缩进?
- 函数结束的位置是否取消了缩进?
当运行一个函数时,记得检查下面几点:
- 调用函数时是否使用了函数名?
- 函数名是否紧跟着
(
? - 括号有无参数?多个参数是否以逗号隔开?
- 函数是否以
)
结尾?
按照这两个表检查你的练习,直到你不需要检查为止。最后,将下面几句话阅读几遍:
“‘运行函数(run)’、‘调用函数(call)’、和‘使用函数(use)’是同一个意思”
我的答案
18.0 基础练习
# 这就和我们的脚本使用 argv 一样
def print_two(*args):
arg1, arg2 = args
print("arg1: %r, arg2: %r" %(arg1, arg2))
# 实际上参数 *args 是没什么意义的,我们实际可以这样写
def print_two_again(arg1, arg2):
print("arg1: %r, arg2: %r" % (arg1, arg2))
# 这个是一个参数的
def print_one(arg1):
print("arg1: %r" % arg1)
# 这个是没有参数的
def print_none():
print("I got nothin'.")
# 下面是调用函数的演示,
# 不去使用函数的话,它们是不会打印任何东西出来的。
print_two("Zed","Shaw")
print_two_again("Zed","Shaw")
print_one("First!")
print_none()
跑一下没出错,接下来是程序肢解节目时间
Zed 以 print_two
为例子拆解了代码:
- 首先我们告诉 python 创建一个函数,我们使用的命令是
def
,也就是“定义(define)”的意思。- 紧接着
def
的是函数名。本例中的名字是print_two
,但名字可以随意取,即便是“peanuts”也没关系。但是最好能够体现函数的功能。- 然后我们告诉函数我们需要
*args
(asterisk args),这和脚本的argv
非常相似,参数必须放在圆括号()
中才能正常工作。- 接着用冒号
:
结束本行,然后开始下一行缩进。- 冒号以下,使用 4 个空格缩进的行都是属于
print_two
这个函数的内容。第一行的作用是将参数解包,这和脚本参数解包的原理差不多。- 为了演示它的原理,我们把解包后的每个参数都打印出来,这和我们在之前脚本练习中所作的类似。
函数 print_two
的问题是:解包在这里其实是没必要的,有更直接简单的方式——在括号里直接把变量写出来。这就是 print_two_again
加分练习
本题的加分练习有点特殊,它本身就是答案,已经比较全面了