访问集合元素的一种方式,从对象的第一个元素开始访问,知道所有的元素被访问结束。迭代器只能往前不能后退,迭代器最大的优点是不要求事先准备好整个迭代过程中的所有元素。仅仅在迭代到某个元素时才计算该元素,这个特点特别适合用于遍历一些巨大的或是无限的集合,比如几个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() #可以发现在次执行迭代器是从断点处执行的,可以保存函数中断状态。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))