迭代器
含有iter和next方法 (包含next方法的可迭代对象就是迭代器)
生成器:
包括含有yield这个关键字,生成器也是迭代器,调动next把函数变成迭代器。
应用场景:range/xrange - py2: range(1000000) ,会立即创建,xrange(1000000)生成器 - py3:range(10000000)生成器 - redis获取值conn = Redis(...) def hscan_iter(self, name, match=None, count=None): """ Make an iterator using the HSCAN command so that the client doesn't need to remember the cursor position. ``match`` allows for filtering the keys by pattern ``count`` allows for hint the minimum number of returns """ cursor = '0' while cursor != 0: # 去redis中获取数据:12 # cursor,下一次取的位置 # data:本地获取的12条数数据 cursor, data = self.hscan(name, cursor=cursor,match=match, count=count) for item in data.items(): yield itemstark组件def index(request): data = [ {'k1':1,'name':'alex'}, {'k1':2,'name':'老男孩'}, {'k1':3,'name':'小男孩'}, ] new_data = [] for item in data: item['email'] = "xxx@qq.com" new_data.append(item) return render(request,'xx.html',{'data':new_data})
可迭代对象
一个类内部实现iter方法且返回一个迭代器。
应用场景: - wtforms中对form对象进行循环时候,显示form中包含的所有字段。 class LoginForm(Form): name = simple.StringField( label='用户名', validators=[ validators.DataRequired(message='用户名不能为空.'), validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d') ], widget=widgets.TextInput(), render_kw={'class': 'form-control'} ) pwd = simple.PasswordField( label='密码', validators=[ validators.DataRequired(message='密码不能为空.'), validators.Length(min=8, message='用户名长度必须大于%(min)d'), validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[$@$!%*?&])[A-Za-zd$@$!%*?&]{8,}", message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符') ], widget=widgets.PasswordInput(), render_kw={'class': 'form-control'} ) form = LoginForm() for item in form: print(item) - 列表、字典、元组
装饰器
装饰器:能够在不修改原函数代码的基础上,在执行前后进行定制操作,闭包函数的一种应用场景: - flask路由系统 - flask before_request - csrf - django内置认证 - django缓存# 手写装饰器;import functoolsdef wrapper(func): @functools.wraps(func) #不改变原函数属性 def inner(*args, **kwargs): 执行函数前 return func(*args, **kwargs) 执行函数后 return inner1. 执行wapper函数,并将被装饰的函数当做参数。 wapper(index)2. 将第一步的返回值,重新赋值给 新index = wapper(老index)@wrapper #index=wrapper(index)def index(x): return x+100
调用装饰器其实是一个闭包函数,为其他函数添加附加功能,不修改被修改的源代码和不修改被修饰的方式,装饰器的返回值也是一个函数对象。比如:插入日志、性能测试、事物处理、缓存、权限验证等,有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。



