Python函数闭包装饰器

x=2222
print(x)
def func1():
    x=65842
    def func2():
        x=65412
        print(x)
    func2()
func1()
print(x)
2222
65412
2222

global:调用全局变量

x=8888
def func1():
    def func2():
        global x
        x=10000000
    func2()
func1()
print(x)
10000000

local:调用外部变量

def f1():
    x=1
    def f2():
        nonlocal x
        x=666
        print(x)
    f2()
f1()
666

闭包函数:

1.内部函数

2.包含对外部作用域而非全局作用域的引用

闭包函数特点:

1.自带作用域

2.延迟计算

closure:

name='alex'
def func():
    name='egon'
    x=1000000000000000000000
    def bar():
        print(name)
        print(x)
        a=1
        b=2
    return bar
f=func()
print(f.__closure__[0].cell_contents)
print(f.__closure__[1].cell_contents)
egon
1000000000000000000000

例子:

name='lyp'
def func1():
    name='xiaobai'
    def func2():
        print(name)
    return func2
func1=func1()
func1()
xiaobai

money=8000
def func1():
    money=6000
    def mo_info(name):
        print('%s有%s钱'%(name,money))
    mo_info('xiaobai')
func1()
xiaobai有6000钱

def f0():
    name='henbai'
    def f1():
        money=6666
        def f2():
            print('xiaobai has %s'%(money))
            print(name)
        return f2
    return f1
f0()()()
xiaobai has 6666
henbai

装饰器:任意可调用对象,被装饰的对象也可以任意可调用对象

功能:在不修改被修饰对象源代码以及调用方式的前提下为其添加新功能

原则:

1.不修改源代码

2.不修改调用方法

目标:添加新功能

装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字(将函数作为参数传给装饰器)

执行顺序是自上而下,计算顺序是自下而上

from urllib.request import urlopen
def info(url):
    def pa_pr():
       return urlopen(url).read()
    return pa_pr
pa_pr=info('http://www.baidu.com')
print(pa_pr())

import random
import time
def index():
    time.sleep(random.randrange(1,4))
    print('welcome to the page')
def sp_time(haha):
    def time_d():
        start_time=time.time()
        haha()
        stop_time=time.time()
        print('runtime is %s'%(stop_time-start_time))
    return time_d
index=sp_time(index)
index()
原文地址:https://www.cnblogs.com/c491873412/p/7010568.html