函数闭包,装饰器,迭代器

函数闭包

闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量引用),闭包指的是:函数内部函数对外部作用域而非全局作用域的引用

import requests

def func(url):
    def get_res():
        res=requests.get(url)
        res.encoding='utf8'
        print(res.text)
    return get_res
# baidu=func('https://www.baidu.com')
# baidu()
taobao=func('https://www.taobao.com/')
taobao()
两种为函数传参的参数

1、使用参数的形式

def func(x):
    print(x)
func(1)
func(1)
func(1)
#1
#1
#1

2、包给函数

def outter(x):
    x=1
    def inner():
        print(x)
    return inner
f=outter(1)
f()
f()
f()
#1
#1
#1

装饰器

器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰对象添加额外功能,因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能

需要注意

装饰器本身其实是可以任意调用的对象

被装饰的对象也可以是任意可调用的对象

装饰器的实现必须遵循两大原则

不修改被装饰对象的源代码

不修改被装饰对象的调用方式

import time
def index():
    print('hello, world')
    # return index  ##再次返回调用一次
# index()

def dice(func):   ##装饰器

    def f1():     ##装饰的功能
        star=time.time()
        func()
        time.sleep(1)
        end=time.time()
        print(end-star)
    return f1
index=dice(index)
index()
#加强版
import time
def index(x,a=1):
    print('x',x)
    print('a',a)
    print('hello wrold')
    return 123

def deco(func):
    def f1(*args,**kwargs):
        print('args:',args)
        print('kwargs:',kwargs)
        start=time.time()
        res=func(*args,**kwargs)
        end=time.time()
        return res
    return f1

index=deco(index)
res=index(10)
print(res)
##装饰器模板
def login(func):
    def inner(*args,**kwargs):
        user=input('输入用户名')
        pwd=input('输入密码')
        if user=='lzs'and pwd=='1234':
            print('登陆成功')
            res = func(*args, **kwargs)
            return res
        else:
            print('登陆失败')

    return inner

@login
def shopping():
    print('欢迎购物')
shopping()
##三层装饰器:给双层装饰器加参数
def auth(engine):
    def login(func):
        def inner(*args, **kwargs):
            if engine == 'flie':
                user = input('输入用户名')
                pwd = input('密码')
                if user == 'lzs' and pwd == '1234':
                    print('登陆成功')
                    res = func(*args, **kwargs)
                    return res
                else:
                    print('登陆失败')
            elif engine == 'db':
                print('账号来自数据库')
        return inner

    return login

@auth('flie')
def shopping():
    print('shopping')
    # login=auth('flie')
    # shopping=login(shopping)
shopping()

猜你喜欢

转载自www.cnblogs.com/lzss/p/11401990.html