第3天学习

迭代器

访问集合元素的一种方式,从对象的第一个元素开始访问,知道所有的元素被访问结束。迭代器只能往前不能后退,迭代器最大的优点是不要求事先准备好整个迭代过程中的所有元素。仅仅在迭代到某个元素时才计算该元素,这个特点特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件。
特点:(1)访问者不需要关心迭代器内部结构,只需要通过next()方法不断去取下一个内容
(2)不能随机访问集合中的某个值,只能从头到尾依次访问。
(3)访问到一半时不能往回退

#生成一个迭代器
user_list = iter(['xiaoming','xiaohong','xiaozhang'])
#获取一个迭代值
user_list.next()

生成器

一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包括yield语法,那这个函数就会变成生成器.

#下面是一个生成器的小例子,你可以往你的个人账户存钱,然后定义取钱,使用生成器最大的好处是函数可以中断,并且下次执行的时候可以从断电处执行
def money(get_money,count):
    while get_money > 0:
        get_money -= count
        yield ('又来取钱了,本次取钱 {0} ,当前账户余额 {1}'.format([count,get_money])
#执行生成器
atm = money(5000,200)
#开始取钱
atm.next()
#过程中中断函数,并在次取钱
print('去吃个饭')
atm.next()
#可以发现在次执行迭代器是从断点处执行的,可以保存函数中断状态。

yield 异步

#这里是有两位顾客到餐厅吃饭的过程
#定义顾客消费
def customer(name):
    print('开始吃饭了')
    while True:
        menu = yield
        print('{} 已经做好了,但是被{}吃完了'.format(menu,name))
#定义餐厅
def restaurant():
    lunch = ['hamburger','pasta','rice','dumplings']
    customer1 = customer('xiao hong')
    customer2 = customer('xiao hong')
    customer1.next()
    customer2.next()
    print('开始做饭了')
    for i in range(len(lunch)):
        customer1.send(lunch[i])
        customer2.send(lunch[i])
#这样在执行餐厅函数的时候,会异步执行消费者函数    

装饰器

example:现在有一个网站之前已经开发好了底层的方法了,现在需要添加一个用户验证功能,但是要求不能修改原来的代码,而且调用方式不变。

def auth(func):#验证方法
    def inner(args):
        print('passwd auth')
        func(args)
    return inner
def func1(name):#原来的方法
    print('name')
def func2(): #原来的方法
    print('func 2')
func1 = auth(func1)#将原来方法的内存地址传入验证方法进行验证,验证通过后返回原来方法
func1(name)#执行原来方法
#这里用断点来调试的话可以看到func1 = auth(func1)实际上func1 的内存地址是inner函数,下一步传递name参数,执行inner会在首先执行验证程序,然后才会执行func1函数
#这里可以使用装饰器
@auth
def func1(name):
    print('name')
func1('xiaohong')
#这里除了验证用户名,又加了密码进行验证,使用动态参数
def auth(func):
    def inner(*args,**kwargs):
        print('passwd auth ')
        func(*args,**kwargs)
    return inner
@auth
def func1(name,password)
    print('{} ,password is {}'.format(name,password))

装饰器本质上也是一个函数,只不过是为其他函数添加扩展功能的函数,下面举一个日常生活中的场景,假设你去吃饭有吃快餐盒吃中餐两种,吃快餐的话直接吃就可以了,吃中餐的话需要买菜,还有刷碗这些步骤,那么这些怎么用装饰器来表达了。

def brushBowl():#刷碗函数
    print('this is brush bowl')
def buyFood():买菜函数
    print('this is buy food')
def meal(type): 
    def main_func(func):
        def inner_func(*args, **kwargs):
            if type == 'china':
                buyFood()
                func(*args,**kwargs)
                brushBowl()
            elif type == 'west':
                func(*args,**kwargs)
        return inner_func
    return main_func
@meal('china')
def china(user):#定义中餐
    print('{} eat china food'.format(user))
@meal('west')
def west(user):#定义西餐
    print('{} eat west food'.format(user))




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值