第六章 函数
4.1 函数的定义及调用
4.1.1 为什么要用函数
1、提高代码复用性——抽象出来,封装为函数
2、将复杂的大问题分解成一系列小问题,分而治之——模块化设计的思想
3、利于代码的维护和管理
顺序式
# 5的阶乘
n = 5
res = 1
for i in range(1, n+1):
res *= i
print(res)
# 20的阶乘
n = 20
res = 1
for i in range(1, n+1):
res *= i
print(res)
120
2432902008176640000
抽象成函数
def factoria(n):
res = 1
for i in range(1,n+1):
res *= i
return res
print(factoria(5))
print(factoria(20))
120
2432902008176640000
4.1.2 函数的定义及调用
白箱子:输入——处理——输出
三要素:参数、函数体、返回值
1、定义
def 函数名(参数):
函数体
return 返回值
# 求正方形的面积
def area_of_square(length_of_side):
square_area = pow(length_of_side, 2)
return square_area
2、调用
函数名(参数)
area = area_of_square(5)
area
25
4.1.3 参数传递
0、形参与实参
-
形参(形式参数):函数定义时的参数,实际上就是变量名
-
实参(实际参数):函数调用时的参数,实际上就是变量的值
1、位置参数
-
严格按照位置顺序,用实参对形参进行赋值(关联)
-
一般用在参数比较少的时候
def function(x, y, z):
print(x, y, z)
function(1, 2, 3) # x = 1; y = 2; z = 3
1 2 3
- 实参与形参个数必须一一对应,一个不能多,一个不能少
function(1, 2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-6-2a7da6ff9675> in <module>
----> 1 function(1, 2)
TypeError: function() missing 1 required positional argument: 'z'
function(1, 2, 3, 4)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-748d3d0335e6> in <module>
----> 1 function(1, 2, 3, 4)
TypeError: function() takes 3 positional arguments but 4 were given
2、关键字参数
-
打破位置限制,直呼其名的进行值的传递(形参=实参)
-
必须遵守实参与形参数量上一一对应
-
多用在参数比较多的场合
def function(x, y, z):
print(x, y, z)
function(y=1, z=2, x=3) # x = 1; y = 2; z = 3
3 1 2
-
位置参数可以与关键字参数混合使用
-
但是,位置参数必须放在关键字参数前面
function(1, z=2, y=3)
1 3 2
function(1, 2, z=3)
1 2 3
- 不能为同一个形参重复传值
def function(x, y, z):
print(x, y, z)
function(1, z=2, x=3)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-f385272db011> in <module>
3
4
----> 5 function(1, z=2, x=3)
TypeError: function() got multiple values for argument 'x'
3、默认参数
-
在定义阶段就给形参赋值——该形参的常用值
-
默认参数必须放在非默认参数后面
-
调用函数时,可以不对该形参传值
-
机器学习库中类的方法里非常常见
def register(name, age, sex="male"):
print(name, age, sex)
register("大杰仔", 18)
大杰仔 18 male
- 也可以按正常的形参进行传值
register("林志玲", 38, "female")
林志玲 38 female
- 默认参数应该设置为不可变类型(数字、字符串、元组)
def function(ls=[]):
print(id(ls))
ls.append(1)
print(id(ls))
print(ls)
function()
1759752744328
1759752744328
[1]