代码复用(代码的重复使用)
代码复用是使用任何编程语言进行编程的一个非常重要的部分。 程序的代码量越大,程序越难以维护,所以我们在编写的过程中,要在保证功能可以实现的前提下,尽可能减少代码量。
函数(Functions)
任何由一串字符(称作函数名)和后跟括号以及括号里内容组成的语句,都是函数被调用时的形式。
print("Hello world!")
range(2, 20)
str(12)
range(10, 20, 3)
括号前面的一串字符是**函数名**,括号内的由逗号分隔的值(如果只有一个值的话不需要用逗号)是函数的**参数**。
自定义函数
像print这样的可以直接使用的函数,我们叫它预定义函数(pre-defined functions),他们是由Python语言自带的、用来实现一些基础功能的函数。除了使用预定义函数外,我们还可以使用def语句来创建我们自己的函数。
自定义函数**必须先被定义,然后才能被调用**。 函数中的语句仅在调用这个函数时才被执行。
def my_func():
print("spam")
print("spam")
print("spam")
my_func()
在用def语句定义函数的时候,函数名后面有个括号,用来表示需要的参数。之后有一个冒号(:),并且后面函数内部的代码每行行首有缩进。这与之前用到循环时的写法类似。
参数
刚才看到的几个函数都是没有参数的函数,这些函数在调用的时候,写的是空括号(也就是放参数的括号里一个参数也没有)。
但是,大多数函数都需要参数。
下面的示例定义了带有一个参数的函数:
def print_double(x):
print(2 * x)
print_double(3)
def print_sum_twice(x, y):
print(x + y)
print(x + y)
print_sum_twice(5, 8)
函数的参数作为一个变量的值(如上面这个例子里的x变量和y变量),可以在函数内部调用。 但是,它们不能在函数之外调用。 这个规则也适用于函数的附属代码块中(也就是函数内部)创建的其他变量。来看例子:(最后一行在运行的时候会出错)
def function(variable):
variable += 1
print(variable)
function(7)
print(variable)
8
NameError: name 'variable' is not defined
···
def even(x):
if x % 2 == 0:
print("YES")
else:
print("NO")
## 函数的返回值
某些函数(如int()或str(),之前说过的用来转换值类型的那几个函数)返回一个可以在之后继续使用的值。
如果需要自定义的函数也有返回值,可以使用**return语句**。
def max(x, y):
if x >=y:
return x #return不带括号
else:
return y
print(max(4, 7))
···
def add_numbers(x, y):
total = x + y
return total
print("This won't be printed")
print(add_numbers(4, 5))
9
return之后代码不会被执行,必须跳出代码块。
关于return和返回值的补充解释
函数有两种:有返回值的,没有返回值的。
有返回值的函数,可以直接理解为它会把写函数时定义的return的内容替换到调用此函数的位置。(后面会解释这句话)
没有返回值的函数主要是为了完成某种任务(其实这是废话,函数的功能就是为了完成某种任务)。这种函数完成任务后,函数执行期间的所有数据一律不再需要使用,这时候就不需要给这个函数定义return语句,也就是不需要返回任何值。
#没有返回值
def function(a, b):
answer = a + b
print(answer)
#有返回值
def function(a, b):
answer = a + b
return answer
print ("line 1:")
function(2, 9)
print ("line 2:")
print(function(2, 9))
#上面这个函数是有返回值的。在函数内部并没有进行任何输出
line 1:
line 2:
11
print(function(2, 9))
print(11)
这两行代码的作用基本相同,这也就是上文说到的,有返回值的函数会把return的内容替换到调用此函数的位置。
同理可以举例,如果函数的定义与上面这个例子中的函数定义相同,那么:
function(2, 9) * 5
11 * 5
即使函数内部执行的是加法,最后输出的结果也不是2 + 9 * 5 == 47,而是(2 + 9) * 5 == 55。这也证明了返回值是**直接替换**到调用位置的。
网友评论