小白学习python的第十天之函数与函数进阶

一. 函数

1.什么是返回值

"""
返回值就是从函数内部传递到函数外部的数据(默认情况下函数内部产生的新数据,在函数外部不能使用)
"""
def func(a, b):
    c = a+b
    print(c)


func(10, 20)
# print(c)   # 报错

2.怎么确定函数返回值

"""
1)
python中每个函数都有返回值,返回值是什么就看执行函数体的时候遇到的return关键字后面的数据是什么
如果没有遇到return,返回值就是None。
(希望作为返回值的数据在函数结束的时候放在return后面)

2)return的作用
遇到return会确定函数返回值并且直接结束函数
"""

3.怎么在函数外部获取函数返回值

"""
函数调用表达式的值就是函数的返回值,所以在函数的外部获取函数调用表达式的值就是在获取函数的返回值
"""

1)没有返回值的函数

def func1(a, b):
    print(a+b)


result1 = func1(10, 20)
print(f'result1:{result1}')

2)有一个返回值的函数

def func2(a, b):
    return a+b


result2 = func2(100, 200)
print(f'result2:{result2}')

3)有多个返回值的函数

def func3(a, b):
    return a+b, a*b


result3 = func3(11, 22)
print(f'result3:{result3}')   # (33, 242)

re1, re2 = func3(10, 20)
print(f're1:{re1}, re2:{re2}')   # re1:30, re2:200

1.练习:定义一个函数,可以求多个数的和以及平均值

def sum_mean(*num):
    total = sum(num)
    mean = total/len(num)
    if not num:
        return None, None
    return total, mean


result4 = sum_mean(10, 20, 30)
print(f'result4:{result4}')
# *的作用
# 1)打包
a, *b = 1, 2, 3, 4, 5
print(a, b)   # 1 [2, 3, 4, 5]
# 2)解包
c = [10, 20, 30]
print(*c)   # 10 20 30

二. 全局变量和局部变量

1.什么是全局变量和局部变量
按照变量的作用域不同将变量分为全局和局部两种

"""
1)全局变量
*定义在函数和类外面的变量就是全局变量*
作用域:从定义开始到文件结束的任意位置都可以使用
"""
a = 100

for i in range(3):
    print(f'循环内:{a}')   # 循环内:100


def func():
    print(f'函数内部:{a}')


func()   # 循环内:100
# i是全局的
for i in range(3):
    # c是全局
    c = 'hello'
    print(f'循环内部:{i}')

print(f'循环外部:{i}')   # 循环外部:2
print(f'循环外部:{c}')   # 循环外部:hello


def func2():
    print(f'函数内部i:{i}')
    print(f'函数内部c:{c}')


func2()   # 函数内部i:2     函数内部c:hello
"""
2)局部变量
定义在函数内部的变量就是局部变量
作用域:从定义开始到函数结束

补充:函数调用过程内存的变化
每次调用一个函数的时候系统会自动在栈区间开辟一个临时的内存空间,用来保存在函数中产生的数据(定义的变量)
当函数调用结束后这块内存会自动释放(销毁)
"""
# d是局部变量
def func3():
    d = 123
    print(f'函数内部:{d}')   # 函数内部:123


func3()

# print(f'函数外部:{d}')   # NameError: name 'd' is not defined
# 函数的形参也是局部变量
def func4(m, n=100):
    print(m, n)


func4(200)
# print(f'函数外部:{m}')   # NameError: name 'm' is not defined
# print(f'函数外部:{n}')   # NameError: name 'n' is not defined

2.global和nonlocal

"""
1)global
只能在函数体中使用;功能:在函数中定义全局变量
global 变量名
变量名 = 数据

2)nonlocal
功能:在局部的局部中修改一个局部变量的值
nonlocal 变量名
变量名 = 数据
"""
# 全局变量m
m = 100
n = 10


def func5():
    # 在定义一个新的局部变量m
    m = 200
    print(f'函数内部m:{m}')   # 函数内部m:200

    global n
    n = 100   # n是全局变量


func5()
print(f'函数外部m:{m}')   # 函数外部m:100
print(f'函数外部n:{n}')   # 函数外部n:100
# 2)nonlocal
def func6():
    t = 100

    def func7():
        nonlocal t
        t = 200
        print(f'函数中的函数t:{t}')   # 函数中的函数t:200

    func7()
    print(f'函数中的t:{t}')   # 函数中的t:200


func6()

三. 匿名函数

1.匿名函数

"""
匿名函数的本质是函数;在定义的时候不需要函数名(一般情况下不会使用,在调用实参高阶的时候用的比较多)

语法:
函数名 = lambda 形参列表:返回值

相当于:
def 函数名(形参列表):
    return 返回值
"""
# 定义一个函数求两个数的和
sum1 = lambda num1, num2: num1+num2

print(sum1(10, 20))   # 30
print(sum1(num1=2, num2=10))   # 12
# 练习:写一个匿名函数,获取两个数中较大的那个数
max_num = lambda num1, num2: num1 if num1 > num2 else num2
# max_num = lambda num1, num2: max(num1, num2)

print(max_num(100, 20))

四. 实参高阶函数

1.函数就是变量

"""
python中定义函数其实就是在定义一个类型是function的变量,其中函数名就是变量名
普通变量能做的事情函数都可以做
"""

1)函数就是变量

x = lambda x: x*2
print(type(x))   # 

2)变量能做的函数都可以做

x = 100


def func1(n1, n2):
    return n1*n2


# a.变量可以给另外一个变量赋值
y = x
print(y+2)   # 102

z = func1
print(z(10, 20))   # 200

# b.变量可以作为列表元素
list1 = [0, 20, x]
print(list1)   # [0, 20, 100]
print(list1[-1]*2)   # 200

list2 = [10, 20, func1]
print(list2)   # [10, 20, ]
print(list2[-1](4, 5))   # 20

# c.变量可以重新赋值
x = 'abc'
print(x[0])   # a

func1 = 200   # 这时的fun1已经变成了整形200了
print(func1*3)   # 600


# d.变量可以作为函数的参数
def func2(t):
    pass


func2(x)
func2(func1)


def func3(f):
    f()


def func4(f):
    print(f(10, 20)*2)


# func3()
def f(num1, num2):
    return num1+num2


func4(f)

你可能感兴趣的:(python)