醉后不知天在水,
满船清梦压星河。
——唐温如《题龙阳县青草湖》
好久不见
本期文章4300字
根据之前文章的后台统计数据推算
本期预计所需阅读时间25分钟
代码复用(代码的重复使用)
代码复用是使用任何编程语言进行编程的一个非常重要的部分。程序的代码量越大,程序越难以维护,所以我们在编写的过程中,要在保证功能可以实现的前提下,尽可能减少代码量。
要使大型编程项目取得成功,必须遵守“不要自身重复”(Don't Repeat Yourself, DRY)原则。
说个题外话,有的时候我们把那些含有很多冗余、重复内容的代码叫做遵守“WET”原则(与DRY相对)。有部分资料说,WET还可以代表Write Everything Twice,或者We Enjoy Typing。(外国人的脑洞真的是…)
在之前,我们已经见过减少代码量的一种方法:使用循环。在接下来的几篇文章中,我们将探讨另外两种减少代码量的方法:函数和模块。
函数(Functions)
实际上,我们已经在以前的文章中使用过函数了。
任何由一串字符(称作函数名)和后跟括号以及括号里内容组成的语句,都是函数被调用时的形式。
以下是我们已经见过的一些函数调用示例:
print("Hello world!")
range(2, 20)
str(12)
range(10, 20, 3)
括号前面的一串字符是函数名,括号内的由逗号分隔的值(如果只有一个值的话不需要用逗号)是函数的参数。
测试题6.1.
下面这个函数的调用过程,有几个参数?
range(0, 100, 5)
点击下方空白区域查看答案
▼
3个
一目了然,括号里面有几个算几个。
当然,每个函数都有自己的函数名,且互不重复。另外,每个函数都是为了实现某一种功能,不同的函数实现不同的功能,而且每个函数都有固定的参数数量以及每个参数固定的含义和对参数值类型的限制。比如,print函数的作用是输出一些内容,最少有一个参数,这个参数的作用是指定要输出的内容。
自定义函数
像print这样的可以直接使用的函数,我们叫它预定义函数(pre-defined functions),他们是由Python语言自带的、用来实现一些基础功能的函数。除了使用预定义函数外,我们还可以使用def语句来创建我们自己的函数。
以下是一个名为my_func的函数示例。它不需要任何参数,功能是输出三次“spam”。自定义函数必须先被定义,然后才能被调用。函数中的语句仅在调用这个函数时才被执行。
defmy_func():
print("spam")
print("spam")
print("spam")
my_func()
运行结果:
>>>
spam
spam
spam
>>>
可以注意到,在用def语句定义函数的时候,函数名后面有个括号,用来表示需要的参数。之后有一个冒号(:),并且后面函数内部的代码每行行首有缩进。这与之前用到循环时的写法类似。
正如前文所述,我们必须在调用函数之前定义它们,就像在使用变量之前必须先定义用到的变量一样。
hello()
defhello():
print("Hello world!")
运行结果:
>>>
NameError: name 'hello' is not defined
>>>
(错误是在源代码的第一行产生的。产生错误时,def语句还未被执行。)
测试题6.2.
下面是三行顺序错乱的代码。重新排列这三行代码的顺序,以声明函数sayHi()并调用它。
sayHi()
def sayHi():
print("Hi!")
点击下方空白区域查看答案
▼
def sayHi():
print("Hi!")
sayHi()
参数
刚才看到的几个函数都是没有参数的函数,这些函数在调用的时候,写的是空括号(也就是放参数的括号里一个参数也没有)。
但是,大多数函数都需要参数。
下面的示例定义了带有一个参数的函数:
defprint_with_exclamation(word):
print(word + "!")
print_with_exclamation("spam")
print_with_exclamation("eggs")
print_with_exclamation("python")
运行结果:
>>>
spam!
eggs!
python!
>>>
如我们所见,定义函数时,函数的参数在括号内定义。
测试题6.3.
代码的输出结果是?
def print_double(x):
print(2 * x)
print_double(3)
领取专属 10元无门槛券
私享最新 技术干货