1.列表生成式(List Comprehensions)
列表生成式,是python内置的用来创建list的生成式。
创建最简单的有从1-n的列表使用list(range(1,n+1)),这是最简单的生成式;
较为复杂的通常使用一个特定的公式:例:
[s.lower() for s in L if isinstance(s,str)]
该公式分为三部分,用‘[]’包裹
第一部分‘s.lower()’,代表输出列表中每个元素的值(通过一个简单的函数计算获取);
第二部分‘for s in L’,代表如何获取第一部分函数中参数
第三部分‘if isinstance(s,str)’,代表如何对获取的参数进一步筛选
注意:即使第一部分为参数本身也不可省略;
注意:当第一部分参数较多时(一般两个),可用两个‘for...in ’分别获取。
2.生成器(generator)
生成器是我们通过循环不断推算获得元素的一种方式(可理解为一种数据类型);
生成器是通过next(g)获取名为g的generator的每一个元素,一次仅能获取一个;
因此往往直接通过for循环的方式来迭代。
生成器的创建有两种方式:
第一种,与创建生成式列表的方法相同,仅仅将包裹的‘[]’变成‘()’即可;
直接打印生成器仅能得到这个对象,而不是其中的值,获取值仍要用next(g)或for循环。
第二种,当推算的方式较复杂时,要使用定义函数的方式来创建;
定义generator是使用yield(翻译:生成)语句来返回每一个生成器元素;
要获取生成器中的值,仍要使用next(g)或for循环。
注意:虽然生成器采用for循环获取其中的元素值,但实质还是next()方式的循环。
3.迭代器(iterator)
可使用for循环的对象都是Iterable(迭代)类型;(注释:首字母I为i的大写)
而其中,是使用next()方式获取元素的值的对象,都是Iterator(迭代器)类型;
判断是否为迭代器类型的方法,与判断是否是迭代类型的方法类似;
可以通过collections模块的Iterator类型来判断:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
将类型为迭代的数据转为类型为迭代器的,可以通过iter()函数来实现。
注意:next()获取值的方式是惰性方式,即每次获取一个元素值。