Python入门学习 DAY 10 函数对象

 

Python入门     

DAY 10

函数对象

函数是第一类对象: 指的是函数名指向的值(函数)可以被当作数据去使用

def func(): # func=函数的内存地址
    print('from func')
print(func)

1. 可以被引用

f=func
print(f)
f()

2. 可以当作参数传给另外一个函数

def bar(x):
    print(x)
bar(age)
bar(func)

3. 可以当作一个函数的返回值

def bar(x):
    return x

res=bar(age)
print(res)

res=bar(func)
print(res)

4. 可以当作容器类型的元素

l=[age,func,func()]
print(l)

函数嵌套

一:函数的嵌套调用:在调用一个函数过程中,其内部代码又调用了其他函数

def bar():
    print('from bar')

def foo():
    print('from foo')
    bar()

foo()
def max2(x,y):
    if x > y:
        return x
    else:
        return y

def max4(a,b,c,d):
    res1=max2(a,b)
    res2=max2(res1,c)
    res3=max2(res2,d)
    return res3

print(max4(1,2,3,4))

二:函数的嵌套定义:一个函数内部又定义了另外一个函数

def outter():
    x=1
    print('from outter')
    def inner():
        print('from inner')
    inner()

outter()

def f1():
    print('from f1')
    def f2():
        print('from f2')
        def f3():
            print('from f3')
        f3()
    f2()

f1()

名称空间与作用域

1 什么是名称空间namespace
    名称空间就是用来存放名字与值内存地址绑定关系的地方(内存空间)

    age=18
    但凡查找值一定要通过名字,访问名字必需去查找名称空间


2 名称空间分为三大类
    内置名称空间:存放的是python解释器自带的名字
                例如:
                    len
                    max
                    print

    全局名称空间:存放的是文件级别的名字
            例如:以下名字中x\y\z\b\foo都会存放于全局名称空间中
            x=1
            y=2
            if x == 1:
                z=3

            while True:
                b=4
                break

            def foo():
                m=3

    局部名称空间:在函数内定义的名字
            例如:
                foo内的m这个名字一定是存放于一个局部名称空间中
    生命周期:
        内置名称空间:在解释器启动时则生效,解释器关闭则失效
        全局名称空间:在解释器解释执行python文件时则生效,文件执行完毕后则失效
        局部名称空间:只在调用函数时临时产生该函数的局部名称空间,改函数调用完毕则失效

    加载顺序:
        内置->全局->局部

    查找名字的顺序:
        基于当前所在位置往上查找
            假设当前站在局部,查找顺序:局部->全局->内置
            假设当前站在全局,查找顺序:全局->内置

闭包函数

1 什么是闭包函数
    闭:指的是闭包函数是定义在一个函数内部的函数
    包:该内部函数包含对外层函数作用域名字的引用

需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数的层级限制
    def outter():
        x=111
        def inner():
            print(x)
        return inner

    f=outter() #f=outter内的inner

    # x=22222
    # f()
    def func():
        x=3333
        f()

    func()
2 为何要用闭包函数
    闭包函数提供了一种为函数体传值的解决方案

3 如何用闭包函数

为函数体传值的方式一:参数
def func(x,y):
    print(x+y)

func(1,2)

为函数体传值的方式二:闭包
def outter(x,y):
    # x=1
    # y=2
    def func():
        print(x+y)
    return func

f=outter(1,2)
f()

pip3 install requests

以上为本次学习内容


 

你可能感兴趣的:(Python入门学习 DAY 10 函数对象)