1.什么是返回值
1)返回值的作用:讲函数里面的数据传递到函数外面
2)初学者怎么确定需不需要返回值,看函数的功能完成后会不会产生新的数据
3)怎么去确定函数返回值:声明函数的时候return后面的值就是函数的返回值;如果没有return,函数返回值就None
a.return:关键字;只能出现在函数体中
作用:确定函数的返回值;结束函数(执行函数体的时候,如果遇到return函数直接结束,同时将return后面的值作为函数返回值)
4)怎么获取函数的返回值:函数调用表达式的值就是函数的返回值(获取函数调用表达式的值)
函数调用表达式就是函数调用语句;普通数据能做的事情函数调用表达式都可以做
确定函数返回
def ld_sum(num1, num2):
return num1 + num2
def func1():
print("===")
print("====")
return # return None
print("+++++")
func1()
2.获取函数返回值
def func2(num):
# num = 2
# return 4
return num * 2
# a.函数调用表达式可以给变量赋值
# a = 4;print(a)
a = func2(2)
print(a)
# c.[4,12];a =4,[a,10]
list1 = [func2(2), 10]
print(list1)
def func3():
return []
# [].append(100)
list2 = func3()
list2.append(100)
print(list2)
2.函数的调用过程
1)执行过程
a.回到函数声明的位置
b.传参 - 保证每个参数都有值
c.执行函数体
d.执行完函数体确定返回值:看执行完函数体的时候有没有遇到return,如果遇到了return后面的值就是返回值:没有遇到就是None
e.回到函数调用的位置(这个时候函数调用表达式的值才是函数的返回值)
2)内存变化:函数的调用过程是一个压栈过程
调用函数的时候系统会自动在栈区间为这个函数开辟一个专用的内存区域,专门来保存在这个函数中声明的变量和产生的数据(形参也是声明在函数的变量);当函数调用结束的识货,这个内存区域会自动销毁(销毁前会将返回值扔出来)
def func4(n):
# n = 3
print(n)
return n * 2 # return 6
a = func4(3) # a = 6
print(a)
变量的作用域 - 变量可以使用的范围
全局变量和局部变量
1)全局变量
没有声明在函数中类或者类中的变量都是全局变量
全局变量从声明开始到文件结束的任何地方都可以使用
2)局部变量
声明在行数中的变量就是局部变量
从声明开始到函数结束(形参是声明在函数中的变量)
全局变量
# a是全局变量
a = 10
print("在外部", a)
# b是全局变量
for b in range(4):
pass
for x in range(3):
print("循环中:", a)
def func1():
print("在函数里面", a, b)
局部变量
# aa和bb是局部变量
def func2(aa):
bb = 200
print("函数内部", aa)
def func3():
cc = 300
print("函数中函数", aa, bb)
func3()
func2(100)
# print("函数外部",aa) NameError: name 'aa' is not defined
# 3.global和nonlocal
"""
global和nonlocal这两个关键字只能在函数体中使用
1)global
使用方法:在函数中给变量赋值前加: global 变量名
作用:在函数中声明全局变量
2)nonlocal
使用方法:在函数中给变量名赋值前加;nonlocal 变量名
作用:在局部的局部中修改局部变量的值
"""
# 全局变量a1
a1 = 100
b1 = 100
def func4():
# 声明一个局部变量a1
a1 = 200
# 声明b1是全局变量
global b1
# 修改全局变量的值
b1 = 200
# 使用的是局部变量a1,b1
print("函数中", a1, b1)
func4()
# 使用的是全局变量a1
print(a1, b1)
print('4)======================nonlocal的使用=====================')
def func5():
a2 = 100
def func6():
nonlocal a2
a2 = 200
# 这儿的a3必须上层函数中已经声明过才行
# nonlocal a3
# a3 = 400
print('函数的函数中:', a2)
return a2
func6()
print('函数中:', a2)
# print('a3') # SyntaxError: no binding for nonlocal 'a3' found
func5()
什么是匿名函数
"""
匿名函数还是一个函数,普通函数中除了声明的语法以外其他语法基本都适用于匿名函数
1)声明匿名函数
函数名 = lambda 参数列表:返回值
相当于:
def 函数名(参数列表):
return 返回值
2)说明:
lambda - 关键字,固定写法
参数列表 -形参:参数名1,参数名 2,参数名3,……
: - 固定写法
返回值 -相当于普通函数体中 的return语句
"""
# 匿名函数的调用和普通函数的调用没有区别
# 用匿名函数实现求两个数的和
func1 = lambda num1, num2: num1 + num2
print(func1(10, 20))
# 练习:写一个匿名函数判断指定的年是否是润年
func2 = lambda year: (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
print(func2(2000))
什么是递归函数
"""
声明函数的时候调用函数本身,这样的函数就是递归函数(自己调用自己)
递归可以实现循环效果,原则上除了死循环,其它循环递归都可以解决
"""
# RecursionError: maximum recursion depth exceeded while calling a Python object
# def func1():
# print("==============")
# func1()
#
#
# func1()
# 2.递归怎么用
"""
使用递归的套路:
a.设置临界值 - 循环结束的条件(保证函数结束)
b.找关系 - 找f(n)和f(n-1)的关系
c.假设函数的功能已经实现,通过f(n-1)去实现f(n)的功能
"""
# 写一个递归函数,计算1+2+3+4+……+N
def ld_sum(n):
# 1.找临界值
if n == 1:
return 1
# 2.找关系
"""
f(n) -> 1+2+3......+n-1+n
f(n - 1) -> 1+2+3...+n -1
f(n) =f(n-1) + n
"""
# 3.用f(n-1)实现f(n)的功能
return ld_sum(n - 1) + n
print(ld_sum(100))
# 写一个递归函数,求斐波那契数列的第n个数
# 1,1,2,3,5,8.13.21.……
def series(n):
# 1.找临界值
if n == 1 or n == 2:
return 1
# 2.关系:f(n)=f(n-1)+ f(n-2)
return series(n - 1) + series(n - 2)
print(series(9))
# 练习:
"""
n = 4
*
**
***
****
n = 3
*
**
***
"""
def x(n):
if n == 1:
print("*")
return
x(n-1)
print(n*"*")
x(5)
网友评论