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-zd$@$!%*?&]{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的缓存