python之列表生成式、生成器、可迭代对象及迭代器详解

列表生成式

所谓的列表生成式,顾名思义,就是说可以生成list列表的表达式,是Python内置的非常简单却强大的可以用来创建list的生成式

基本的一个语法如下:

[变量表达式 for 变量 in 表达式 if 判断条件]

本质就是将for循环强制性写在一行,把结果写在for循环的最前面,然后使用[]括起来,
得到的就是一个由结果集组成的一个列表

案例1:实现list1 = [1,4,9,16,25,…,100]

list1 = [x*x for x in range(1,11)]
print(list1)
#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

案例2:在案例1的基础上去除3的倍数

list1 = [x*x for x in range(1,11) if x%3 != 0]
print(list1)
#[1, 4, 16, 25, 49, 64, 100]

当然也可以使用两层循环,如下:

list1 = [m+n for m in 'ABC' for n in 'XYZ']
print(list1)
#['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
生成器

通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,如果我们仅仅需要访问前面几个元素,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?

这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)

生成器就是一个能返回迭代器的函数,其实就是定义一个迭代算法,可以理解为一个特殊的迭代器

要创建一个generator,方法非常简单,只要把一个列表生成式的[]改成(),就创建了一个generator,基本语法如下:

g1 = (result for x in range(m,n))

注意:生成器只能迭代一遍

g1 = (x for x in range(10))
print(next(g1))
for x in g1:
    print(x,end="\t")

运行如下:

0
1	2	3	4	5	6	7	8	9	
可迭代对象
  1. 能直接作用于for循环的对象我们统称为可迭代对象(Iterator)
  2. 我们可以使用isintance()判断一个对象是否是Iterator对象
  3. 常见的可迭代对象:
    1. list、set,dict,tuple,str,range
    2. 生成器

注意:使用Iterator判断的时候需要导入Iterable的包

from collections import Iterable

print(isinstance([],Iterable))      #True
print(isinstance((),Iterable))      #True
print(isinstance({},Iterable))      #True
print(isinstance("",Iterable))      #True
print(isinstance((x for x in range(10)),Iterable))  #True
print(isinstance(1,Iterable))       #False
迭代器
概述

不但能够作用于for循环,还可以被next函数调用,不断返回下一个值,直到最后出现StopIteration错误,表示无法返回下一个值,这样的对象我们就称之为迭代器(Iterator对象)

常见的只有生成器是迭代器,其他类型的都不是

from collections import Iterator

print(isinstance([],Iterator))
print(isinstance("",Iterator))
print(isinstance({},Iterator))
print(isinstance((),Iterator))
print(isinstance(range(10),Iterator))
print(isinstance((x for x in range(10)),Iterator))

运行结果如下:

False
False
False
False
False
True

迭代器与可迭代对象的关系:迭代器一定是可迭代对象,可迭代对象不一定是迭代器

Iterator转换

可以通过iter()函数将可迭代对象转为迭代器

from collections import Iterator

print(isinstance(iter([]), Iterator))
print(isinstance(iter(()), Iterator))
print(isinstance(iter({}), Iterator))
print(isinstance(iter(''), Iterator))

iter1 = iter([1,2,3])
print(type(iter1))
print(next(iter1))

运行结果如下:

True
True
True
True
<class 'list_iterator'>
1

猜你喜欢

转载自blog.csdn.net/TaoismHuang/article/details/93340379