python基础--可迭代对象(Iterable)

本文详细探讨了Python中的迭代器、生成器及装饰器的概念与应用,包括可迭代对象、迭代器对象、生成器表达式、生成器函数、装饰器的基本原理和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可迭代对象(Iterable)

表面来看就是可以作用于for循环的对象,实质上Iterable对象要求实现了 _ _ iter_ _ 特殊方法

如果还能通过索引进行访问,要求对象实现了 _ _ getitem _ _ 特殊方法

迭代器(Iterator)

表面来看就是可以被next内置函数调用,并不断返回下一个数据,当没有下一个数据时则抛出StopIteration异常,实质上Iterator对象要求实现了 _ _ next _ _ 和 _ _ iter _ _ 特殊方法

迭代器对象必定是可迭代对象,但可迭代对象不一定是迭代器

str, bytes, tuple, list, dict, set它们是可迭代对象,但并不是迭代器,可以通过调用内置函数iter将它们转换为迭代器

在python3中,如果定义了一个类,类中有 iter(self),next(self)两个函数,则该类具有了迭代器的属性,

具体性质体现在:
    如果该类的对象出现在一个for循环中,那么for循环会自动通过__iter__标志识别这是一个可迭代的类,继而自动调用__next__()函数
示例:
class Fab(object):
    def __init__(self,max,):
        self.max=max
        self.n,self.a,self.b=0,0,1
    def __iter__(self):
        return self
    def __next__(self):
        if self.n < self.max:
            out = self.b
            self.a,self.b=self.b,self.a+self.b
            self.n = self.n+1
            return out
        raise StopIteration()
    
for i in Fab(6):
    print(i)
返回结果:

1
1
2
3
5
8
for语句内部运行原理

首先调用in关键字后面的对象的 _ _ iter _ _ 方法,这个方法必须返回一个Iterator,然后调用该Iterator的next方法并将该方法的返回值赋给for关键字后面的变量,执行一次循环体,重复进行这个操作直到next方法抛出StopIteration异常为止,循环就结束了

生成器(Generator)

惰性计算序列,主要有两种实现方式:

  1. 生成器表达式(Generator Expression),适合构造简单的生成器

  2. 使用yield关键字的函数对象(Generator Function),适合构造复杂的生成器

     ** 例如**:nums1 = [x for x in range(1000) if x % 3 == 0]  # 列表推导式print(type(nums1), len(nums1))
     print(nums1)  这是列表的进阶式 在0~1000的列表中找出能被3整除的数
    

下面只是生成器的表达式,是不是和上面的有些相似呢

nums2 = (x for x in range(1000) if x % 3 == 0)  # 生成器表达式

print(type(nums2))
print(nums2)
print(next(nums2))
print(next(nums2))
print(nums2.__next__())
for i in nums2:
	print(i)

**结果:**
3 6 9 12
15
18
21
24
27
30
33
36
39
42
45
**.......**

生成器必定是迭代器,所以生成器也是可迭代的

列表和元组都是将所有数据准备好存放在内存空间中,当数据量很大时将消耗大量内存空间,并且还不能表示无限数量的数据,而生成器并没有存放所有数据,存放的只是产生数据的算法代码,在我们需要获得一个数据时,它会执行算法代码产生一个数据返回给我们,所以生成器适合表示通过一定算法可以推导出来的大量数据,甚至是无限个数据

装饰器(Decorator)

通常作用就是在不改变函数内部实现的情况下为函数增加一些额外的功能

掌握下面几种情况的装饰器的语法规则:

  1. 被装饰函数无参,无返回值;
  2. 被装饰函数有参,无返回值;
  3. 被装饰函数有参,有返回值;
  4. 装饰器带有参数;
  5. 通用装饰器的写法

例如:

def sunsd(func):
    def inner(n):
        r=func(n) 
        print("%s的累加和为"%n,r)
    return inner
@sunsd
def sum(n):
    s,i=0,0
    while i<=n:
        s+=i
        i+=1
    return s
sum(100)
结果:

100的累加和为 5050


下面再两个例子:

def sunad(funs):
    def innera():
        print("{")
        funs()
        print("}")
    return innera

@sunad
def Hoe():
    print("hello,word")
Hoe()
结果为:

{
hello,word
}

======================可以带参数的装饰器=============================
def sunhub(style):
    def sunhub_innera(funa):
        def innera(n):
            print("<%s>累加为"%style,n)
            r=funa(n)
            print("</%s>结果为"%style,r)
        return innera
    return sunhub_innera

@sunhub("b")
def plus(n):
    w,j=0,0
    while j<=n:
        w+=j
        j+=1
    return w
plus(100)

结果为:

<b>累加为 100
</b>结果为 5050
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值