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	

例:自定义一个生成器函数,实现斐波那契数列

def fab(n):
    pre, curr, count = 0, 1, 1
    while count <= n:
        yield curr
        pre, curr = curr, pre + curr
        count += 1
可迭代对象
  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

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

例:使用迭代器实现python原生range的功能

class Range:
    def __init__(self, start, stop=None, step=1):
        if stop is None:
            self.start = 0
            self.stop = start
        else:
            self.start = start
            self.stop = stop
        self.step = step
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.start < self.stop:
            current = self.start
            self.start += self.step
            return current
        else:
            raise StopIteration()

例:自定义一个迭代器,实现斐波那契数列

class Fab:
    def __init__(self, n):
        self.prev = 0
        self.curr = 1
        self.count = 1
        self.n = n
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.count <= self.n:
            temp = self.curr
            self.pre, self.curr = self.curr, self.pre + self.curr
            self.count += 1
            return temp
        else:
            raise StopIteration()
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值