面试题
a. 为什么要学python? - 亲朋/学长 建议 - 了解: - 简单易学 - 生态圈比较强大 - 发展趋势:人工智能、数据分析 b. 谈谈你对Python和其他语言的区别? - 解释型 - python/php - 编译型 - c/java/c# - Python弱类型 c. 数据类型: - 字符串 - 字典 - 元组 - 列表 - 集合 - collections d. 函数 - 函数参数传递的是什么? - def func(a,b=[]):pass - lambda 表达式 - 列表生成式 [] - 生成器表达式 (for i in range(1)) - 题: val = [lambda :i+1 for i in range(10)] val[0] data = val[0]() print(data) - 常见内置函数: - map - reduce - filter - zip - instance - type - - 生成器、迭代器、装饰器、可迭代对象 - 迭代器,内部实现__next__方法,帮助我们向后一个一个取值。 - 生成器,一个函数内部存在yield关键字;v = 函数()。 应用场景: - range/xrange - py2: range(100000000),立即创建;xrange(100000000)生成器; - py3: range(100000000)生成器; - 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 item - stark组件 xx.html: {% for item in data %} <p>{{item.k1}} {{item.name}}</p> {%endfor%} views.py 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}) # ################################################################## xx.html: {% for item in data %} <p>{{item.k1}} {{item.name}}</p> {%endfor%} views.py def gen_data(data): for item in data: item['email'] = "xxx@qq.com" yield item def index(request): data = [ {'k1':1,'name':'alex'}, {'k1':2,'name':'老男孩'}, {'k1':3,'name':'小男孩'}, ] new_data = gen_data(data) return render(request,'xx.html',{'data':new_data}) - 可迭代对象,一个类内部实现__iter__方法且返回一个迭代器。 class Foo(object): def __iter__(self): return iter([11,22,33]) obj = Foo() 应用场景: - 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-z\d$@$!%*?&]{8,}", message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符') ], widget=widgets.PasswordInput(), render_kw={'class': 'form-control'} ) form = LoginForm() for item in form: print(item) - 列表、字典、元组 总结:如果想要让一个对象可以被for循环,那么就需要在当前类中定义__iter__ - 装饰器,在不改变原函数代码的基础上,在执行前后进行定制操作。 - 手写 - 应用场景: - flask路由系统 - flask before_request - csrf - django内置认证 - django的缓存
a. wtforms作用? b. wtforms涉及到的知识点?哪里用了? - metaclass - 封装:UnboundField - __new__ - __mro__ - setattr - type(...) c. ORM和原生SQL比较? d. 你用过的ORM框架有哪些? e. SQLAlchemy - 数据库连接池 - 原生SQL - ORM - 表操作 - 默认值 - 索引(联合索引,想要命中必须遵循“最左前缀”的规则) - sqlalchemy中设置表: - 引擎 - 编码 - 记录操作 - 增删改查