day10-函数进阶

函数的返回值

1.什么是返回值

  1. 返回值的作用:将函数里面的数据传递到函数外面

  2. 初学者怎么确定需不需要返回值:看函数功能会不会产生新的数据

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

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

# 1.确定确定返回值


def sum1(num1, num2):
    return num1 + num2


# 2.获取函数返回值


def fun2(num):
    return num*2


# a.函数调用表达式可以给变量赋值
a = fun2(2)
print(a)
print(fun2(2)+2)
list1 = [fun2(2), 10]
print(list1)


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)
print(a)

变量的作用域

1.变量的作用域 - 变量可以使用的范围

2.全局变量和局部变量

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

2)局部变量
声明在函数中的变量就是局部变量
从声明开始到函数结束(形参是声明在函数中的变量)

# a是全局变量
a = 10

# b也是全局变量
for b in range(4):
    # c也是全局变量
    c = 100
    pass

print(b)


def fun1():
    print('函数中:', a, b, c)


fun1()
# aa和bb都是局部变量
def func2(aa):
    bb = 200
    print('外函数', aa, bb)

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

    func3()
    # print('外函数',cc) NameError: name 'cc' is not defined


func2(100)
# print(aa)  #NameError: name 'aa' is not defined

3.global和nonlocal

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

1)global
在函数中给变量赋值前加:global 变量名
作用:在函数中声明全局变量
如果外部没有事先声明,可以直接在函数内部用global 变量声明
函数销毁后外部依然可用

2)nonlocal
使用方法:在函数中给变量赋值前加:nonlocal 变量名
作用:在内函数中修改局部变量的值,就如同函数作用域中的global

# 全局变量a1
a1 = 100
b1 = 100


def func4():
    # 声明一个局部变量a1
    a1 = 200

    # 声明b1是全局变量
    global b1
    b1 = 300    # 修改全局变量的值
    # 使用的局部变量a1,使用全局变量b1

    global c1   # 外部没有声明依然可以直接声明
    c1 = 500

    print('函数内', a1, b1, c1)


func4()
# 使用的是全局变量a1
print('函数外', a1, b1, c1)


print('===============nonlocal================')


def func5():
    a2 = 100
    b1 = 100

    def func6():
        a2 = 200
        nonlocal b1
        # nonlocal c1   外函数没有不能直接声明,跟global不一样
        # c1 = 100       只能修改,不能建立
        b1 = 200
        print('函数的函数中:', a2, b1)

    func6()
    print('函数中', a2, b1)


func5()

匿名函数

1.什么是匿名函数 - 没有名字的函数

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

2)说明:
lambda - 关键字,固定写法

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

参数列表 - 形参:参数名1,参数名2,...
:   -   固定写法
返回值 - 相当于普通函数中函数体的return语句
"""

# 用匿名函数实现求两个数的和
func1 = lambda x, y: x + y

# 匿名函数的调用和普通函数没有区别
print(func1(10, 20))
print(func1(x=3, y=5))

func2 = lambda a=1, b=2, c=3: print(a, b, c)

func2()
func2(b=10)

func3 = lambda *nums: sum(nums)
print(func3(10, 20, 30))
print(func3(1, 2, 3, 4))

# 注意:不支持类型说明

# 练习:写一个匿名函数判断指定的年是否是闰年

r_year = lambda x: (x % 4 == 0 and x % 100 != 0) or x % 400 == 0
print(r_year(2002))

递归函数

1.什么是递归函数

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

2.递归怎么用

使用递归的套路:
a.设置临界值 - 循环结束的条件(保证函数结束)
b.找关系 - 找f(n)和f(n-1)的关系
c.假设函数功能已经实现,通过f(n-1)去实现f(n)的功能

# 写一个递归函数,计算1+2+3....n
def sum1(n):
    # 找临界值
    if n == 1:
        return 1

    # 找关系
    """
    f(n) -> 1+2+3.....n-1+n
    f(n-1) -> 1+2+3...n-1
    f(n) = f(n-1) + n
    """

    # 用f(n-1)实现f(n)的功能
    return sum1(n-1) + n


print(sum1(10))


# 写一个递归函数,求斐波那契数列的第n个数
# 1,1,2,3,5,8,13.....

def series(n):
    if n == 1 or n == 2:
        return 1
    return series(n-1)+series(n-2)


print(series(5))


# 练习:
"""
n = 4
*
**
***
****
"""


def f(n):
    if n == 1:
        print('*')
        return
    f(n-1)
    print('*'*n)


f(5)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容