01
列表生成
加入我们想要生成一个list,它的内容是从1到8的整数,我们可以用list(range(1:9))来进行生成:
其中range是一个左闭右开的区间,从1开始,到9结束,不包含9本身,在这个基础上,如果我们生成[1*1,2*2,3*3,...8*8],而且不能使用循环的方法,此时我们需要怎么做呢?Python中提供了一种简单的方法来处理这种情况,也就是使用列表生成,如下:
直接在写的时候,就写成一个循环的样子,循环过程中的映射关系写在循环体的前面即可。值得注意的是,这样的写法后面还可以根据我们自己定义的条件进行数字筛选,例如下面这样:
除此之外,可以使用双层循环,从而对循环中的变量进行相应处理:
再来几个例子:
字符拼接类型
大写字母转化为小写:
02
生成器
当我们处理一个包含100个数字的列表的时候,我们可以通过列表生成,采用循环的方式,生成我们想要的list,但是由于计算机的内存是有限制的,一个很大的list必然浪费很多空间,所以如果可以通过某种算法计算出来列表的值,在使用的时候再拿到它的值,就会节省大量的存储空间。
在python中,提供了生成器来实现这种需求,也称之为generator
先来看看如下两个语句:
这两个语句只是最外层的括号不一样,我们可以看到L是一个lsit,g就是我们所说的生成器,那么我们需要怎么查看g的值呢?
可以使用next(g)来获取对应下标的g的值,实际上每次调用next(g)的时候,都是调用生成器里面的算法,但是这种方式不是很方便,可以使用更简洁的方法,也就是搭配for循环来获取g里面的值,能够这样做的前提是generator也是一个可迭代对象:
03
迭代器
目前,我们知道的可迭代对象包含:list,tuple,dict,set,str,generator
这些可以直接使用for进行循环的对象我们称之为可迭代对象:Iterable
我们可以使用isinstance来判断一个对象是否是Iterable对象,如下:
我们可以看到,最后的100是一个数字,显然不是一个可迭代对象。
这里引入生成器的概念,可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。请注意Iterable和Iterator不是相同的概念,前者是可迭代对象,后者是迭代器
我们重新判断上面的那些类型是不是迭代器:
可以看到,list类型、dict类型、str类型,虽然是Iterable,但是不是Iterator
把list、dict、str等Iterable变成Iterator可以使用iter()函数:
为什么list、dict、str等数据类型不是Iterator?
查阅资料,给出如下解释:因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。