第九天:函数进阶1

函数进阶

1.返回值

1.1什么是返回值

1)返回值的作用: 将函数里面的数据传递到函数外面
2)初学怎么确定需不需要返回子: 看函数的功能完成后会不会产生新的数据

3)怎么确定函数返回值: 函数声明的时候return后面的值就是函数的返回值;如果没有return,函数的返回值就是None
a. return:  关键字;只能出现在函数体中
            作用: 确定函数的返回值; 结束函数(执行函数体的时候如果遇到return函数直接结束,同时将return后面的值作为函数返回值)

4)怎么获取函数返回值: 函数调用表达式的值就是函数的返回值(获取函数调用表达式的值)
                    函数调用表达式: 函数调用语句; 普通数据能做的事情函数调用表达式都可以

1.2.函数的调用过程

1)执行过程:
a.回到函数声明的位置
b.传参 - 保证每个参数都值
c.执行函数体
d.执行完函数体确定返回值:  看执行完函数体的时候有没有遇到return,如果遇到了return后面的值就是返回值;没有遇到就是None
e.回到函数调用的位置(这个时候函数调用表达式的值才是函数的返回值)

2)内存变化: 函数的调用过程是一个压栈的过程
调用函数的时候系统会自动在栈区间为这个函数开辟一个专用的内存区域,专门用来保存在这个函数中声明的变量和产生的数据
(形参也是声明在函数的变量);当函数调用结束的时候,这个内存区域会自动销毁(销毁前会将返回值扔出来)

2.变量的作用域

2.1全局变量和局部变量

1)全局变量
没有声明在函数中或者类中的变量都是全局变量;
全局变量从声明开始到文件结束任何地方都可以使用

2)局部变量
声明在函数中的变量就是局部变量;
从声明开始到函数结束可以使用(形参是声明在函数中的变量)
# a是全局变量
a = 10
# b是全局变量
for b in range(4):
    # c是全局变量
    c = 100
    pass


print('在外部:', a, c)
print('外部b:', b)
# aa和bb都是局部变量
def func2(aa):
    bb = 200
    print('函数内部:', aa, bb)

    def func3():
        cc = 300
        print('函数中函数:', aa, bb)
    func3()

2.2 global和nonlocal

global和nonlocal这两个关键字只能在函数体中使用

1)global
使用方法: 在函数中给变量赋值前加: global 变量名
作用: 在函数中声明全局变量

2)nonlocal
使用方法: 在函数中给变量赋值前加: nonlocal 变量名
作用: 在局部的局部中修改局部变量的值
def func4():

    global c1
    # 声明一个局部变量a1
    a1 = 200

    # 声明b1是全局变量
    global b1
    b1 = 200   # 修改全局变量的值

    c1 = 300

    # global d1 = 200   # 错误!

    # 使用的局部变量a1; 使用的是全局变量b1
    print('函数中:', a1, b1)
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

3.匿名函数

3.1什么是匿名函数

匿名函数还是函数,普通函数中除了声明的语法以外其他语法基本都适用于匿名函数
1)声明匿名函数
函数名 = lambda 参数列表:返回值

相当于:
def 函数名(参数列表):
    return 返回值

2)说明:
lambda - 关键字,固定写法
参数列表 - 形参: 参数名1,参数名2,...
:      -  固定写法
返回值  -  相当于普通函数中函数体中的return语句

注意:不支持类型说明

func4 = lambda a: int, b: a*b 错误!

4.递归函数

4.1什么是递归函数

声明函数的时候调用函数本身, 这样的函数就是递归函数(自己调用自己)
递归可以实现循环效果, 原则上除了死循环,其他的循环递归都可以实现

4.2.递归怎么用

使用递归的套路:
a.设置临界值 - 循环结束的条件(保证函数结束)
b.找关系 - 找f(n)和f(n-1)的关系
c.假设函数的功能已经实现,通过f(n-1)去实现f(n)的功能
# 写一个递归函数,计算1+2+3+...n
def yt_sum(n):
    # 1.找临界值
    if n == 1:      #当n=1时,函数的结果就为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 yt_sum(n-1)+n

你可能感兴趣的:(第九天:函数进阶1)