函数的调用:
a. 先回到函数调用的位置
b. 用实参给形参赋值(传参)
c. 执行函数体
d. 执行完函数体,将返回值返回给函数调用表达式
e. 回到函数调用的位置
2.return关键字
a.将return后面的值,返回给函数表达式 可以有多个返回值 返回值组成一个元组
b.结束函数
3.函数调用表达式
python中的每个函数调用表达式都是有值的
3.函数的结束:
a.函数体执行完
b.遇到return
global和nonlocal
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
def glb_demo():
global var # 需要使用 global 关键字声明
var = 10
要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字
4.匿名函数
匿名函数:本质函数函数,以另一种简单的方式来声明
lambda 参数列表: 返回值 --> 结果是一个函数变量
5.递归函数
递归函数:在函数体中调用函数本身
理论上循环能做的事情,递归都可以
怎么写一个递归函数:
a.找临界值(跳出循环 -> return)
b.找关系:假设当前函数对应的功能已经实现,找到f(n)和f(n-1)的关系
c.使用f(n-1)与前面找到的关系去实现f(n)的功能
对递归的要求:能不用就不用
函数调用的过程是一个压栈的过程(每调用一次函数,系统都为其分配内存空间,
用来存储函数中声明的变量和参数等,这个内存会在函数调用结束后自动销毁)
# 写一个递归函数:1+2+3+...+N
# 循环:
def my_sum1(n):
sum1 = 0
for i in range(n+1):
sum1 += i
return sum1
# 递归
def my_sum2(n):
# 1.找到临界值
if n == 1:
return 1
# 2.找到my_sum2(n)和my_sum2(n-1)的关系
"""
my_sum2(n):1+2+3+...+(n-1)+n
my_sum2(n-1):1+2+3+...+(n-1)
"""
# 3.使用my_sum2(n-1)去实现my_sum2(n)的功能
return my_sum2(n-1) + n
print(my_sum1(5))
print(my_sum2(5))
Output:
15
15
# # 使用递归实现
# n = 4
# ****
# ***
# **
# *
# n = 3
# ***
# **
# *
# 关系:先打印n个*,再打印f(n-1)
def print_shape(n):
char = '*'
if n == 1:
print(char*n)
return None
print(char*n)
print_shape(n-1)
print_shape(4)
def print_shape_reverse(n):
char = '*'
if n == 1:
print(char*n)
return None
print_shape_reverse(n-1)
print(char*n)
print_shape_reverse(4)