第一章 1.10 函数进阶
一.函数返回值
- 1.返回值的作用:将函数里面的数据传到函数外(在函数里的打印只能看不能操作)
- 2.怎么确定需不需要返回值:看函数的功能完成后会不会产生新的数据
- 3.怎么确定函数的返回值:函数声明的时候return后面的值就是函数的返回值;如果没有return,函数的返回值就是None
return是关键字;只能出现在函数体中
作用:①.确定函数的返回值
②.结束函数(执行函数体的时候若遇到return函数直接结束,同时将return后面的值作为函数的额返回值)
- 4.怎么获取函数的返回值:函数调用表达式就是函数的返回值
函数调用表达式:函数调用语句(普通数据能做的事,它都能做)
二.函数的调用
1.函数调用过程:
①.回到函数声明的位置
②.传参 - 保证每个参数都有值
③.执行函数体
④.执行完函数体确认返回值:若遇到return,return后面的值就是返回值;若没有遇到,返回值就是None
⑤.回到函数调用的位置(函数表达式的值就是返回值)
2.内存的变化:
函数的调用过程事一个压栈的过程(系统会自动在栈区间开辟一个专用的内存区域,专门用来保存在函数内声明的变量和产生的数据(形参也是函数内的)) 当函数调用结束的时候,这个内存区域会自动销毁(销毁前会将返回值送出)
三.变量的作用域
1).全局变量
没有生命在函数中或者类中的变量都是全局变量
作用域:全局变量从声明开始到文件结束任何地方都可以用
2).局部变量
在函数内声明的变量就是局部变量;
作用域:从声明开始到函数结束可以使用(形参是声明在函数中的局部变量)
#a是全局变量
a = 10
# 循环内声明的变量也是全局变量(b和c)
for b in range(5):
c = 100
pass
# 在循环内部可以用
for x in range(3):
print(a)
# 在函数中可以用
def func1():
print('函数中:', a)
1.global
若要在函数内改变全局变量的值,要先用global进行说明在函数中若要声明一个全局变量,也要在变量前加global
语法:global 变量名
2.nonlocal
使用方法:在函数中给变量赋值前加:nonlocal 变量名
作用:在局部的局部中修改局部变量的值
四.匿名函数
匿名函数还是函数,除了声明的语法和类型说明以外,其他语法基本都适用匿名函数
1).声明匿名函数
变量(函数名) = lambda 参数列表:返回值
def (参数列表):
return 返回值
2).说明:
lambda - 关键字,固定写法
参数列表 - 形参:参数名1,参数名2,...
:(冒号) - 固定写法
返回值 - 相当于普通函数中函数体中的return语句
# 用匿名函数求两个数的和
func1 = lambda num1, num2: num1 + num2
# 练习:写一个函数判断指定的年是否是闰年
diy_year = lambda year: year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)
print(diy_year(2008))
五.递归函数
1.什么是递归函数
声明函数的时候调用函数本身
递归可以实现循环效果,除了死循环,其他的循环递归都可以实现
2.递归怎么用
使用递归的方法:
1).设置临界值 - 循环结束的条件(保证函数结束)
2).找关系 - 找f(n)和f(n-1)的关系(上一次循环和下一次循环的关系)
3).假设函数的功能已经实现,通过f(n-1)去实现f(n)的功能
# 写一个递归函数,计算1+2+3+...+n
def diy_sum(n):
if n == 1:
return 1
return diy_sum(n-1) + n
print(diy_sum(10))
# 写一个递归函数,计算斐波那契额数列的第n个数
def diy_series(n):
if n == 1 or n == 2:
return 1
return diy_series(n-1) + diy_series(n-2)
print(diy_series(5))
# 练习:
'''
n = 4
*
**
***
****
n = 3
*
**
***
'''
def diy_p(n):
if n == 1:
print('*')
return
diy_p(n-1)
print(n * '*')