函数进阶1

1.函数返回值

1.什么是返回值

1)返回值的作用:将函数里面的数据传递到函数外面
2)初学者怎么去掉需不需要返回值:看函数的功能完成后会不会产生新的数据
3)怎么确定函数返回值:函数声明的时候return后面的值就是函数的返回值;如果没有return,函数的返回值就是None

  • return: 关键字;只能出现在函数体中
    作用:确定函数的返回值;结束函数(执行函数体的时候如果遇到return函数直接结束,同时将return后面的值作为函数返回值)

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

== =================1.确定函数返回=================

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

==================2.获取函数返回值=================

def fun2(num):
    return num * 2


a = fun2(2)
print(a)
2.函数的调用过程

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

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

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

1.全局变量和局部变量

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

2)局部变量
声明在函数中的变量就是局部变量

1)===========全局变量=============

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

2.global和nonloacl

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

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

2)nonlocal
在函数中给变量赋值前加:nonlocal 变量名
作用;在局部的局部中修改局部变量的值

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

def fun4():
    # 声明一个局部变量a1
    a1 = 200
    # 声明b1是全局变量
    global b1
    b1 = 200
    # 使用局部变量a1;使用的是全局变量b1
    print('函数中', a1, b1)

fun4()
# 使用全局变量a1;使用的是全局变量b1
print('函数外部', a1, b1)
print('=====================================')

def func5():
    a2 = 100

    def func6():
        print('函数的函数中:', a2)

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

3.匿名函数

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

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

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

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


# 用匿名函数实现求两个数的和
func1 = lambda num1, num2: num1 + num2
# 匿名函数的调用和普通函数没有任何区别
func1(19, 20)
# 注意:不支持类型说明
# func4 = lambda a:int, b:a*b

# 练习:写一个匿名函数判断指定的奶是否是闰年
a = lambda  year:((year % 4 == 0 and year % 100 != 0) or year % 400 ==0)

print(a(1850))

4.递归函数

1.什么是递归函数

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

def func1():
    func1()
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:
        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

print(yt_sum(100))
# 练习
"""
*
**
***
****
"""
def f(n):
    if n == 1:
        print('*')
        return
    # 实现f(n-1)的功能后,再打印一行n个*
    f(n-1)
    print(n*'*')

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

推荐阅读更多精彩内容