在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增加了函数调用、传递参数、返回计算结果等内容。
函数简介函数(function)的基本概念
1:一个程序由一个一个的任务组成;函数就是代表一个任务或者一个功能(function)。
2:函数是代码复用的通用机制
Python函数的分类
Python函数分为如下几类:
1 内置函数我们前面使用的str()、list()、len()等这些都是内置函数,我们可以拿来直接使用。
2 标准库函数我们可以通过import语句导入库,然后使用其中定义的函数
3 第三方库函数Python社区也提供了很多高质量的库。下载安装这些库后,也是通过import语句导入,然后可以使用这些第三方库的函数
4 用户自定义函数用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数。今天我们学习的就是如何自定义函数。
函数的定义和调用
简单定义一个函数:
def add(a,b,c):
'''完成三个数的加法,并返回他们的和'''
sum = a+b+c
print("{0}、{1}、{2}三个数的和是:{3}".format(a,b,c,sum))
return sum
add(10,20,30)
add(30,40,50)
要点:1:我们使用def来定义函数,然后就是一个空格和函数名称;Python执行def时,会创建一个函数对象,并绑定到函数名变量上。
2:参数列表圆括号内是形式参数列表,有多个参数则使用逗号隔开定义时的形式参数不需要声明类型,也不需要指定函数返回值类型调用时的实际参数必须与形参列表一一对应。
3:return返回值如果函数体中包含return语句,则结束函数执行并返回值;如果函数体中不包含return语句,则返回None值。
4:调用函数之前,必须要先定义函数,即先调用def创建函数对象内置函数对象会自动创建标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句。
形参和实参:
def printMax(a,b):
'''实现两个数的比较,并返回较大的值'''
if a>b:
print(a,'较大值')
return a
else:
print(b,'较大值')
return b
printMax(10,20)
printMax(30,5)
上面的printMax函数中,在定义时写的printMax(a,b)。a和b称为“形式参数”,简称“形参”。也就是说,形式参数是在定义函数时使用的。形式参数的命名要符合“标识符”命名规则。在调用函数时,传递的参数称为“实际参数”,简称“实参”。上面代码中,printMax(10,20),10和20就是实际参数。
函数也是对象,内存底层分析
Python中,“一切都是对象”。实际上,执行def定义函数后,系统就创建了相应的函数对象。我们执行如下程序,然后进行解释:
def print_star(n):
print("*"*n)
print(print_star)
print(id(print_star))
c = print_star
c(3)
a = 100 #全局变量
def f1():
global a #如果要在函数内改变全局变量的值,增加global关键字声明
print(a) #打印全局变量a的值
a = 300
f1()
f1()
print(a)
参数的传递
传递可变对象的引用传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。
【操作】参数传递:传递可变对象的引用:
b = [10,20]
def f2(m):
print("m:",id(m)) #b和m是同一个对象
m.append(30) #由于m是可变对象,不创建对象拷贝,直接修改这个对象
f2(b)
print("b:",id(b))
print(b)
为了更深入的了解参数传递的底层原理,我们需要讲解一下“浅拷贝和深拷贝”。我们可以使用内置函数:copy(浅拷贝)、deepcopy(深拷贝)。
1:浅拷贝:拷贝对象,但不拷贝子对象的内容,只是拷贝子对象的引用。
2:深拷贝:拷贝对象,并且会连子对象的内存也全部(递归)拷贝一份,对子对象的修改不会影响源对象
#测试浅拷贝和深拷贝
import copy
def testCopy():
'''测试浅拷贝'''
a = [10, 20, [5, 6]]
b = copy.copy(a)
print("a", a)
print("b", b)
b.append(30)
b[2]
.append(7)
print("浅拷贝......")
print("a", a)
print("b", b)
b.append(30)
b[2].append(7)
print("深拷贝......")
print("a", a)
print("b", b)
testCopy()
print("*************")
testDeepCopy()
f = lambda a,b,c:a+b+c
print(f)
print(f(2,3,4))
g = [lambda a:a*2,lambda b:b*3,lambda c:c*4]
print(g[0](6),g[1](7),g[2](8))