进入python shell
>>> x = [1, 2, 3]
>>> y = [i*2 for i in x]
>>> y
[2, 4, 6]
>>> type(y)
<type 'list'>
这样得到的y是list类型
>>> y= (i*2 for i in x)
>>> y
<generator object <genexpr> at 0xb74ee89c>
>>> type(y)
<type 'generator'>
将中括号用圆括号去替代后,y变成生成器对象,延迟加载了,只是声明出表达式而没有做真正的运算
我们真正需要它做一些事的时候可以强制转化成真正的list
>>> list(y)
[2, 4, 6]
这样就变成真正的list
同理在数据库操作的时候
如在django中操作一个model对象
question_list = Question.objects.all()
这个语句并没有执行数据库的查询,也就是说没有执行sql语句
当我们去遍历它的时候
for question in question_list:
...
...
pass
才会真正执行sql去查询,由于我们遍历的时候可能还会进行一些处理和其他操作
所以可能会发好几条sql给数据库
这时候如果数据量不是很巨大
可以这样:
question_list = list(Question.objects.all())
强制转化成了真正的包含数据的list,sql语句只被执行一次
再进行遍历就相当于从缓存中读取数据