函数对象、函数嵌套、名称空间与作用域

#函数是第一类对象的含义是函数可以被当作数据处理#

def func(): #func=<function func at 0x0584BA50>
    print('from func')

# print(func)

x='hello'
1、引用
y=x
f=func
print(f)
f()

2、当作参数传给一个函数
len(x)
def foo(m):
    # print(m)
    m()

foo(func)

3、可以当作函数的返回值
def foo(x): #x=func
    return x  #return func

res=foo(func)
print(res)
res()

4、可以当作容器类型的元素
l=[x,]

l=[func,]
# print(l)

l[0]()

def pay():
    print('支付。。。')
def withdraw():
    print('取款。。。')

def transfer():
    print('转账。。。')

def check_balance():
    print('查看余额。。。')

def shopping():
    print('购物。。。')

func_dic={
    '1':pay,
    '2':withdraw,
    '3':transfer,
    '4':check_balance,
    '6':shopping
}

while True:
    msg="""
    1 支付
    2 取款
    3 转账
    4 查看余额
    5 退出
    6 购物
    """
    print(msg)
    choice=input('>>: ').strip()
    if choice == '5':break
    if choice not in func_dic:
        print('输入的指令不存在傻叉')
        continue

    func_dic[choice]()


#函数的嵌套定义#
def f1():
    def f2():
        print('from f2')
    f2()
f1()

from math import pi
def circle(radius,action='area'): #radius=10
    def area():
        return pi * (radius ** 2)
    def perimeter():
        return 2 * pi * radius
    if action == 'area':
        return area()
    elif action == 'perimeter':
        return perimeter()
print(circle(10))
print(circle(10,action='perimeter'))

函数的嵌套调用
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))


1、 名称空间 namespaces
    存放名字和值绑定关系的地方


2、名称空间分为三大类
    内置名称空间:
        作用:存放python解释器自带的名字
        生命周期:
            在解释器启动时生效,在解释器关闭时失效

    全局名称空间:
        作用:除了内置的与局部的名字外,其余都是全局名字
        生命周期:
            在文件执行时生效,在文件执行完毕时失效

        例如:x,func,y,l,z都是全局名字(顶格写的,或者能立马执行)
            x=1(顶格)
            def func():
                a=1    (函数调用时才生效,局部内存空间)

            y=2
            l=[1,2]

            if 3 > 2:
                if
                    if
                        if
                            z=3
    局部名称空间:
        作用:用于存放函数调用期间函数体产生的名字
        生命周期:
            在文件执行过程
            如果调用了某个函数才会临时生效,在函数执行完毕后失效

    三种名称空间的加载顺序是:
        内置-》全局-》局部

    名称空间就是用来存放名字与值的绑定关系的,所以但凡要查找名字
    一定是从三者之一找到,查找顺序:
        从当前所在的位置倒着查找,如果当前所在的位置是局部名称空间,
        则查找顺序是:
            局部-》全局-》内置


3、作用域:

    域指的是区域、范围,作用域即作用的范围

    全局作用范围,全局作用域(内置名称空间与全局名称空间)
        全局有效,全局存活
    局部作用范围,局部作用域(局部名称空间)
        局部有效,临时存活

x=1
# len=100
def func():
    y=2
    len=1000
    # print(len)
    print(a)
# func()


print(len)




def func():
    y=2
    print(x)


x=1
func()


x=10


x=1
def f1():
    def f2():
        def f3():
            zzz=333
            print(x)
        # x = 22222
        f3()
    # x=111111
    f2()


def bar():
    print(x)


f1()
bar()

作用域关系是在函数定义阶段就固定死了,但凡调用函数都需要跑到定义阶段去找作用域关系
x=1
def f1():
    print(x)

# f1()
x=100000
def f2():
    # print(f1)
    x=111
    f1()

f2()

函数对象+作用域:******
def f1():
    x=1
    def inner():
        print('from inner',x)
    return inner

f=f1()

# print(f)

def bar():
    x=111
    f()

bar()

x=1
def foo():
    global x
    x=2

foo()
print(x)

x=1
def f1():
    def f2():
        x=22222222
        def f3():
            global x
            x=111
        f3()
    f2()


f1()
print(x)

x=1
def f1():
    # x=33333
    def f2():
        # x=222
        def f3():
            nonlocal x             #nonlocal只要不出函数就一层一层网上找,但不能到达全局的x=1
            x=2000
        f3()
        print(x)
    f2()

f1()
print(x)


在局部如果想要修改全局的可变类型,不需要借助任何声明,可以直接修改
在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量就可以直接修改了
x=[]
def f1():
    x.append(1)
f1()
f1()
print(x)











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值