python装饰器,生成器,迭代器

本文介绍了Python中的装饰器和协程概念,通过示例展示了如何使用装饰器实现功能增强,如计时器功能,并探讨了带参数的装饰器。同时,还讲解了协程的生成器和迭代器,以及它们在并发执行中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python装饰器

装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
强调装饰器的原则:1 不修改被装饰对象的源代码
2 不修改被装饰对象的调用方式
装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

函数即变量
高阶函数
嵌套函数

http://www.cnblogs.com/wupeiqi/articles/4980620.html 
 
import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
        return res
    return wrapper

@timmer
def foo():
    time.sleep(3)
    print('from foo')
foo()

生成器

import time
def consumer(name):
    print('%s 准备吃包子' %name)
    while True:
        baozi = yield

        print('包子[%s]来了,被[%s]吃了!' %(baozi,name))
# c = consumer('邵延行')
# c.__next__()
# b1 = '豆沙'
# c.send(b1)

def producer(name):  # 协程
    c = consumer('a')
    c2 = consumer('b')
    c.__next__()
    c2.__next__()
    print('我要开始做包子了')
    for i in range(10):
        time.sleep(1)
        print('做包子分两半')
        c.send(i)
        c2.send(i)
producer('syh')

迭代器

from collections import Iterator
isinstance([],Iterable) # 是否可迭代对象

# 可以用iner()函数

在这里插入图片描述

装饰器(1)

#_*_coding:utf-8_*_


user_status = False #用户登录了就把这个改成True

def login(auth_type): #把要执行的模块从这里传进来
    def auth(func):
        def inner(*args,**kwargs):#再定义一层函数
            if auth_type == "qq":
                _username = "alex" #假装这是DB里存的用户信息
                _password = "abc!23" #假装这是DB里存的用户信息
                global user_status

                if user_status == False:
                    username = input("user:")
                    password = input("pasword:")

                    if username == _username and password == _password:
                        print("welcome login....")
                        user_status = True
                    else:
                        print("wrong username or password!")

                if user_status == True:
                    return func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能
            else:
                print("only support qq ")
        return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数

    return auth

def home():
    print("---首页----")

@login('qq')
def america():
    #login() #执行前加上验证
    print("----欧美专区----")

def japan():
    print("----日韩专区----")

@login('weibo')
def henan(style):
    '''
    :param style: 喜欢看什么类型的,就传进来
    :return:
    '''
    #login() #执行前加上验证
    print("----河南专区----")

home()
# america = login(america) #你在这里相当于把america这个函数替换了
#henan = login(henan)

# #那用户调用时依然写
america()

# henan("3p")

带参数的装饰器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值