函数的返回值
1.什么是返回值
1)返回值的作用:将函数里面的数据传递到函数外面
2)初学者怎么确定需不需要返回值:看实现函数的功能完成后会不会产生新的数据
3)怎么确定函数返回值:函数声明的时候return后面的值就是函数返回值,如果没有return,函数的返回值就是None
a. return : 关键字 ; 只能出现在函数体中
b. 作用:确定函数的返回值;结束函数(执行函数体的时候如果遇到return函数直接结束, 同时把return后面的值作为函数返回值)
4)怎么获取函数返回值:函数调用表达式的值就是函数的返回值
函数调用表达式:函数调用语句;普通数据能做的函数调用表达式都可以
def jy_sum(num1, num2):
return num1 + num2
# =========2.获取函数返回值=========
def func2(num):
return num * 2
a.函数调用表达式可以给变量赋值
# a = 4;print(a)
a = func2(2)
print(a)
# b. b = 4+2 print(4+2)
print(func2(2) + 2)
# c.[4,10];
list1 = [func2(2), 10]
print(list1)
# [].append(100)
def func3():
return []
list2 = func3()
list2.append(100)
print(list2)
2.函数调用过程
1)执行过程:
a.回到函数声明的位置
b.传参 - 保证每个参数都有值
c. 执行函数体
d.执行完函数体确定返回值:看执行完函数体的时候有没有遇到return 如果遇到了
return后面的值就是返回值。没有遇到就是None
e.回到函数调用的位置(这个时候函数调用表达式的值才是函数的返回值)
2)内存变化:函数的调用过程是一个压栈的过程
调用函数的时候系统会自动在栈区间为这个函数开辟一个专用的内存区域
专门用来保存在函数中声明的变量和产生的数据
(形参也是声明在函数中的变量)当函数调用结束的时候,这个内存区域会自动销毁(会将返回值抛出)
def func4(n):
print(n)
return n * 2
a = func4(3) # 3 6
print(a)
变量的作用域
1. 变量的作用域 - 变量可以使用的范围
2. 全局变量和局部变量
1)全局变量
没有声明在函数中或者类中的变量都是全局变量;
全局变量从声明开始到文件结束任何地方都可以使用
2)局部变量
声明在函数中的变量就是局部变量;
从声明开始到函数结束可以使用(形参是声明在函数中的变量)
# a是全局变量
a = 10
# b 也是全局变量
for b in range(4):
c = 100
pass
print("在外部也可以用", b, c)
print("在外部可以用:", a, c)
for x in range(3):
print('循环中是可以使用的', a, c)
def func1():
print('在函数中也可以额!', a, c)
func1()
2)局部变量
print('2==================局部变量=============')
# aa和bb都是局部变量
def func2(aa):
bb = 200
print('函数内部', aa)
def func3():
print(aa, bb)
func3()
func2(100)
3.global和nonlocal
global和nonlocal这两个关键字只能坐在函数体中使用
1)global
使用方法:在函数中给变量赋值前加:global 变量名
作用:在函数中声明全局变量
2)nonlocal
使用方法:在函数中给变量赋值前加:nonlocal 变量名
作用: 在局部的局部中修改局部变量的值
print("3)==============global=====================")
a1 = 100
b1 = 100
def func4():
a1 = 200
global b1 # 声明b1是全局变量
b1 = 200 # 修改全局变量的值,使用的是全局变量的b1
print('函数里面:', a1, b1)
func4()
print("函数外面:", a1, b1)
print("3)==============nonlocal=====================")
def func5():
a2 = 100
def func6():
nonlocal a2 # 必须已经声明过的了
a2 = 200
print("函数的函数中:", a2)
func6()
print('函数中:', a2)
func5()
匿名函数
1.什么是匿名函数 - 没有名字的函数
匿名函数还是函数,普通函数中除了声明的语法之外其他语法基本都适用于匿名函数
1)声明匿名函数
函数名 = lambda 参数列表:返回值
相当于:
def (参数列表):
return 返回值
2)说明:
lambda - 关键字,固定写法
参数列表 - 形参:参数名1,参数名2,参数名3
: - 固定写法
返回值 - 相当于普通函数中return语句
# 用匿名函数实现求两个数的和
func1 = lambda num1, num2: num2 + num1
# 匿名函数的调用和普通函数没有区别
print(func1(num1=10, num2=20))
print(func1(10, 20))
lambda x: print('abc')
func2 = lambda a=1, b=2, c=3: print(a, b, c)
#
# def func2(a,b,c):
# return print(a,b,c)
func2()
func3 = lambda *nums: sum(nums)
print(func3(10, 203, 40))
# 注意:不支持类型说明
# 练习:写一个匿名函数判断指定的年是否是闰年
func_j = lambda a=1999:(a % 4 == 0 and a % 100 != 0) or (a % 400 == 0)
print(func_j(2002))
递归函数
1.什么是递归函数
声明函数的时候调用函数本身,这样的函数就是递归函数(自己调用自己)
递归可以实现循环效果,原则上除了死循环,其他循环递归都可以实现
消耗大量的内存。
def func1():
print('==========')
func1()
2.递归怎么用
使用递归的套路:
a.设置临界值 - 循环结束的条件(保证函数结束)
b.找关系 - 找f(n)和f(n-1)的关系
c.假设函数的功能已经实现,通过f(n-1)去实现f(n)的功能
# 写一个递归函数,计算1+2+3...n
def dg_sum(n):
# 1.找临界值
if n == 1:
return 1
return dg_sum(n - 1) + n
# 2.找关系
"""
f(n) -> 1+2+3...n
f(n-1) ->1+2+3...n-1
f(n)=f(n-1) + n
# 3.用f(n-1)来实现f(n)的功能
print(dg_sum(100))
print(dg_sum(5))
# 写一个递归函数 求斐波拉契数列的第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(6))
# 练习:
"""
n = 4
*
**
***
****
n =3
*
**
***
"""
def star(n):
print('*' * n)
if n == 1:
# print("*")
return 1
return star(n - 1) + 1
print(star(4))
def print_star(n):
if n == 1:
print('*')
return
# 关系:实现f(n-1)的功能后再打印一行n个*
print_star(n - 1)
print(n * "*")
print_star(6)