天天看点

Day08-函数(3)

import functools
#偏函数
def demo(a,b,c,d):
    print(a,b,c,d)

# def partital_demo(a,b):
#     demo(a,b,3,4)
# partital_demo(1,2)



#实现偏函数
# #固定前两个
# demo = functools.partial(demo,5,6)
# demo(10,50)

# #固定后两个
# demo=functools.partial(demo,c=3,d=5)
# demo(1,2)

#固定任意参数
demo= functools.partial(demo,b=5,c=6)
demo(a=1,d=1)

# 变量作用域:能够引用变量的代码段就叫做这个变量的作用域
# 1  if while try-except 这些不引入新的作用域
# if 3 > 0:
#     a = 1
# print(a)

# 全局作用域:在所有的函数外定义变量
# 范围:从定义开始,到本文件结束 中间处处可见

a = 3


def demo():
    a = 5
    print("demo", a)
    a = 5  # 局部作用域,局部变量;范围:整个函数体
    print(a)


demo()
print(a)


# 内部函数
def test():
    c = 10  # 闭包作用域 :从定义开始到结束
    # 内部函数
    def inner():  # 作用域是局部作用域
        b = 10
        print("inner", b)

    inner()

inner()  # 不能在外部引用内部函数 报错

test()

# 内建作用域:所有文件可用,系统函数、变量都是内建作用域
print(max(1,2,3))
#
# n内键作用预> 全局作用域>闭包作用域>局部作用域



a = 3
c = 6
def outter():
    a = 1
    b = 3
    print("outter",a,b)
    def inner():
        b = 5
        print("inner",b)
        print("c=",c)
        print("a=",a)
    inner()

# 变量查找规则:从变量引用的地方开始向上找,找离他最近的变量
outter()



# 在函数里无法直接修改全局变量
a = 10
print(id(a))
def test():
    global a  #告诉python解释器,以下引用的是全局变量,并可以修改
    # a+=1
    # print(id(a))
    a = 10
    print(id(a))

    print(a) #6
test()
print(a) #6

def outter():
    c= 10
    def inner():
        nonlocal c #专门用于修改闭包作用域
        c+=1 #不允许直接修改闭包作用域的变量
        print(c)
    inner()
outter()




def outter():#外部函数
    a = 1
    def inner(): #内部函数
        print(a)
    inner()
outter()

#
# def outter():#外部函数
#     a = 1
#     def inner(): #内部函数
#         print("inner",a)
#     return inner
# #得到内部函数地址
# res = outter()
# res() #调用内部函数      
#要增强功能的函数
def eat():
    print("我喜欢吃水果")

#装饰器
# 参数:必须要把增强的函数传进来
def magic(func):
    def inner():
        func() #调用原来的函数
        #增强的功能
        print("我喜欢吃炸鸡")
        print("我喜欢吃山珍海味")
    return inner
eat = magic(eat)
eat()

#装饰器
# 参数:必须要把增强的函数传进来
def magic(func):
    def inner():
        func() #调用原来的函数
        #增强的功能
        print("我喜欢吃炸鸡")
        print("我喜欢吃山珍海味")
    return inner
@magic      #@外部函数 eat = magic(eat)
#要增强功能的函数
def eat():
    print("我喜欢吃水果")
eat()

#装饰器
# 参数:必须要把增强的函数传进来
def magic(func):
    def inner(tmp):
        func(tmp) #调用原来的函数
        #增强的功能
        print("我喜欢吃炸鸡")
        print("我喜欢吃山珍海味")
    return inner
@magic      #@外部函数 eat = magic(eat)
#要增强功能的函数
def eat(food):
    print("我喜欢吃{}".format(food))
eat("臭豆腐")

#装饰器
# 参数:必须要把增强的函数传进来
def check_login(func):
    def inner(password):
        if password == '123':
            func(password)#执行原来功能
        else:
            print("密码错误,重新输入")

    return inner  #外部函数的返回值

@check_login     #@外部函数 forum = check_login(forum)
#要增强功能的函数
def forum(password):
    print("发帖:印度")

@check_login
def comment(password):
    print("韩国人更厉害")

forum('123')