第3天学习

    xiaoxiao2021-03-25  177

    迭代器

    访问集合元素的一种方式,从对象的第一个元素开始访问,知道所有的元素被访问结束。迭代器只能往前不能后退,迭代器最大的优点是不要求事先准备好整个迭代过程中的所有元素。仅仅在迭代到某个元素时才计算该元素,这个特点特别适合用于遍历一些巨大的或是无限的集合,比如几个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))
    转载请注明原文地址: https://ju.6miu.com/read-2719.html

    最新回复(0)