11 - 函数
1 . 函数的概念
如果在开发程序时,某块代码需要多次调用或者复用性高,为了提高编写的效率以及代码的重用,把具有独立功能的代码块组织为一个小模块,这就是函数
2 . 函数的定义和调用
- 定义函数的格式:
//使用def定义函数
def 函数名():
代码
demo:
def print_triangle():
print("*")
print("*"*2)
print("*"*3)
print("*"*4)
- 函数的调用格式:
函数名()
demo:
//定义完函数后,函数是不会自动执行的,需要手动调用
print_triangle()
3 . 函数的类型
3.1 无参数,无返回值
使用场景:打印提示类似的功能
def test():
print("====")
test() #调用之后便会打印====
3.2 无参数,有返回值的函数
使用场景:保存数据
def getsum():
return 100
temp = getsum()
print("当前数值为:%d"%(temp)) #当前数值为:100
3.3有参数,无返回值
使用场景:以需求为主
//定义带有参数的函数
def test(a,b):
print("%d"%(a + b))
#调用带有参数的函数(调用时,需要在小括号中,传递数据)
test(11,123) #134
gif显示.gif
3.4 有参数,有返回值
使用场景:像数据处理并需要结果的应用
** 就是程序中函数完成一件事情后,最后给调用者的结果**
demo1:
#定义函数
def sum(a,b):
return a + b
#调用函数,顺便保存函数的返回值,再打印
print("sum = %d"%(sum(11,11))) #sum = 22
demo2:求和以及求平均值
def sumNum(num):
result = 0
i = 1
while i<= num:
result = result + i
i+=1
return result
r = sumNum(100)
print("1-50的和为:%d"%(r)) #1-50的和为:5050
def sum3Num(a,b,c):
return a +b + c
def aveeage3Num(a,b,c):
sumResult = sum3Num(a,b,c)
result = sumResult /3
return result
r = aveeage3Num(11,12,13)
print("三个数的平均值:%d"%(r)) #三个数的平均值:12
函数的嵌套使用(打印5行-----)
- 笨方式demo
def print_line():
print("-"*5)
def print_5_line():
print("-" * 5)
print("-" * 5)
print("-" * 5)
print("-" * 5)
print("-" * 5)
print_5_line()
- 优雅方式
def print_line():
print("-"*5)
def print_5_line():
i= 0
while i < 5:
print_line()
i += 1
print_5_line()
** 小总结 **
- 定义时小括号中的参数,用来接收参数用的,称为 “形参”
- 调用时小括号中的参数,用来传递给函数用的,称为 “实参”
4. 局部变量与全局变量
4.1 局部变量
- 局部变量:定义在函数内部的变量
- 部变量的作用:临时保存数据需要在函数中定义变量来进行存储
- 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
4.2 全局变量
-
在函数外边定义的变量
-
全局变量能够在所有的函数中进行访问
-
如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
-
如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇
-
在函数中不使用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。
-
对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。
-
对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量。
demo
aa = 10
def test1():
print(aa)
def test2():
print(aa)
test1()
test2()
运行结果:
10
10
** 修改全局变量**
aa = 10
def test1():
aa = 100
print('test1修改前:aa = %d'%(aa))
global aa
aa = 111
print('test1修改后:aa = %d' % (aa))
def test2():
print('test2:aa = %d' % (aa))
test1()
test2()
打印结果:
Snip20170617_2.png5. 递归函数
5.1 什么是递归函数
如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
- 计算阶乘n! = 1 * 2 * 3 * ... * n
方式一(使用while方式):
def sumNumber(num):
i = 1
result = 1
while i<= num:
result *=i
i+=1
return result
result = sumNumber(4)
print(result)
阶乘的规律
1! = 1
2! = 2 × 1 = 2 × 1!
3! = 3 × 2 × 1 = 3 × 2!
4! = 4 × 3 × 2 × 1 = 4 × 3!
...
n! = n × (n-1)!
方式二(使用递归方式):
def sumNumber1(num):
if num >1:
result = num * sumNumber1(num -1)
else:
result = 1
return result
result1 = sumNumber1(4)
print(result1) #24
6. 匿名函数
6.1 什么是匿名函数
-
用
lambda
关键词能创建小型匿名函数,这种函数省略了用def声明函数的标准步骤 -
lambda
函数能接收任何数量的参数但只能返回一个表达式的值 -
匿名函数不能直接调用print,因为
lambda
需要一个表达式
6.2语法
lambda [arg1 [,arg2,.....argn]]:expression
6.3 demo
#函数作为参数传递
def fun(a,b,c):
print("a= %d"%a)
print("a= %d" %b)
print("result = %d"%c(a,b))
f = fun(5,2,lambda x,y:x+y)
#作为内置函数的参数
student = [
{"name":"zhangsan", "age":18},
{"name":"lisi", "age":19},
{"name":"wangwu", "age":17}
]
# 按name排序:
student.sort(key = lambda x:x['name'])
print(student)
# 按age排序:
student.sort(key = lambda x:x['age'])
print(student)
打印结果:
Snip20170617_5.png
7. 函数使用注意事项
7.1 自定义函数
- 无参数、无返回值
def 函数名():
语句
- 无参数、有返回值
def 函数名():
语句
return 需要返回的数值
注意:
一个函数到底有没有返回值,就看有没有return,因为只有return才可以返回数据。
在开发中往往根据需求来设计函数需不需要返回值。
函数中,可以有多个return语句,但是只要执行到一个return语句,那么就意味着这个函数的调用完成。
- 有参数、无返回值
def 函数名(形参列表):
语句
注意:
在调用函数时,如果需要把一些数据一起传递过去,被调用函数就需要用参数来接收
参数列表中变量的个数根据实际传递的数据的多少来确定
- 有参数、有返回值
def 函数名(形参列表):
语句
return 需要返回的数值
7.2 调用函数
- 格式
函数名(实参)
- 调用时,到底写不写 实参
- 如果在定义时有形参,那么在调用的时候就应该传递参数
- 调用时,实参的个数和先后顺序应该和定义函数中要求的一致
- 如果调用的函数有返回值,那么就可以用一个变量来进行保存这个值
7.3 作用域
- 局部变量:在一个函数中定义的变量,只能在本函数中用
- 全局变量:在函数外定义的变量,可以在所有的函数中使用